Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中创建新线程(?)_Php_Multithreading - Fatal编程技术网

在PHP中创建新线程(?)

在PHP中创建新线程(?),php,multithreading,Php,Multithreading,可能重复: 我有一个PHP脚本,需要花费一些时间来处理。但是,我不希望查看器等待脚本完成。我希望他能够继续浏览和/或关闭浏览器。但我希望脚本继续工作。。。我该怎么做?有没有办法创建某种线程来允许这样的事情 p、 我真的不想用另一种语言重新编写脚本并通过操作系统执行它。您可以使用ajax 通过ajax调用需要很长时间才能执行的脚本,当结果准备好时,将其显示给用户好的,如果这样你可以做另一件事,你可以维护一个表来记录脚本执行的状态, 然后编写一个JavaScript代码,执行ajax调用以检查记

可能重复:

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


p、 我真的不想用另一种语言重新编写脚本并通过操作系统执行它。

您可以使用ajax


通过ajax调用需要很长时间才能执行的脚本,当结果准备好时,将其显示给用户

好的,如果这样你可以做另一件事,你可以维护一个表来记录脚本执行的状态,
然后编写一个JavaScript代码,执行ajax调用以检查记录的状态,如果为真,则检索数据并将其显示给用户。

如果可以从CLI运行脚本,则可以通过调用以下命令将其从web服务器服务的脚本“分叉”到后台进程:

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

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

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

这里有两个选项:

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

  • 如果您不能拆分这个大任务,只需为它设置一个cron作业。这样,当系统执行长时间运行的任务时,用户不会受到延迟的影响

    另一件需要注意的事情是,PHP脚本有一个(可重写的)时间限制,在给定的秒数之后停止执行。通过cron运行的任务不受此限制


  • 据我所知,PHP不提供任何执行此类任务的功能

    一个有效的(尽管很难看)解决方案是创建soapweb服务,并通过覆盖“$oneWay”参数从脚本中使用扩展SoapClient调用它(http://www.php.net/manual/en/soapclient.dorequest.php).


    在这种情况下,发出单向请求意味着您的脚本不需要等待响应,代码将继续执行。

    用户可以导航到其他页面或关闭浏览器,然后脚本执行将被中断/丢失。。。这就是为什么我把我的问题贴在stackoverflow上…@VladislavZorov:因为AJAX(JS)在客户端上运行。用户可能会中断调用(或者完全禁用JS),如果操作很长,请求可能会超时,等等。问题不在于AJAX,而在于能否在后台运行PHP操作。这两个是不可混淆的。这是我过去的经历,忽略这一点。PHP不一定在网站上使用。例如,我正在使用PHP构建一个电报机器人,因此您的答案不能用于此目的。我可以使用$\u GET通过您的方式将数据发送到我的脚本吗?一个示例是:exec('php my_script.php?somevalues>/dev/null&')@JohnRoach
    exec
    将在操作系统中运行命令。所以您必须以这种方式传递参数,这里不涉及HTTP(GET、POST等都是HTTP方法)。你说这是一种丑陋的方式为什么?看来您的解决方案正是我想要的。使用事件池或不同的线程来实现这些目的会更自然。尽管您需要创建接受客户端请求的SOAP服务器、实现单向SOAP客户端等,但此解决方案仍然有效。。。
        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);