如何确保PHP实例在后台运行?

时间:2011-03-30 03:41:21

标签: php linux debian fork

我在MySQL中有很多行。我将在每个行中对ip执行ping操作,所以我想分割负载。我创建了一个脚本,为数据库中的每100行运行一个新进程。问题是父脚本似乎在开始下一个子脚本之前等待每个子脚本完成,这会使整个目的无效。

这是父脚本

的重要部分的代码
for($i = 0; $i < $children_num; $i++)
{
    $start = $bn["dots_pr_child"] * $i;

    exec("php pingrange.php $i $start $bn[dots_pr_child]");
}

值得一提的是,每个子进程每个MySQL行运行exec("ping")一次。我认为这是问题的一部分。

我会根据要求发布更多信息和代码。

有没有办法强制PHP实例在后台运行,前台继续?优选地,父脚本应该采用0.0001 sek并打印“完成”。目前它运行120秒。

感谢您提供的任何帮助


编辑:我尝试在此过程后添加&。有人会认为这会使exec函数立即返回,但是没有。


编辑:尝试exec("php pingrange.php $i $start $bn[dots_pr_child] 2>&1 &");但没有成功


编辑:尝试exec("nohup php pingrange.php $i $start $bn[dots_pr_child] &");但没有成功

5 个答案:

答案 0 :(得分:2)

exec("php pingrange.php $i $start $bn[dots_pr_child] > /dev/null 2>/dev/null & ");

应该在后台完成工作。

答案 1 :(得分:0)

尝试nohup &符号:

exec("nohup php pingrange.php $i $start $bn[dots_pr_child] &");

nohup上的Wikipedia article可以很好地描述它的作用。

答案 2 :(得分:0)

虽然对于这项特定任务可能有些过分,但请考虑Gearman,这是一个专门针对您正在做的事情的消息/工作队列:将任务分配给工作人员。它有comprehensive PHP support

如果您现在要传递Gearman,请查看proc_open而不是exec。它有点复杂,但它为您提供了更高程度的控制,可能对您更有效。

答案 3 :(得分:0)

<?php
passthru("/path/script >> /path/to/log_file.log 2>&1 &");
?>

这应该有效,因为没有使用默认的PHP流。

答案 4 :(得分:0)

只需将> /dev/null 2>&1 &附加到您的命令,对我有用。