我在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] &");
但没有成功
答案 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 &
附加到您的命令,对我有用。