PHP为系统调用的脚本设置超时,set_time_limit不起作用
发布时间:2020-12-13 22:12:30 所属栏目:PHP教程 来源:网络整理
导读:我有一个命令行 PHP脚本,使用foreach使用数组的每个成员运行wget请求.这个wget请求有时可能需要很长时间,因此我希望能够设置超时以杀死脚本(例如,如果超过15秒).我已禁用PHP安全模式并在脚本的早期尝试了set_time_limit(15),但它会无限期地继续.更新:感谢Do
|
我有一个命令行
PHP脚本,使用foreach使用数组的每个成员运行wget请求.这个wget请求有时可能需要很长时间,因此我希望能够设置超时以杀死脚本(例如,如果超过15秒).我已禁用PHP安全模式并在脚本的早期尝试了set_time_limit(15),但它会无限期地继续.更新:感谢Dor指出这是因为set_time_limit()不尊重system()调用.
所以我试图在执行15秒后找到其他方法来杀死脚本.但是,我不确定是否可以检查脚本在同时处于wget请求中间时运行的时间(while循环不起作用).也许用一个定时器分叉一个进程并设置它在一段时间后杀死父进程? 谢谢你的任何提示! 更新: foreach( $url as $key => $value){
$wget = "wget -r -H -nd -l 999 $value";
system($wget);
}
解决方法
您可以使用“–timeout”和time()的组合.首先确定总共有多少时间,然后在脚本运行时降低–timeout.
例如: $endtime = time()+15;
foreach( $url as $key => $value){
$timeleft = $endtime - time();
if($timeleft > 0) {
$wget = "wget -t 1 --timeout $timeleft $otherwgetflags $value";
print "running $wget<br>";
system($wget);
} else {
print("timed out!");
exit(0);
}
}
注意:如果你不使用-t,wget将尝试20次,每次等待 – 超时秒. 这是使用proc_open / proc_terminate的一些示例代码(@Josh的建议): $descriptorspec = array(
0 => array("pipe","r"),1 => array("pipe","w"),2 => array("pipe","w")
);
$pipes = array();
$endtime = time()+15;
foreach( $url as $key => $value){
$wget = "wget $otherwgetflags $value";
print "running $wgetn";
$process = proc_open($wget,$descriptorspec,$pipes);
if (is_resource($process)) {
do {
$timeleft = $endtime - time();
$read = array($pipes[1]);
stream_select($read,$write = NULL,$exeptions = NULL,$timeleft,NULL);
if(!empty($read)) {
$stdout = fread($pipes[1],8192);
print("wget said--$stdout--n");
}
} while(!feof($pipes[1]) && $timeleft > 0);
if($timeleft <= 0) {
print("timed outn");
proc_terminate($process);
exit(0);
}
} else {
print("proc_open failedn");
}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
