有沒有辦法在不等待第一個完成的情況下調用多個file_get_contents
。我有幾個PHP腳本執行一些繁重的工作,執行時間大於1.5分鐘,所以我想同時調用它們以減少執行時間。目前我有多個file_get_contents,但要運行下一個file_get_contents,第一個需要先完成。我嘗試exec
方法,但它在服務器(共享主機)上被阻止。不要等待file_get_contents()完成
回答
那麼有多種方式可以並行運行任務,如果這就是你想要實現的目標,但要牢記PHP是一種高級腳本語言,並且它的最初目的是爲無狀態的HTTP請求提供服務。
這裏有擴展名,例如Gearman,這個擴展允許應用程序並行完成任務。
顯然這將是你的風向標,因爲你可能只使用服務來託管。得到像vps一樣,從OVH的vps比大多數網絡託管服務便宜。
你的意思是vps,而不是vpn? – user897234
是的抱歉,我的意思是虛擬專用服務器 –
是的,這是可能的!但它有點棘手!
你必須玩forks
。
我同意隊列和其他人......但只是能力的緣故,這裏有一個例子:
<?php
declare(ticks = 1);
$a = [
'https://twitter.com',
'https://facebook.com',
'https://stackoverflow.com',
'https://linkedin.com',
'https://github.com',
];
// Count of php threads (forks or processes).
$max = 3;
// Child counter.
$child = 0;
pcntl_signal(SIGCHLD, function ($signo) {
global $child;
if ($signo === SIGCLD) {
while (($pid = pcntl_wait($signo, WNOHANG)) > 0) {
$signal = pcntl_wexitstatus($signo);
$child--;
}
}
});
foreach ($a as $item) {
while ($child >= $max) {
sleep(1);
}
$child++;
$pid = pcntl_fork();
if ($pid) {
} else {
// Child fork.
sleep(1);
// HERE YOUR CODE:
echo file_get_contents($item);
exit(0);
}
}
while ($child != 0) {
sleep(1);
}
有沒有在代碼中限制叉的數量的方法,例如,如果傳遞200個鏈接的數組,這是200個同時運行的'file_get_contents'試圖並行工作,這將抓取....'$ max'似乎沒有被使用。 – Martin
@Martin是的,這裏是現在的限制,它是'$ max'),它用於:while($ child> = $ max){'。在這個例子中,我們有3個線程。 –
@Martin np!)感謝您的關注! –
- 1. file_get_contents不等待
- 2. 不要等待函數來完成
- 3. 不要等待腳本完成
- 4. 程序爲什麼要等待schedule()完成,但不等待scheduleWithFixedDelay()?
- 5. 等待完成
- 6. 等待完成
- 7. jQuery完成後不等待它完成
- 8. jQuery.when不等待完成
- 9. 「等待HTTPClient.GetAsync」永不完成
- 10. 等待webworker完成
- 11. 等待NSURLSessionTask完成
- 12. jquery,等待完成
- 13. 等待IDBCursor.onsuccess完成
- 14. 等待ExecWB完成
- 15. 等待GUI完成
- 16. WebRequest.GetResponse等待完成
- 17. 等待BackgroundWorker完成?
- 18. 等待webrequest完成
- 19. 等待AsyncTask完成
- 20. delayed_job等待完成
- 21. 等待UIView完成
- 22. 等待shutil.copyfile完成
- 23. 等待SwingWorker完成
- 24. 等待$ .post完成
- 25. 等待AFJSONRequestOperation完成
- 26. QNetworkReply等待完成
- 27. 需要等待的XMLHttpRequest完成
- 28. 用戶需要等待操作完成
- 29. 若要完成線程的等待(Android)
- 30. 等待完成處理程序完成
我不是一個判斷,但共享主機和90秒的file_get_contents執行時間。這是過度使用的祕訣,禁止您的託管(違反公平使用政策)。我建議你調查排隊請求並通過CRON在一天中均勻處理這些請求。 –
@JamieBicknell我同意,但是如果使用共享主機,CRON肯定不可用,所以自定義任務隊列是必需的。 – Jocelyn
我還沒有遇到任何不允許CRON的信譽良好的共享主機。然而,他們會有限制,例如每10或15分鐘運行一次,最大執行時間爲60秒,但體面的共享主機將擁有CRON。 –