【问题标题】:PHP .csv (44k records) import to MySQL database crashes with Proxy errorPHP .csv(44k 记录)导入 MySQL 数据库时因代理错误而崩溃
【发布时间】:2012-02-07 21:22:18
【问题描述】:

我正在尝试将巨大的 .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。如果record有图片代码且与数据库中的不一样,则从外部服务器下载(curl)新的图片文件并保存到本地服务器。

  7. 1 次延迟插入日志表

当我运行这个脚本时,我得到了 502 代理错误(原因:从远程服务器读取错误)。 10k 导入记录和页面停止加载。但是,导入仍在继续(新记录仍在添加到表中)。这会在 20k-26k(尝试多次)记录后停止。

两个问题: 那个代理错误是什么,为什么我会得到一个? 如何进一步优化我的脚本?是否有其他常用方法可以将大量数据导入 MySQL?

非常感谢。

【问题讨论】:

  • Import tool Excel CSV的可能重复
  • 对于 SQL 的东西,两天前我不得不做类似的事情 - 来自 CSV 文件的超过 600,000 条记录。我所做的是编写一个脚本来将 CSV 转换为 INSERT 语句(在您的情况下,您可以使用 WHERE 子句或 EXISTS 来使用条件插入)。我最终得到了一个 47m 的 SQL 文本文件,然后我将其与 mysql -uuser -ppass dbname <file.sql 一起使用。

标签: php mysql drupal csv import


【解决方案1】:

我认为你的 squid 代理(或其他)有 max_request_body_size 限制。 您应该联系代理管理员以允许更大的 POST 请求正文,或划分为较小的 CSV 部分并为每个部分重复步骤。

或者你可以查看这个帖子:https://serverfault.com/questions/185894/proxy-error-502-reason-error-reading-from-remote-server-with-apache-2-2-3-de

【讨论】:

    【解决方案2】:

    这听起来像是您和 php 代码之间的代理服务器(如果这是您的设置,很可能是服务器上的反向代理)正在放弃等待脚本的响应。

    虽然您可能可以调整这些超时,但我个人会尝试将此类非常长的操作与 http 生命周期分离。不是 php 开发人员,所以不知道常见的 pho 方法是什么。

    【讨论】:

      猜你喜欢
      • 2018-09-11
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 2021-05-16
      • 2018-05-22
      相关资源
      最近更新 更多