Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
RequestTimeout
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 4
42
0.00% covered (danger)
0.00%
0 / 1
 singleton
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 setInstance
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 factory
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 createCriticalSectionProvider
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 enterCriticalSection
n/a
0 / 0
n/a
0 / 0
0
 exitCriticalSection
n/a
0 / 0
n/a
0 / 0
0
 setWallTimeLimit
n/a
0 / 0
n/a
0 / 0
0
 getWallTimeRemaining
n/a
0 / 0
n/a
0 / 0
0
 getWallTimeLimit
n/a
0 / 0
n/a
0 / 0
0
1<?php
2
3namespace Wikimedia\RequestTimeout;
4
5use Wikimedia\RequestTimeout\Detail\BasicRequestTimeout;
6use Wikimedia\RequestTimeout\Detail\ExcimerRequestTimeout;
7
8abstract class RequestTimeout {
9    /** @var RequestTimeout|null The singleton instance */
10    private static $instance;
11
12    /**
13     * Get a singleton instance of RequestTimeout. If the Excimer extension is
14     * loaded, this will return a fully functional implementation. If it is
15     * not loaded, a fallback implementation will be returned.
16     *
17     * @return RequestTimeout
18     */
19    public static function singleton() {
20        if ( !self::$instance ) {
21            self::$instance = self::factory();
22        }
23        return self::$instance;
24    }
25
26    /**
27     * Set the instance to be returned by singleton(), or null to clear the
28     * instance so that it will be recreated.
29     *
30     * @param RequestTimeout|null $instance
31     */
32    public static function setInstance( ?RequestTimeout $instance ) {
33        self::$instance = $instance;
34    }
35
36    /**
37     * Create a new instance of RequestTimeout. If the Excimer extension is
38     * loaded, this will return a fully functional implementation. If it is
39     * not loaded, a fallback implementation will be returned.
40     *
41     * @return RequestTimeout
42     */
43    public static function factory() {
44        if ( extension_loaded( 'excimer' ) ) {
45            return new ExcimerRequestTimeout;
46        } else {
47            return new BasicRequestTimeout;
48        }
49    }
50
51    /**
52     * Create a CriticalSectionProvider with the specified configuration.
53     *
54     * @param float $emergencyLimit The emergency timeout in seconds
55     * @param callable|null $emergencyCallback A callback to call when the
56     *   emergency timeout expires. If null, an exception will be thrown.
57     * @param callable|null $implicitExitCallback A callback to call if a
58     *   critical section scope is exited implicitly, rather than by calling
59     *   exit().
60     * @return CriticalSectionProvider
61     */
62    public function createCriticalSectionProvider(
63        $emergencyLimit, $emergencyCallback = null, $implicitExitCallback = null
64    ) {
65        return new CriticalSectionProvider( $this, $emergencyLimit,
66            $emergencyCallback, $implicitExitCallback );
67    }
68
69    /**
70     * @internal For use by CriticalSectionProvider
71     *
72     * @param string $name
73     * @param float $emergencyLimit
74     * @param callable|null $emergencyCallback
75     * @return int
76     */
77    abstract public function enterCriticalSection( $name, $emergencyLimit, $emergencyCallback );
78
79    /**
80     * @internal For use by CriticalSectionProvider
81     *
82     * @throws TimeoutException
83     * @param int $id
84     */
85    abstract public function exitCriticalSection( $id );
86
87    /**
88     * Set the wall time limit. If excimer is available, an exception will be
89     * thrown after the specified number of seconds.
90     *
91     * If excimer is not available, this falls back to set_time_limit(), which
92     * causes a fatal error after the CPU time (not wall clock time) exceeds
93     * the given number of seconds, which is rounded to an integer.
94     *
95     * A time limit of INF or 0 is interpreted as no limit.
96     *
97     * @param float $limit The limit in seconds
98     */
99    abstract public function setWallTimeLimit( $limit );
100
101    /**
102     * Get the amount of time remaining of the limit. If there is no limit, INF
103     * will be returned.
104     *
105     * @return float
106     */
107    abstract public function getWallTimeRemaining();
108
109    /**
110     * Get the current wall time limit, or INF if there is no limit
111     *
112     * @return float
113     */
114    abstract public function getWallTimeLimit();
115}