【发布时间】:2013-05-14 21:22:00
【问题描述】:
我尝试通过 API 对字段值进行大规模更新,但我遇到了 PHP 脚本的最长执行时间。
我将我的工作划分为较小的任务,以便将它们作为较小的工作异步运行......
我找到了这篇文章,它看起来不错,但是 cmets 有点令人反感... 使用 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 等都是你的朋友。
-
通过命令行启动它们对您来说是一个可行的选择吗?
-
这是需要自动化的东西,并且长度可变。有些工作可能一次需要 5 分钟...老实说......我不完全确定这是否是一个可行的解决方案
-
对于队列系统,有什么不需要额外扩展的吗?我无法控制我当前所在的服务器。
-
那你有问题了。如果您需要运行长时间的作业,标准的共享主机 Apache-only Web 服务器是一个不好的平台。
标签: php asynchronous