Magento 的批量导入机制,及数据库表 importexport_importdata

更新日期: 2025-09-13 阅读次数: 42 字数: 1292 分类: magento

找了半天 Magento 无法批量导入的问题,最后发现是 crontab 里设置了一个定时任务,每半小时 restart php fpm 的 docker 容器。导致 Magento 的批量任务没有执行完,就被 restart 中断了。如此反复,导致没有一个批量任务导入成功的。 我在 Magento 日志中,没有找到任何的相关日志,完全靠翻看数据库表结构,盲猜 magento 的导入机制,才解决这个问题的。

记录一下排查中学到的 Magento 无用知识:

数据库表

有个数据表,名为 importexport_importdata,记录了需要导入的产品信息。

实际数据来源就是,后台上传的 csv 文件。

切割机制

magento 会默认按照 100 个产品为一组,作为一条记录。记录值为一段 json。

  • 前一百个,为一个列表
  • 后面的,为 map。key 为数字编号,从 100 开始顺序编号。

这个切分单位 100 是可以通过配置文件修改的。

表结构

CREATE TABLE `importexport_importdata` (
  `id` int UNSIGNED NOT NULL COMMENT 'ID',
  `entity` varchar(50) NOT NULL COMMENT 'Entity',
  `behavior` varchar(10) NOT NULL DEFAULT 'append' COMMENT 'Behavior',
  `data` longtext COMMENT 'Data',
  `is_processed` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'Is Row Processed',
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'timestamp of last update'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='Import Data Table';

数据示例

INSERT INTO `importexport_importdata` (`id`, `entity`, `behavior`, `data`, `is_processed`, `updated_at`) VALUES
(868, 'catalog_product', 'append', '{\"0\":{\"sku\":\"M3AA-90LD-4\", ... }', 0, '2025-09-12 21:32:33');

清空上传队列

直接清空这个 importexport_importdata 表即可。

注意,最好不要使用 truncate,最好使用 delete。因为 truncate 会导致自增 id 被重置从 1 开始。不确定是否有其他表关联了这个 id,所以使用 delete 保险一点。

524 超时问题

如果在 magento 后台,批量导入的 csv 中包含数量巨大的产品。例如,超过 1000 个。大概率会遇到一直转圈处理中的提示。从浏览器调试工具看,查询进度的请求报了 524 错误。这是一个 cloudflare 的超时状态码。

其实,只要 csv 的里的产品数据,被存储到了导入队列表,那就可以关闭 magento 后台网页,甚至关闭浏览器。等待处理完成即可。

处理顺序机制

观察了一下 magento 的导入队列处理过程。发现,并不是顺序处理的。即不是按照 id 从小到大逐一处理的。从导入数据看,会同时导入前面几条记录中的产品信息(通过 SKU 搜索来排查)。

而且,导入是否成功的状态,是按照队列记录来的,而不是单个独立产品。所以,我猜测,这个队列处理机制是,定时任务处理队列记录,取出一条记录,解析出来产品列表,逐一保存。如果一条队列记录的处理被打断,例如运行时间过长,下次会从头重新处理。

比较诡异的是,这个处理是否完成,是批量同时更新的。例如,一批 2000 个产品,被分割成了 20 条处理记录。处理完成时间是一样的。。。而不是逐个完成。

magento 批量导入

后台产品列表更新不及时

从产品的创建时间看,写入数据库是实时的,但是不能及时在后台产品列表中看到产品。猜测是索引数据需要时间,有较长的滞后性,不知道创建索引是否也是以 100 为单位批量进行的。

代码质量堪忧

整体感觉 magento 的代码质量不太行,例如这个批量导入的体验极差

  • 导入速度巨慢
  • 前端进度提示跟没有一样。做成百分比进度会直观不少。
  • 批导队列的处理,看起来也存在重复操作的隐患

一个大胆的想法

我可以通过程序直接插入这个 mysql 表,importexport_importdata,就绕过了完全没有头绪的 magento php 接口,来实现批量导入。

得测试一下看看可行性如何。

关于作者 🌱

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式