如何防止大型“do while”循环导致 504 网关超时错误?

问题描述

我希望有人能在这里帮助我。我正在构建一个 wordpress 插件,它将从 XML 提要中提取数据并将其存储在数据库表中。数据包括图像,所以它也会将所有图像下载到 wordpress 的“上传文件夹中,这样当数据显示站点的前端时,它就不必进行远程调用显示这些图像。>

当从 XML 提要中提取大约 100 个项目时,没问题。但在某些情况下,可能需要拉入 500 - 1000 个项目,这需要大量时间,当然会导致 504 网关超时错误

这是我正在运行的函数

function add_items_to_database(){
    global $wpdb;
    $items_table = $wpdb->prefix . "stored_items";

    // CREATE ARRAY FROM SUBMITTED ITEM ID'S //
    $items_ids = explode(',',$_POST['item_ids']);

    // GET EACH ITEMS FROM XML Feed AND STORE THEM IN THE WEBSITE DATABASE //
    $allItems = array();
    foreach($item_ids as $item_id){
        $i=0;

        do{
            $request_url = 'https://example.com/Item/RSS?ouid='.$item_id.'&pageindex=' . $i . '&searchresultsperpage=thirty';
            $results = getItems($request_url);
            $xml = simplexml_load_string($results,"SimpleXMLElement",LIBXML_NOCDATA);
            $json = json_encode($xml);
            $array = json_decode($json,TRUE);
            $itemsCount = $array['items']['@attributes']['totalcount'];
            foreach($array['entry'] as $item){
                $allItems[] = $item['item']['@attributes']['itemid'];
            }
            $i++;
        } while (count($allItems) < $itemsCount);

        foreach($allItems as $item_id){
            $item = get_item($item_id);
            $fields = get_item_fields($item);
            $wpdb->insert($items_table,$fields);
        }
    }
}

这里,“getItems”是另一个函数,它只是从 XML 提要中获取所有 item_id 的数组。然后对于这些 id 中的每一个,“get_item”然后获取该项目的所有 XML 数据。 “get_item_fields”然后将来自 XML 提要的每一位数据分配给名为 $fields 的 PHP 数组变量,并下载所有图像并将其新的本地 URL 也存储在该 $fields 变量中。然后将 $fields 变量的内容保存到数据库中。

当然,现在看来是下载所有图像文件导致系统挂起时间最长并导致网关超时问题。

经过一番谷歌搜索后,似乎有人建议我可以通过使用“curl_multi”并行运行所有这些进程来解决这个问题。我真的根本不熟悉 curl 并且我在理解它时遇到了一些麻烦。我希望有人能够阐明我如何能够更改上述代码以正确实现“curl_multi”的使用,以及这是否真的是可行的方法

提前致谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)