使用Shell_exec和nohup的PHP命令

11

我认为有很多类似的帖子,但在搜索周围后,我还没有找到解决方案。

基本上,我正在尝试在后台运行两个脚本。 当我在命令行中运行它们时,在调用我的第一个脚本后,我会看到:

/usr/bin/nohup php script.php > nohupoutput.log & echo $!

我尝试了 ...script.php > /dev/null &,但结果相同。我得到了:
/usr/bin/nohup: ignoring input and redirecting stderr to stdout

我忽略了第一个命令并运行了第二个。我注意到它似乎卡在那里,按下 Enter 键将我带回到 machine:~folder>

/usr/bin/nohup php script2.php > nohupoutput.log & echo $!

两个脚本都可以正常运行。我尝试将其转换为shell_exec命令,但似乎没有任何作用。我怀疑是因为 忽略输入 部分导致了问题,但我不确定。无论如何,以下代码无法正常工作。它只会在浏览器中卡住:

$output = shell_exec('/usr/bin/nohup php script.php > /dev/null &');
$output = shell_exec('/usr/bin/nohup php script2.php > /dev/null &');
4个回答

12

尝试:

$output = shell_exec('/usr/bin/nohup php script.php >/dev/null 2>&1 &');

或者:

exec('/usr/bin/nohup php script.php >/dev/null 2>&1 &');

当我尝试在命令行上执行时,我会得到一个模糊的输出重定向。 - Rio
你使用哪个操作系统和 PHP 版本?这是一个奇怪的问题。 - user557846

2
这应该可以工作:
shell_exec('nohup /usr/bin/php path/to/script.php > output.txt &');

2
<?php
function execInBackground($cmd) {
    if (substr(php_uname(), 0, 7) == "Windows"){
        pclose(popen("start /B ". $cmd, "r")); 
    }
    else {
        exec($cmd . " > /dev/null &");  
    }
}

// take note: to get your PHP_PATH, try looking at your phpinfo :)
echo execInBackground("/usr/local/php53/bin/php 'example2.php'");
?>

1
popen('nohup ... &', 'r') 是我在 OS X 和 Heroku 上唯一有效的运行方法。大量其他运行分离后台进程的解决方案,包括 Symfony、Cocur 等都失败了(要么阻止执行,要么在父进程死亡时死亡)。 - Ezekiel Victor

0

首先将您的 PHP 命令放入一个 shell 文件脚本中,例如myscript.sh

#!/bin/bash
# myscript.sh file
php script.php

使用myscript.sh运行nohup:

sudo nohup ./myscript.sh &

使用 ps 命令进行验证:

ps aux | grep myscript.sh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接