首页 > 解决方案 > 如何防止大型“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”的使用以及这是否真的是要走的路?

提前致谢。

标签: phpwordpresstimeoutcurl-multi

解决方案


推荐阅读