【问题标题】:Creating new thread(?) in PHP [duplicate]在 PHP 中创建新线程(?)
【发布时间】:2011-12-30 04:59:47
【问题描述】:

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

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

附言我真的不想用另一种语言重写脚本并通过 os 执行它。

【问题讨论】:

    标签: php multithreading


    【解决方案1】:

    如果您可以从 CLI 运行您的脚本,您可以通过调用以下代码将其从您的 Web 服务器正在服务的脚本中“分叉”到后台进程中:

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

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

    【讨论】:

    • 我可以使用 $_GET 通过你的方式将数据发送到我的脚本吗?一个示例是: exec('php my_script.php?somevalues > /dev/null &')
    • @JohnRoach exec 将在操作系统中运行命令。所以你必须以这种方式传递参数,这里不涉及 HTTP(GET、POST 等都是 HTTP 方法)。 PHP: Command line usage
    【解决方案2】:

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

    这里有两个选择:

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

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

      另外需要注意的是,PHP 脚本有(一个可覆盖的)时间限制,它会在给定的秒数后停止执行。通过 cron 运行的任务不受此限制。

    【讨论】:

      【解决方案3】:

      据我所知,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);
      

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

      【讨论】:

      • 你说这很丑,为什么?看来您的解决方案正是我想要的。
      • 为此目的使用事件池或不同线程会更自然。尽管您需要创建接受来自客户端的请求、实现单向 SOAP 客户端等的 SOAP 服务器,但此解决方案仍然有效......
      【解决方案4】:

      你可以利用ajax,

      通过ajax调用执行时间长的脚本,结果出来后展示给用户

      【讨论】:

      • 用户可以导航到不同的页面或关闭浏览器,然后脚本执行将被中断/丢失
      • 正是...这就是为什么我在stackoverflow上发布我的问题...
      • @VladislavZorov:因为 AJAX (JS) 在客户端上运行。用户可能会中断调用(或完全禁用 JS),如果操作很长,请求可能会超时等。而且,问题不是关于 AJAX,而是能够在后台运行 PHP 操作。两者不要混淆。
      • 那是过去的我,忽略那个人。
      • PHP 不一定用在网站上。例如,我正在使用 PHP 构建 Telegram Bot,因此您的答案不能用于此目的。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2013-08-28
        • 2012-06-06
        • 2012-03-18
        • 2020-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多