我正在尝试制作一个PHP脚本,脚本已完成,但完成其设计的过程需要大约10分钟。这不是问题,但我认为我必须在此期间保持页面加载状态,这很烦人。我能否让它这样做:我开始处理过程,然后在10分钟后回来,只查看它生成的日志文件?
我正在尝试制作一个PHP脚本,脚本已完成,但完成其设计的过程需要大约10分钟。这不是问题,但我认为我必须在此期间保持页面加载状态,这很烦人。我能否让它这样做:我开始处理过程,然后在10分钟后回来,只查看它生成的日志文件?
嗯,你可以使用 "ignore_user_abort(true)"
这样脚本将会继续运行(注意脚本的执行时间,或许可以添加 "set_time_limit(0)")
但是要注意,使用这两行代码将无法停止脚本的执行:
ignore_user_abort(true);
set_time_limit(0);
听起来你需要一个队列和一个用于处理队列的外部脚本。
例如,你的PHP脚本应该将一个条目放入数据库表中并立即返回。然后,每分钟运行的cron检查队列并为每个作业分叉一个进程。
这里的优点是不会锁定Apache线程10分钟。
还有另一种选择,您可以使用运行脚本CLI...它将在后台运行,如果需要,甚至可以将其作为cronjob运行。
例如:
> #!/usr/bin/php -q
<?php
//process logs
?>
这可以设置为cronjob,并且没有时间限制地执行...虽然此示例仅适用于基于Unix的操作系统。
顺便提一下,我有一个运行无限循环的php脚本,它执行一些处理操作并已经连续运行了过去三个月。
ignore_user_abort(true);
与cUrl请求结合使用。
伪造一个请求中止设置一个低的CURLOPT_TIMEOUT_MS
并在连接关闭后继续处理:
function async_curl($background_process=''){
//-------------get curl contents----------------
$ch = curl_init($background_process);
curl_setopt_array($ch, array(
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER =>true,
CURLOPT_NOSIGNAL => 1, //to timeout immediately if the value is < 1000 ms
CURLOPT_TIMEOUT_MS => 50, //The maximum number of mseconds to allow cURL functions to execute
CURLOPT_VERBOSE => 1,
CURLOPT_HEADER => 1
));
$out = curl_exec($ch);
//-------------parse curl contents----------------
//$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
//$header = substr($out, 0, $header_size);
//$body = substr($out, $header_size);
curl_close($ch);
return true;
}
async_curl('http://example.com/background_process_1.php');
NB
如果您希望cURL在不到1秒的时间内超时,可以使用CURLOPT_TIMEOUT_MS。但是,在“类Unix系统”上,libcurl会立即超时并显示错误“cURL Error(28):Timeout was reached”,如果设置值小于1000ms,这是一个已知的bug/"feature"。此行为的解释如下:
[...]
解决方法是使用CURLOPT_NOSIGNAL禁用信号。
优点
缺点
资源
Zuk.
我相信这会起作用:
<?php
pclose(popen('php /path/to/file/server.php &'));
echo "Server started. [OK]";
?>
ignore_user_abort(true);
set_time_limit(0);
<?php
$output;
exec('ps aux | grep -ie /path/to/file/server.php | awk \'{print $2}\' | xargs kill -9 ', $output);
echo "Server stopped. [OK]";
?>