0

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

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

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

raintree.frm是我想要执行的服务。exec()在这里,PHP 脚本在浏览器上打印“hello”,但由于控制卡在函数上,所以不会出现在“hello1”上。

4

3 回答 3

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().

于 2012-08-12T11:37:03.893 回答
1

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

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

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

于 2018-09-28T20:35:52.723 回答
-1

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

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

<?php

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

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

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

于 2016-06-02T02:03:32.600 回答