如何使用PHP exec(linux)启动后台进程?

时间:2011-07-21 10:07:29

标签: php linux process background exec

我知道这个主题上有很多帖子,但那里提到的所有解决方案似乎都不适合我。

我正在构建一个聊天客户端,我希望在后台运行一个进程,该进程将侦听我帐户上的传入邮件。

以下是代码:

$command = "cd classes/chat/inc/ && /usr/bin/php5 client.php --mysql_server=localhost --mysql_username=root --mysql_password= --mysql_database=covide --gtalk_user=xxx --gtalk_password=xxx --user_id=".$_SESSION['user_id']." &> /dev/null &";
exec($command);

我尝试了很多选项而不是:

&> /dev/null &

喜欢> / dev / null 2> / dev / null&或者> testoutput.php 2>& 1&回声$! (来自本论坛上的各种帖子),但没有成功。有没有人知道如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

我有一个正常的工作版本。但不是使用exec();我们使用curl POST来运行我们的后台进程。问题是超时限制。您可以做的是让您的后台进程通过“侦听传入消息”任务运行,然后在最后调用其自身的另一个实例并关闭当前实例。

你可以在你的过程开始时使用这样的东西,以确保它不会过早退出,但我没有发现这是必要的,即使以下没有实现,它仍然运行良好,仍然:

/* Close our connection with calling file */
while(ob_get_level()) ob_end_clean();
header('Connection: close');
ignore_user_abort();
ob_start();
echo('Running in the background.');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();

答案 1 :(得分:0)

以下命令应立即返回:

exec('nohup php otherscript.php > nohup.out & > /dev/null');

有关如何管理后台脚本执行周期的更多概述,请参阅此处的full answer