函數級控制PHP函數的執行時間,超時終止執行,支持毫秒級配置,在call_user_func()基礎上加了超時控制機制。
源碼:https://github.com/pangudashu/timeout
環境&依賴
- OS: linux
- Version: PHP 7.0.0及以上
- SAPI: php-fpm or cli
特性
- 通用:函數級控制超時
- 支持毫秒級配置
函數
int call_func_with_timeout(mixed callable, int interval [, array args [, mixed retval]]
Parames:
$callable array|string 調用函數名稱,普通function傳函數名,類方法傳數組:array(class|object, method)
$interval int 超時時間,單位:ms
$args array (可選)調用函數的參數數組
$retval mixed (可選)調用函數的返回值,此值以引用傳入
Return:
TT_CALL_FUNCTION_SUCC: 執行成功(未超時)
TT_CALL_FUNCTION_TIMEOUT: 執行超時
TT_SET_FUNCTION_CALL_INFO_ERROR: 調用函數不合法(如:類或者對象不存在)
TT_FUNCTION_CALL_FAILURE: 調用失敗(如:方法不存在、調用私有方法等)
TT_SET_SIGNAL_ERROR: 設置signal handler錯誤(系統不支持此擴展)
TT_SET_TIMER_ERROR: 同上
安裝
git clone [email protected]:pangudashu/timeout.git
cd timeout
phpize
./configure
make && make install
add "extension=timeout.so" to php.ini
Demo
<?php
class sync {
public function send($a,$b,$c,$d){
sleep(2);
print_r(get_defined_vars());
return 1024;
}
}
$sync_send_ret = null;
$r = call_func_with_timeout(array("sync", "send"), 1200, array(1,2,3,4), $sync_send_ret);
echo "sync::send() return value:" . $sync_send_ret . "\n";
switch($r)
{
case TT_CALL_FUNCTION_SUCC:
echo 'call function success';
break;
case TT_SET_FUNCTION_CALL_INFO_ERROR:
echo 'set function call info error';
break;
case TT_FUNCTION_CALL_FAILURE:
echo 'call function failure';
break;
case TT_SET_SIGNAL_ERROR:
echo 'set signal handler error';
break;
case TT_SET_TIMER_ERROR:
echo 'set timer error';
break;
case TT_CALL_FUNCTION_TIMEOUT:
echo 'call function timeout';
break;
}
?>
執行結果:
sync::send() return value:
call function timeout
如果將sleep(2)註釋掉則輸出:
Array
(
[a] => 1
[b] => 2
[c] => 3
[d] => 4
)
sync::send() return value:1024
call function success