在PHP中创建新线程(?)

时间:2011-11-16 08:00:30

标签: php multithreading

  

可能重复:
  php execute a background process
  how can I achieve a task that should be done in thread in php

我有这个PHP脚本,需要一点时间来处理。但是我不希望查看器等待脚本完成。我希望他能够继续浏览和/或关闭浏览器。但我希望脚本继续工作......我怎么能这样做?有没有办法创建某种允许这样的东西的线程?

P.S。我真的不想用另一种语言重写脚本并通过操作系统执行它。

5 个答案:

答案 0 :(得分:7)

如果您可以从CLI运行脚本,则可以通过调用以下内容来将其“分叉”到Web服务器所服务脚本的后台进程中:

exec('php your_script.php > /dev/null &');

这将允许页面完成加载,但保持your_script.php运行。

答案 1 :(得分:3)

避免在PHP中运行并行任务(线程或进程)。它有一些用于此目的的模块,但它们并非在每个平台上都可用,并且不是PHP核心的一部分,因此您能够使用它们的可能性非常低。

这里有两个选项:

  1. 将长时间运行的任务拆分为几个(更便宜的)子任务。将它们放在队列中并使每个请求执行一些子任务(但不要将输出延迟到客户端太多)。

  2. 如果你无法拆分这个大任务,只需为它设置一个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代码来检查记录的状态,如果是真的则检索数据,然后将其显示给用户..