我尝试通过API运行大量的字段值更新,并且我的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);
}
答案 0 :(得分:0)
答案 1 :(得分:0)
根据您的实现方式,可能会使用异步PHP将Web请求与处理分离,从而将Web请求与处理中的任何超时隔离开(但您可以在单个线程中执行相同的操作)。将任务分解为更小的并发部分会使其运行得更快吗?可能不会 - 通常这会延长作业完成所需的时间 - 大约只有这样的情况才会出现这样的情况:当你拥有非常大的处理能力并且能够有效地分配任务时(例如map-reduce )。 HTTP调用(curl)是一种有效的方式来分发这样的工作吗?没有。还有其他方法,包括同步和异步消息传递,批处理,进程分叉,线程....每个都有自己的好处和复杂性 - 我们不知道你要解决的问题是什么。
因此,即使在我们解决您的具体问题之前,这看起来也不是一个好策略。
使用curl运行外部脚本文件会阻止调用者文件触发最长执行时间
它将受到目标服务器上配置的任何超时的约束 - 如果它与调用脚本的服务器相同,那么它将是相同的超时。
卷曲还会等待来自服务器的响应并终止我的页面吗?
我不知道你在这里问的是什么 - 它更多地暗示了你没有告诉我们的功能依赖。
听起来你选择了一个解决方案,现在正试图让它适合你的问题。