You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress Cron脚本内存耗尽求助:调优配置后仍报错

WordPress Cron脚本导入WooCommerce时内存耗尽问题排查

错误信息

Fatal error: Out of memory (allocated 767115264) (tried to allocate 20480 bytes) in wp-content/plugins/wp-crontrol/src/bootstrap.php(2228) : eval()'d code on line 154

Fatal error: Out of memory (allocated 767115264) (tried to allocate 69632 bytes) in wp-includes/functions.php on line 4830

场景说明

通过WP Crontrol插件设置Cron脚本,从API拉取数千个产品导入WooCommerce,每次导入15个产品后触发内存耗尽错误,怀疑第16个产品数据量过大但无法定位。已做的配置:

  • 脚本顶部添加:ini_set('max_execution_time', 0);
  • php.ini设置:
    upload_max_filesize=10240M;
    post_max_size=20480M;
    memory_limit=10240M;
    
  • wp-config.php配置:
    define( 'WP_MEMORY_LIMIT', '10240M' );
    set_time_limit(0);
    

问题原因分析

  1. 内存配置未实际生效:错误显示仅分配了约732MB内存,远低于设置的10240M。可能是:
    • PHP配置被服务器php.ini、.htaccess或user.ini文件覆盖
    • WordPress的WP_MEMORY_LIMIT仅针对前台/后台,Cron脚本默认使用WP_MAX_MEMORY_LIMIT,未单独配置
  2. 脚本内存泄漏:循环导入时未及时释放变量内存,比如API返回的大数组、WooCommerce产品对象持续占用内存,导致累积耗尽
  3. 单产品数据过载:单个产品包含大量数据(高清图、多属性、自定义字段),一次性加载处理瞬间占用大量内存
  4. WP Crontrol执行环境限制:错误发生在eval()代码块中,插件的执行环境可能有独立的内存限制,不受全局配置影响

解决步骤

1. 确认内存配置生效

在Cron脚本开头添加代码,执行后查看实际内存限制:

echo ini_get('memory_limit');
die();

如果未达到10240M,做以下检查:

  • 重启php-fpm服务(若使用php-fpm环境),确保php.ini修改生效
  • Apache服务器可在根目录.htaccess添加:php_value memory_limit 10240M
  • Nginx+php-fpm环境检查是否存在user.ini文件覆盖配置
  • 在wp-config.php中补充设置:define( 'WP_MAX_MEMORY_LIMIT', '10240M' );

2. 修复脚本内存泄漏

每次循环导入产品后,手动清理变量并触发垃圾回收:

// 单个产品导入完成后执行
unset($product_data, $wc_product);
wp_cache_flush();
gc_collect_cycles();

3. 分段处理产品

  • 将API拉取改为分页模式,每次仅拉取10-15个产品,导入完成后再拉取下一页
  • 记录已导入的产品ID,避免重复处理,同时避免一次性加载数千条产品数据

4. 定位问题产品

在脚本中添加内存日志,记录每个产品的ID和内存使用情况:

$current_memory = round(memory_get_usage(true)/1024/1024, 2) . 'MB';
error_log("导入产品ID: {$product_id},当前内存使用: {$current_memory}");

查看服务器错误日志,崩溃前最后一条记录即为问题产品。

5. 优化产品数据处理

  • 产品图片改为异步下载,不要一次性加载所有图片资源
  • 多属性产品分批处理属性对象,避免一次性创建大量数据

6. 避开WP Crontrol的eval限制

放弃WP Crontrol的自定义脚本功能,创建独立PHP脚本,通过系统Cron直接执行:

// 独立脚本开头加载WordPress环境
require_once('wp-load.php');
// 后续写导入逻辑

内容的提问来源于stack exchange,提问作者KWS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:30:16