我正试图将巨大的.csv文件导入数据库。它是Drupal数据库,我正在将产品导入到节点、content_type_和uc_products表中。但这并不重要,因为由于性能优化,我停止使用Drupal函数node_load和/或node_save,并通过SQL命令直接插入/更新记录。
场景:
- 将整个csv文件从本地服务器(约40MB)读取到变量(以防止访问每个记录的文件)
- 将其解析为每行数组
-
将每一行解析为字段
-
检查数据库中的记录是否存在(1 SQL选择,比较特定字段)
- 如果存在,请更新它(1个SQL更新)
-
如果不存在,则插入(3次插入,1次更新)
6.1.如果记录有图像代码,并且与数据库中的图像代码不同,请从外部服务器下载(curl)新的图像文件,并将其保存在本地服务器。
-
日志表的1个额外延迟插入
当我运行此脚本时,在大约10k条导入记录和页面停止加载后,我得到了502代理错误(原因:从远程服务器读取时出错)。但是,导入仍在继续(仍在向表中添加新记录)。这在20公里至26公里(尝试了几次)的记录后停止。
两个问题:代理错误是什么?为什么我会得到一个?如何进一步优化我的脚本?有没有其他常见的方法可以将大量数据导入MySQL?
非常感谢。
我认为您的squid代理(或其他)有max_request_body_size限制。您应该联系代理管理员以允许更大的POST请求主体,或者将CSV分成更小的部分,并对每个CSV重复步骤。
或者你可以查看这篇文章:https://serverfault.com/questions/185894/proxy-error-502-reason-error-reading-from-remote-server-with-apache-2-2-3-de
这听起来像是你和php代码之间的代理服务器(如果这是你的设置,很可能是服务器上的反向代理)正在放弃等待脚本的响应。
虽然您可能可以调整这些超时,但就我个人而言,我会尝试将像这样的长时间操作与http生命周期脱钩。不是php开发人员,所以不知道常见的pho方法是什么。