【问题标题】:PHP Pipe into a background processPHP Pipe 进入后台进程
【发布时间】:2011-11-27 06:41:05
【问题描述】:

我正在尝试使用 popen 在后台运行 php 脚本。但是,我需要传递一个(相当大的)序列化对象。

$cmd = "php background_test.php >log/output.log &";
$fh = popen($cmd, 'w');
fwrite($fh, $data); 
fclose($fh);
//pclose($fh);

如果没有 & ,此代码可以正常执行,但父脚本将等到子脚本完成运行。使用 & 符号 STDIN 没有数据。

有什么想法吗?

【问题讨论】:

    标签: php process background stdin popen


    【解决方案1】:

    让后台进程监听套接字文件。然后从 PHP 打开套接字文件并将您的序列化数据发送到那里。当您的后台守护进程通过套接字接收到连接时,使其分叉,读取数据然后处理。

    你需要做一些阅读,但我认为这是实现这一目标的最佳方式。套接字我的意思是 unix 套接字文件,但您也可以通过网络使用它。

    http://gearman.org/ 也是@Joshua 提到的一个不错的选择

    【讨论】:

      【解决方案2】:

      您可以尝试分叉让子进程写入数据并且主脚本继续正常运行。

      类似的东西

      // Fork a child process
      $pid = pcntl_fork();
      
      // Unable to fork
      if ($pid == -1) {
          die('error');
      }
      
      // We are the parent
      elseif ($pid) {
      
         // do nothing 
      }
      
      // We are the child
      else {
      
          $cmd = "php background_test.php >log/output.log";
          $fh = popen($cmd, 'w');
          fwrite($fh, $data); 
          fclose($fh);
          exit();
      }
      
      
      // parent will continue here
      // child will exit above
      

      在此处了解更多信息:https://sites.google.com/a/van-steenbeek.net/archive/php_pcntl_fork

      还要检查 php 文档中的函数 pcntl_waitpid()(僵尸不见了)。

      【讨论】:

      • 如果要分叉脚本,请务必小心僵尸进程。您可能会考虑使用队列管理器,例如 Gearman。
      【解决方案3】:

      据我所知,php 无法在后台发送进程并继续提供其 STDIN(但也许我错了)。您在这里还有另外两个选择:

      1. 重构您的background_test.php 以从命令行获取其输入并将您的命令行转换为php background_test.php arg1 arg2 ... >log/output.log &
      2. 如果您的输入很长,请将其写入一个临时文件,然后将该文件提供给 background_test.php 脚本,如下面的代码所示

      第 2 点的示例:

      <?
      $tmp_file = tempnam();
      file_put_content($tmp_file, $data);
      $cmd = "php background_test.php < $tmp_name > log/output.log &";
      exec($cmd);
      

      【讨论】:

        猜你喜欢
        • 2011-03-31
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 2013-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多