2011-03-30 18 views
1

我在MySQL中有很多行。我将在这些行中的每个行上对ip执行ping操作,所以我想分解负载。我制作了一个脚本,为数据库中的每100行运行一个新进程。问题在于,父脚本似乎在开始下一个脚本之前要等待每个脚本完成,这会使整个目的失效。如何确保PHP实例在后台运行?

这是父脚本

for($i = 0; $i < $children_num; $i++) 
{ 
    $start = $bn["dots_pr_child"] * $i; 

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

值得一提的是,这些孩子的过程中运行exec("ping")每行的MySQL一次的重要组成部分的代码。我认为这是问题的一部分。

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

有没有办法强制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] &");没有成功

回答

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

应该在后台做这项工作。

+0

这是做的伎俩!你愿意解释这个魔法吗? :D – Hubro 2011-03-30 04:08:28

+2

@Codemonkey:'>/dev/null' = STDOUT到'/ dev/null','2>/dev/null' STDERR到'/ dev/null'。 – 2011-03-30 04:40:40

+1

,只要有输出流附加到它所产生的进程,进程就无法进入后台。所以重定向那些从PHP过程中“分离”出来的。 – edorian 2011-03-30 23:40:09

0

尝试nohup的符号:

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

的在nohup上的可以很好地描述它的功能。

0

虽然这可能是矫枉过正的这个特定的任务,请考虑Gearman,一个消息/工作队列正是为你正在做的:为任务挖掘任务。它有comprehensive PHP support

如果您想立即传递Gearman,请查看proc_open而不是exec。这有点复杂,但它给你更高的控制程度,可能对你更好。

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

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

+0

没有工作,检查更新的问题 - 我做对了吗? – Hubro 2011-03-30 04:07:19

+0

您的代码仍在使用PHP的流而不是/ dev/null或LOG文件。 – 2011-03-30 04:22:13

0

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