【问题标题】:How to execute separate process in PHP如何在 PHP 中执行单独的进程
【发布时间】:2012-08-12 11:26:55
【问题描述】:

我想在 PHP 中运行要在后台运行的服务。我曾尝试在 PHP 中使用 exec() 函数,但服务正在无限循环中运行,并且控制不会通过 PHP 文件返回。我在互联网上进行了更多搜索,但找不到解决方案。请给我一些想法或参考来完成这项任务。

这是我想做的参考代码:-

echo"hello";
exec("raintree.frm");
echo"hello1";

raintree.frm 是我要执行的服务。这里 PHP 脚本在浏览器上打印“hello”,但“hello1”没有出现,因为控制卡在exec() 函数上。

【问题讨论】:

标签: php process exec


【解决方案1】:

如果您希望服务在单独的进程中运行,如标题所述,您需要创建新进程,然后在其中运行服务。在 PHP 中,您可以使用 pcntl_fork() 创建一个新进程并在子进程中启动该服务。像这样的

echo "hello";
$pid = pcntl_fork();
switch($pid){
    case -1:    // pcntl_fork() failed
        die('could not fork');
    case 0:    // you're in the new (child) process
        exec("raintree.frm");
        // controll goes further down ONLY if exec() fails
        echo 'exec() failed';
    default:  // you're in the main (parent) process in which the script is running
        echo "hello1";
}

要了解更多信息,请阅读手册(上面指向 pcntl_fork() 的链接),以及查看有关主题(或者更确切地说是系统调用)fork()exec() 的一些 C/Unix 教程。

【讨论】:

  • 很好,pcntl_fork 的简单示例,我发现它很有用,因为我什至不需要获取 php 手册。谢谢!
  • 此代码未按预期工作。 default case 将被执行两次。您需要在每个case 中添加break 语句。 php.net/manual/en/control-structures.switch.php
【解决方案2】:

您可以使用atd 在单独的进程中运行任意命令:

shell_exec('echo code you want to run | at -m now');

为此,atd 当然应该安装并运行。

【讨论】:

  • 谢谢 - 这对于支持atd的系统来说非常优雅
【解决方案3】:

exec() 函数正在等待接收外部执行命令的输出。

为防止这种情况发生,您可以将输出重定向到别处:

<?php

echo 'hello1';
exec('raintree.frm > /dev/null &');
echo 'hello2';

此示例将输出“hello1hello2”,而无需等待raintree.frm &gt; /dev/null &amp; 完成。

(这可能只适用于类 Unix 操作系统)

【讨论】:

    猜你喜欢
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2013-10-18
    • 1970-01-01
    相关资源
    最近更新 更多