php - 如何防止大型“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”的使用以及这是否真的是要走的路?
提前致谢。
解决方案
推荐阅读
- database - PL/SQL ORA-29280: 无效的目录路径和 ORA-06512: 在 oracle 11g 中的“SYS.UTL_FILE”
- python - 如何在 Django 中添加默认不支持的语言?
- python - 如何检查是否在 tkinter 上单击了按钮
- c# - 将 String 转换为 String[] 但在撇号中不使用逗号
- r - ddply 和 group_by 的更快替代方案
- r - 带有 data.table 的每个自变量的线性回归循环
- css - 带有省略号的 CSS3 flexbox 布局在移动 Safari 上不起作用
- sql-server - SQL Server 2012 合并复制 - 全文索引
- mysql - django扩展查询条件`COLLATION`
- python - 如何在标注器之前/之后强制在 spacy 中使用 pos 标签?