2016-07-05 134 views
1

有沒有辦法在不等待第一個完成的情況下調用多個file_get_contents。我有幾個PHP腳本執行一些繁重的工作,執行時間大於1.5分鐘,所以我想同時調用它們以減少執行時間。目前我有多個file_get_contents,但要運行下一個file_get_contents,第一個需要先完成。我嘗試exec方法,但它在服務器(共享主機)上被阻止。不要等待file_get_contents()完成

+1

我不是一個判斷,但共享主機和90秒的file_get_contents執行時間。這是過度使用的祕訣,禁止您的託管(違反公平使用政策)。我建議你調查排隊請求並通過CRON在一天中均勻處理這些請求。 –

+0

@JamieBicknell我同意,但是如果使用共享主機,CRON肯定不可用,所以自定義任務隊列是必需的。 – Jocelyn

+0

我還沒有遇到任何不允許CRON的信譽良好的共享主機。然而,他們會有限制,例如每10或15分鐘運行一次,最大執行時間爲60秒,但體面的共享主機將擁有CRON。 –

回答

1

那麼有多種方式可以並行運行任務,如果這就是你想要實現的目標,但要牢記PHP是一種高級腳本語言,並且它的最初目的是爲無狀態的HTTP請求提供服務。

這裏有擴展名,例如Gearman,這個擴展允許應用程序並行完成任務。

顯然這將是你的風向標,因爲你可能只使用服務來託管。得到像vps一樣,從OVH的vps比大多數網絡託管服務便宜。

+0

你的意思是vps,而不是vpn? – user897234

+0

是的抱歉,我的意思是虛擬專用服務器 –

1

是的,這是可能的!但它有點棘手!

你必須玩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); 
} 
+0

有沒有在代碼中限制叉的數量的方法,例如,如果傳遞200個鏈接的數組,這是200個同時運行的'file_get_contents'試圖並行工作,這將抓取....'$ max'似乎沒有被使用。 – Martin

+0

@Martin是的,這裏是現在的限制,它是'$ max'),它用於:while($ child> = $ max){'。在這個例子中,我們有3個線程。 –

+0

@Martin np!)感謝您的關注! –