如何在PHP中执行单独的进程

时间:2012-08-12 11:26:55

标签: php process exec

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

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

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

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

3 个答案:

答案 0 :(得分:3)

如果您希望让您的服务在单独的流程中运行,正如标题所述,您需要创建新流程,然后在其中运行服务。在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教程。

答案 1 :(得分:1)

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

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

为此,atd应该已经安装并正在运行。

答案 2 :(得分:-1)

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

为防止这种情况发生,您可以将输出重定向到其他位置:

<?php

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

此示例将输出“hello1hello2”而不等待raintree.frm > /dev/null &完成。

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