2014-02-08 40 views
3

我有sript PHP具有三個功能是這樣的:執行三個功能同時

public function a($html,$text) 
{ 
    //blaa 
return array(); 
} 
public function b($html,$text){ 
    //blaa 
return array(); 
} 
public function c($html,$text){ 
    //blaa 
return array(); 
} 
require_once 'simple_html_dom.php'; 
$a=array(); 
$html=new simple_html_dom(); 
$a=$this->a($html,$text); 
$b=$this->b($html,$text); 
$c=$this->c($html,$text); 
$html->clear(); 
unset($html); 
$a=array_merge($a, $c); 
$a=array_merge($a, $b); 


  • a($html,$text)需要5秒給出結果

  • b($html,$text)之前需要10秒之前給出結果

  • c($html,$text)需要12秒給人一種結果

因此,該系統需要27秒geving我一個結果之前之前,但我希望把我的結果在12秒內。我無法使用線程,因爲我的主機不支持線程。我怎麼解決這個問題?

+3

PHP不是多線程語言。要麼運行3個並行的PHP腳本(它們基本上是相互獨立的),或者不得不順序地運行三個dom操作。 –

+0

你真的確定你的服務器能夠更快地爲你提供服務嗎? – jtheman

+0

是的,因爲我打電話給一個傳送網站的每個功能 –

回答

3

如果等待時間是由阻塞IO(等待服務器響應)引起的,那麼curl_multi可能會有所幫助。

從你發佈的代碼看,它看起來不是你的問題。

它看起來更像是簡單的HTML DOM需要很長時間來解析你的HTML。這並不令人感到意外,因爲它不是一個很好的圖書館。如果是這種情況,您應該考慮切換到DomXPath。

4

PHP不支持開箱即用。如果你真的想這樣做,你有兩個基本的選擇(是的,這將是骯髒的)。如果您想根據您的實際使用情況選擇一個認真的解決方案,還有另一個選擇需要考慮。

方法1:使用一些AJAX的權謀 與觸發3 AJAX的調用,你要撥打的不同功能的按鈕,創建一個頁面。

選項2:運行一個命令 如果你是在UNIX上,您可以從PHP腳本觸發命令來運行PHP腳本(PHP xyz.php)和實際運行它在不同的線程。

嚴重的選擇:使用隊列 嚴重:使用像rabbitMQ或BeanstalkD這樣的隊列系統來做這些事情。 Laravel支持它開箱即用。

1

你可能想看看jQuery的延期對象.... $ .when應該處理這種情況。