PHP.csv(44k条记录)导入MySQL数据库时发生代理错误


PHP .csv (44k records) import to MySQL database crashes with Proxy error

我正试图将巨大的.csv文件导入数据库。它是Drupal数据库,我正在将产品导入到节点、content_type_和uc_products表中。但这并不重要,因为由于性能优化,我停止使用Drupal函数node_load和/或node_save,并通过SQL命令直接插入/更新记录。

场景:

  1. 将整个csv文件从本地服务器(约40MB)读取到变量(以防止访问每个记录的文件)
  2. 将其解析为每行数组
  3. 将每一行解析为字段

  4. 检查数据库中的记录是否存在(1 SQL选择,比较特定字段)

  5. 如果存在,请更新它(1个SQL更新)
  6. 如果不存在,则插入(3次插入,1次更新)

    6.1.如果记录有图像代码,并且与数据库中的图像代码不同,请从外部服务器下载(curl)新的图像文件,并将其保存在本地服务器。

  7. 日志表的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方法是什么。