我试图通过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