异步PHP执行

时间:2013-05-20 10:25:54

标签: php asynchronous

我尝试通过API运行大量的字段值更新,并且我的PHP脚本遇到了最长的执行时间。

我将我的工作划分为较小的任务,以便像小工作一样异步运行......

Asynchronous PHP calls?

我找到了这篇帖子,它看起来很正确,但评论有点令人反感...使用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);
    }

2 个答案:

答案 0 :(得分:0)

如果您使用的是PHP-CLI,请尝试使用Threadsfork()获取非线程安全版本。

答案 1 :(得分:0)

根据您的实现方式,可能会使用异步PHP将Web请求与处理分离,从而将Web请求与处理中的任何超时隔离开(但您可以在单个线程中执行相同的操作)。将任务分解为更小的并发部分会使其运行得更快吗?可能不会 - 通常这会延长作业完成所需的时间 - 大约只有这样的情况才会出现这样的情况:当你拥有非常大的处理能力并且能够有效地分配任务时(例如map-reduce )。 HTTP调用(curl)是一种有效的方式来分发这样的工作吗?没有。还有其他方法,包括同步和异步消息传递,批处理,进程分叉,线程....每个都有自己的好处和复杂性 - 我们不知道你要解决的问题是什么。

因此,即使在我们解决您的具体问题之前,这看起来也不是一个好策略。

  

使用curl运行外部脚本文件会阻止调用者文件触发最长执行时间

它将受到目标服务器上配置的任何超时的约束 - 如果它与调用脚本的服务器相同,那么它将是相同的超时。

  

卷曲还会等待来自服务器的响应并终止我的页面吗?

我不知道你在这里问的是什么 - 它更多地暗示了你没有告诉我们的功能依赖。

听起来你选择了一个解决方案,现在正试图让它适合你的问题。