可能重复:
php execute a background process
how can I achieve a task that should be done in thread in php
我有这个PHP脚本,需要一点时间来处理。但是我不希望查看器等待脚本完成。我希望他能够继续浏览和/或关闭浏览器。但我希望脚本继续工作......我怎么能这样做?有没有办法创建某种允许这样的东西的线程?
P.S。我真的不想用另一种语言重写脚本并通过操作系统执行它。
答案 0 :(得分:7)
如果您可以从CLI运行脚本,则可以通过调用以下内容来将其“分叉”到Web服务器所服务脚本的后台进程中:
exec('php your_script.php > /dev/null &');
这将允许页面完成加载,但保持your_script.php运行。
答案 1 :(得分:3)
避免在PHP中运行并行任务(线程或进程)。它有一些用于此目的的模块,但它们并非在每个平台上都可用,并且不是PHP核心的一部分,因此您能够使用它们的可能性非常低。
这里有两个选项:
将长时间运行的任务拆分为几个(更便宜的)子任务。将它们放在队列中并使每个请求执行一些子任务(但不要将输出延迟到客户端太多)。
如果你无法拆分这个大任务,只需为它设置一个cron作业。这样,当系统执行长时间运行的任务时,用户不会受到延迟的影响。
需要注意的另一件事是PHP脚本具有(可覆盖的)时间限制,在给定的秒数后停止执行。通过cron运行的任务不会受到此限制。
答案 2 :(得分:2)
据我所知,PHP没有提供执行此类任务的任何内容。
一个工作(虽然丑陋)的解决方案是创建SOAP Web服务并通过覆盖“$ oneWay”参数(http://www.php.net/manual/en/soapclient.dorequest)从扩展的SoapClient脚本调用它.PHP)。
class AsyncSoapClient extends SoapClient {
function __construct($wsdl, $options) {
parent::__construct($wsdl, $options);
}
function __doRequest($request, $location, $action, $version, $oneWay = TRUE) {
return parent::__doRequest($request, $location, $action, $version, TRUE);
}
}
$client = new AsyncSoapClient(
NULL,
array(
'location' => $location,
'uri' => $uri
)
);
$client->invokeMethodOnServer($yourParameters);
在这种情况下,发出单向请求意味着您的脚本不需要等待响应并继续执行代码。
答案 3 :(得分:0)
您可以使用ajax,
调用需要很长时间才能通过ajax执行的脚本,当结果准备好后,将其显示给用户
答案 4 :(得分:0)
好的,如果可以,你可以做另一件事,你可以维护一个表来记录脚本执行的状态, 然后编写一个执行ajax调用的JavaScript代码来检查记录的状态,如果是真的则检索数据,然后将其显示给用户..