我试图通过API运行大量的字段值更新,并且我的PHP脚本遇到了最大的执行时间。
我把我的工作分成更小的任务,异步地作为较小的作业来运行.
我找到了这篇文章,它看起来是对的,但评论有点令人讨厌.使用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);
}发布于 2013-05-20 11:24:20
如果您使用的是PHP,请尝试线程或非线程安全版本的叉()。
发布于 2013-05-20 11:41:38
根据实现方式的不同,可以使用异步PHP将web请求与处理分离开来,从而将web请求与进程中的任何超时隔离开来(但您可以在单个线程中执行相同的操作)。将任务分解成较小的并发部分会使其运行得更快吗?也许不会--通常情况下,这会延长完成任务所需的时间--只有当您拥有非常大的处理能力并能够有效地分配任务时(例如地图减少),才会出现这种情况。HTTP调用(curl)是像这样分发工作的有效方法吗?不是的。还有其他方法,包括同步和异步消息传递、批处理、进程分叉、threads....each,它们各自的好处和复杂性--我们不知道您想要解决的问题是什么。
因此,即使在我们讨论你的具体问题之前,这看起来并不是一个好的策略。
使用curl运行外部脚本文件会阻止调用方文件触发最大执行时间吗?
它将受到目标服务器上配置的任何超时的限制--如果这是与调用脚本相同的服务器,那么它将是相同的超时。
卷发是否还会等待服务器的响应并关闭我的页面?
我不知道你在这里问的是什么--相反,这意味着你还没有告诉我们功能依赖。
听起来你已经选择了一个解决方案,并且正在努力使它适合你的问题。
https://stackoverflow.com/questions/16647473
复制相似问题