wikimedia/request-timeout

Excimer 的请求超时库,带有纯PHP回退

1.2.0 2022-02-02 10:39 UTC

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致命错误。

在回退模式下,关键部分不可用。