2015-10-19 60 views
1

我目前正在嘗試從外部地方導入巨大數字的學生。我在控制器中暴露一條路線。我收到一條錯誤消息Error: Maximum execution time of 30 seconds exceeded。我想避免設置set_time_limit(0)。是否有另一種方法來避免這種錯誤並繼續進行?如果我建立一個命令,一切正常,因爲時間限制設置爲0.我也嘗試從控制器運行一個命令,但是這導致相同的錯誤。我需要從控制器來完成,這就是我仍然在尋找解決方案的原因。PHP現在回覆,稍後處理

此外,有沒有辦法返回一個響應,仍然有進程在後臺運行?

+1

我要推薦你的文檔有關的RabbitMQ和組件的方法納入Symfony的2.好運 – rommct

回答

0

這裏有幾個選項,具體取決於您返回的數據應該更新的頻率以及實際需要處理的時間。首先,如果可以每天或每週更新數據,則可以使命令將其輸出保存在某個可供Web應用程序訪問的位置,然後添加一個cron作業以每隔一段時間生成一次輸出。接下來,只需確保用戶可以訪問結果。

第二種方法實施起來更加困難,但也更加靈活。您可以利用RabbitMQ和RabbitMQBundle或類似的隊列服務器,以便在用戶請求數據時,只向隊列中提交消息,然後由工作人員以某種方式接收消息,以更新Web應用程序數據(運行您的命令),表示該過程已完成並以某種方式緩存結果。這樣,你馬上就會得到新的結果,但是負載不會是可預測的(這就是爲什麼你應該考慮緩存)。

0

您可以使用StreamedResponse,它允許您使用回調將Response流傳輸回客戶端。

use Symfony\Component\HttpFoundation\StreamedResponse; 

$response = new StreamedResponse(); 
$response->setCallback(function() { 
    var_dump('Hello World'); 
    flush(); 
    sleep(2); 
    var_dump('Hello World'); 
    flush(); 
}); 
$response->send(); 

在這裏看到更多的信息:

http://symfony.com/doc/current/components/http_foundation/introduction.html#streaming-a-response

+0

試過了。我仍然收到'錯誤:超過30秒的最大執行時間'消息。 –

+0

您仍然必須允許腳本運行更長時間,但使用此方法至少可以讓用戶保留過程進度 –

+0

不幸的是,我不允許將默認值更改爲30秒。而且,我也不需要告知用戶有關進度。我只是想讓命令在後臺運行而無需知道。 –