我試圖通過API運行一個大量的字段值更新,我跑到我的PHP腳本的最大執行時間。異步PHP執行
我分了我的作業分成較小的任務異步運行他們的小作業......
我發現這個職位,它看起來約權,但評論都有點倒胃口.. 。使用curl來運行外部腳本文件會阻止調用者文件觸發最大執行時間,或者curl是否仍然等待來自服務器的響應並終止我的頁面?
問題的確是:你如何在PHP中執行異步作業?像Ajax一樣。
編輯:: ///
有一個擁有大量的數據行的項目管理工具。 我正在使用此工具API訪問數據行並將其顯示在我的頁面上。 使用我的工具的用戶將使用複選框選擇多行數據,並在框中鍵入新值。 然後用戶將按下「更新行值」按鈕,該按鈕將運行更新腳本。
此更新腳本分項目的數百或數千可能選入的100
組在這一點上我會使用一些異步方法接觸項目管理工具和更新所有100個項目。
因爲當它更新這些項目時,它可能需要很長時間來運行其進程,我需要確保我的原始頁面拆分這些作業不再等待來自該操作的請求,以便我可以引發更多更新項目的請求。並允許我的服務器頁面對我的用戶說:「好吧,更新正在發生,可能需要一段時間,我們會在完成後發送電子郵件。」
$step = 100;
$itemCount = GetItemCountByAppId($appId);
$loopsRequired = $itemCount/$step;
$loopsRequired = ceil($loopsRequired);
$process = array();
for($a = 0; $a < $loopsRequired; $a++)
{
$items = GetItemsByAppId($appId, array(
"amount" => $step,
"offset" => ($step * $a)
));
foreach($items[ "items" ] as $key => $item)
{
foreach($fieldsGroup as $fieldId => $fieldValues)
{
$itemId = $item->__attributes[ "item_id" ];
/*array_push($process, array(
"itemId" => $itemId,
"fieldId" => $fieldId,
));*/
UpdateFieldValue($itemId, $fieldId, $fieldValues);
// This Update function is actually calling the server and I assume it must be waiting for a response... thus my code times out after 30 secs of execution
}
}
//curl_post_async($url, $params);
}
使用隊列/工作系統! AMQP,ZeroMQ,Gearman等是你的朋友。 – deceze
通過命令行啓動它們爲您提供了一個可行的選項? –
這是需要自動化並且長度可變的東西。有些工作可能最終每次只需要5分鐘的時間......如果我可以將工作分成較小的數量並完成異步工作,那麼一旦操作完成,我就可以簡單地向用戶發送電子郵件......所以,說實話...我不完全確定這是一個可行的解決方案 – Jimmyt1988