2011-03-30 20 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 &到您的命令,適用於我。