wikimedia / request-timeout
Excimer 的请求超时库,带有纯PHP回退
1.2.0
2022-02-02 10:39 UTC
Requires
- php: >=7.2
- wikimedia/normalized-exception: 1.0.1
Requires (Dev)
- mediawiki/mediawiki-codesniffer: 38.0.0
- mediawiki/mediawiki-phan-config: 0.11.1
- mediawiki/minus-x: 1.1.1
- ockcyp/covers-validator: 1.3.3
- php-parallel-lint/php-console-highlighter: 0.5.0
- php-parallel-lint/php-parallel-lint: 1.3.1
- phpunit/phpunit: ^8.5
This package is auto-updated.
Last update: 2024-09-18 20:59:30 UTC
README
Excimer 是一个PHP扩展,提供灵活的用户空间定时器。
这个库提供了一个全局请求超时概念,理想情况下使用Excimer,但在Excimer不可用时回退到set_time_limit()。
典型用法
use Wikimedia\RequestTimeout\RequestTimeout;
RequestTimeout::singleton()->setWallTimeLimit( 20 );
这设置了一个20秒的墙钟时间计时器。当它过期时,将抛出TimeoutException。
可以查询剩余时间
if ( RequestTimeout::singleton()->getWallTimeRemaining() > 5 ) {
do_slow_thing();
} else {
do_fast_thing();
}
这适用于回退模式。
该库提供了一个关键部分概念。如果关键部分处于活动状态,超时将被排队,而不是立即抛出。一旦没有打开任何关键部分,将抛出超时异常。
$csp = RequestTimeout::singleton()->createCriticalSectionProvider( 5 );
$csp->enter( __METHOD__ );
try {
do_something();
} finally {
$csp->exit( __METHOD__ );
}
始终退出关键部分是很重要的。如果关键部分中的代码可以抛出错误,可以使用try/finally来确保关键部分被退出。或者我们提供了一个作用域变量模型
function foo() {
$scope = $csp->scopedEnter( __METHOD__ );
do_something();
}
当作用域对象被销毁时,关键部分退出。然而,使用这种方法时,在关键部分中不要终止请求,例如通过调用exit()
,或者函数返回后保持作用域对象在全局变量中。在请求关闭期间,库可能会从析构函数中抛出异常,这会导致PHP致命错误。
在回退模式下,关键部分不可用。