我试图通过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);
}
如果您使用的是PHP-CLI,请尝试使用Threads或fork()来获取非线程安全版本
取决于你如何实现它,异步PHP可能用于将web请求与处理分离,从而将web请求与处理中的任何超时隔离(但你可以在单个线程中做同样的事情)。将任务分解成更小的并发部分会使它运行得更快吗?可能不会——通常这会延长任务完成所需的时间——只有当您拥有非常大的处理能力并且可以有效地分配任务(例如map-reduce)时才不会出现这种情况。HTTP调用(curl)是分发此类工作的有效方法吗?不。还有其他方法,包括同步和异步消息传递、批处理、进程分支、线程....每一种都有自己的好处和复杂性——我们不知道你想要解决的问题是什么。
所以在我们回答你的具体问题之前,这看起来不像是一个好策略。
使用curl运行外部脚本文件是否会防止调用者文件触发最大执行时间
它将受到目标服务器上配置的任何超时的约束——如果目标服务器与调用脚本是同一台服务器,那么它将是相同的超时。
curl仍然会等待服务器的响应并杀死我的页面吗?
我不知道你在问什么——它暗示有一些你没有告诉我们的功能依赖。
听起来你已经选择了一个解决方案,现在正试图使它适合你的问题。