使用ssh->exec执行批量邮件推送脚本时进程中断的保活方案咨询
解决SSH执行邮件推送脚本进程中断的方案
当通过SSH执行邮件推送脚本,处理超过10k封邮件时进程无提示停止,主要是SSH会话限制、脚本资源不足或系统资源限制导致的,以下是具体解决方法:
1. 让进程脱离SSH终端会话
SSH会话关闭时,后台运行的进程会收到SIGHUP信号被强制终止。用nohup命令让进程脱离终端、忽略挂断信号,同时把输出重定向到日志文件:
nohup php applications/root/public_html/includes/php/workers/xxx.php > /var/log/mail_push.log 2>&1 &
nohup:让进程忽略挂断信号,持续运行> /var/log/mail_push.log:将标准输出写入日志2>&1:把错误输出重定向到标准输出,统一记录到日志&:让进程在后台运行
2. 解除PHP脚本的运行限制
PHP默认的内存和执行时间限制会中断大任务,需手动调整:
- 在脚本开头添加代码:
// 取消内存限制 ini_set('memory_limit', '-1'); // 取消执行时间限制 set_time_limit(0); - 或在命令行执行时直接指定参数:
php -d memory_limit=-1 -d max_execution_time=0 your_script.php
3. 启用日志排查问题
无提示停止的核心是不知道错误原因,必须记录日志。修改SSH执行的命令,为每个任务生成独立日志:
$ssh = new SSH2('example.com'); if (!$ssh->login('username', 'password')) { exceptionErrorHandler("Error logging in to server for " . $queue); } else { $logPath = "/var/log/mail_push_{$queue}.log"; $command = "nohup php -d memory_limit=-1 -d max_execution_time=0 applications/root/public_html/includes/php/workers/{$queue}.php > {$logPath} 2>&1 &"; $ssh->exec($command); }
后续进程停止后,可通过日志查看内存溢出、连接超时等具体原因。
4. 调整系统资源限制
发大量邮件会占用较多文件连接、内存等资源,需调整系统限制:
- 临时调整打开文件数限制(当前会话有效):
ulimit -n 65535 - 永久调整:编辑
/etc/security/limits.conf,添加:
替换username soft nofile 65535 username hard nofile 65535username为运行脚本的系统用户,重启系统生效。
5. 优化脚本稳定性
- 分批次处理:不要一次性加载10k+邮件到内存,每次处理1000封,处理完再取下一批,减少内存占用
- 错误捕获与重试:用
try-catch包裹邮件发送逻辑,单个邮件发送失败时重试2-3次,避免脚本整体终止 - 手动释放内存:处理完一批邮件后,
unset不需要的变量,调用gc_collect_cycles()触发垃圾回收
内容的提问来源于stack exchange,提问作者Maheskumar
相关产品推荐
相关产品推荐

