WordPress save_post钩子调用长耗时脚本报AH01075超时如何解决
问题解决方案
你遇到的AH01075: Error dispatching request to : (polling)是Apache转发请求到PHP处理进程(多为php-fpm)时,等待响应时长超过配置阈值触发的,仅修改PHP执行时长限制无法解决,可根据实际场景选择以下方案:
一、配置调整方案(保留现有同步执行逻辑)
需要从接入层到PHP层同步调大超时阈值,避免中间层提前断开连接:
- Apache配置调整
找到对应站点的Apache配置文件(路径通常为/etc/httpd/conf.d/下的站点conf,或Debian/Ubuntu系/etc/apache2/sites-available/下的站点配置),在php-fpm代理配置段添加超时参数:
上述配置将代理超时设为300秒(5分钟),可根据脚本实际耗时调整数值,修改后执行<Proxy "unix:/run/php-fpm/www.sock|fcgi://php-fpm"> ProxySet timeout=300 </Proxy> <FilesMatch \.php$> SetHandler "proxy:fcgi://php-fpm" </FilesMatch>systemctl restart httpd(RHEL/CentOS系)或systemctl restart apache2(Debian/Ubuntu系)重启服务生效。 - PHP配置调整
同步修改PHP运行参数,找到对应版本的php.ini文件,调整以下参数:
若不想修改全局配置,可在max_execution_time = 300mysave函数开头临时设置执行时长:
若PHP开启安全模式,function mysave($post_id, $post){ @set_time_limit(300); // 原有调用Python脚本的业务逻辑 } add_action('save_post', 'mysave',10,2);set_time_limit会被禁用,必须修改全局php.ini,修改后重启php-fpm生效。 - 多层代理额外配置
如果你用了Nginx反向代理到Apache的架构(常见于商用面板环境),还需要在Nginx站点配置中添加以下参数:
修改后重启Nginx生效。proxy_read_timeout 300; proxy_connect_timeout 300; fastcgi_read_timeout 300;
二、根本解决方法(推荐,彻底规避超时风险)
禁止在save_post钩子的同步请求流程中执行长耗时任务,这类逻辑应该丢到后台异步执行,用户保存文章时无需等待脚本跑完就能收到成功响应,从根源上避免超时问题:
- 借助WordPress自带的定时任务机制实现异步调用,改造原有代码如下:
add_action('save_post', 'mysave',10,2); function mysave($post_id, $post){ // 过滤自动保存、修订版本,避免重复入队 if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) { return; } // 将任务推送到异步队列,绑定自定义处理钩子 wp_schedule_single_event(time(), 'run_python_script_task', [$post_id]); } // 绑定实际执行逻辑到自定义钩子 add_action('run_python_script_task', 'exec_python_script'); function exec_python_script($post_id){ // 原有调用Python脚本的逻辑,执行时不会阻塞前台保存请求 exec("python3 /your/script/path/demo.py {$post_id} > /dev/null 2>&1 &"); } - 为了提升异步任务稳定性,建议配置系统级定时任务触发WP-Cron,替代默认的前端访问触发模式:
- 在站点根目录的
wp-config.php中添加配置,禁用默认前端触发:
define('DISABLE_WP_CRON', true);- 在系统crontab中添加定时任务,每分钟执行一次WP-Cron:
该方案下无论Python脚本执行多久,都不会影响文章保存的请求响应,不会出现连接超时问题,也不会因为脚本执行时间过长导致用户保存文章时页面长时间无响应。* * * * * www-data /usr/bin/php /path/to/wordpress/wp-cron.php > /dev/null 2>&1 - 在站点根目录的
注意:不建议将超时阈值设置超过600秒,一旦Python脚本出现死锁、异常阻塞,过长的超时会导致大量服务进程被占用,直接拖垮站点可用性,优先选择异步执行方案。
内容的提问来源于stack exchange,提问作者Martha
相关产品推荐
相关产品推荐

