微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何防止大型“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 举报,一经查实,本站将立刻删除。