thinkphp-queue问题解决

使用版本:TP5.1、 thinkphp-queue 2.0

mysql 超时断线问题#

队列任务运行一段时间,出现:SQLSTATE [HY000]: General error: 2006 MySQL server has gone away 报错。

解决方法和分析:

配置文件 database.php 中配置断线重连:

  // 是否需要断线重连
  'break_reconnect'  =>  true,
  // 断线标识字符串
  'break_match_str'  => ['2006'],

配置后虽然日志中会出现另一个报错:PDO::prepare (): send of 60 bytes failed with errno=32 Broken pipe,但并不影响程序运行结果。因为断线重连后,程序都会抛出错误:

.
.
.} catch (\PDOException $e) {
 if ($this->isBreak($e)) {
 return $this->close()->query($sql, $bind, $master, $pdo);
 }throw new PDOException($e, $this->config, $this->getLastsql());
} catch (\Throwable $e) {
 if ($this->isBreak($e)) {
 return $this->close()->query($sql, $bind, $master, $pdo);
 }throw $e;
} catch (\Exception $e) {
 if ($this->isBreak($e)) {
 return $this->close()->query($sql, $bind, $master, $pdo);
  }
 throw $e;
} 

如何在 docker 环境进行进程监护#

一般情况下,可以使用 supervisor 监护队列进程。配合 docker 使用的话,大概有几方案:

  1. 将 supervisor 安装到 php 服务所在的容器中(2021-12-8 22:39:52 更新:这是多余的,用了容器就不要用 supervisor 了,因为容器的本质就是一个进程,也可以进行进程管理,比如,将容器设置为 always restart, 就可以达到常驻进程的效果

  2. 跑一个新的容器来运行队列任务(不用 supervisor,容器本身是一个 daemon)

  3. 直接在现有的 php 容器运行队列任务(命令行使用–daemon 选项)

方法一 supervisor 参考配置(放在 /etc/supervisor/conf.d, 文件命名为 {file-name}.conf):

[program:my_queue_name]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/think queue:work --queue=your-queue-name --sleep=3 --daemon
autostart=true
autorestart=true
numprocs=1
user=root
stopasgroup=true
killasgroup=true
redirect_stderr=true
stdout_logfile=/path/to/your-queue.log

方法二新开一个镜像参考配置(在 docker-compose.yml 中添加服务):

php-queue:
 container_name: queue
 image: docker_php-fpm73
 restart: always
 command: php path/to/think queue:work --sleep=3
 volumes:
 - ../project:/var/www/html
 - ./conf/php:/usr/local/etc/php
 - ./conf/php/conf.d:/usr/local/etc/php/conf.d
 - ./conf/supervisor:/etc/supervisor/conf.d
 networks:
 - mysql
 - nginx

方法三有点 hack,为了不大改线上环境,最后使用方法三(在 host 机子操作)。

启动:docker exec -i php7 php /path/to/think queue:work --queue=my-queue-name --sleep=3 --daemon

重启:docker exec -i php7 php /path/to/think queue:restart (重启后发现队列进程消失了),然后再启动

查看队列进程: ps -aux | grep queue

日志调整#

有时候某些原因程序出错,会有大量日志生成,最好调整下日志,单独出来。在配置文件 config/queue.php 开头添加:

use think\facade\Log;
Log::init([
    'single'    => 'queue',
    'file_size' => 1024 * 1024 * 10,
    'level'     => ['error'],
]);

日志将输出到 runtime 目录的 queue-cli.log 文件

本作品采用《CC 协议》,转载必须注明作者和本文链接
Was mich nicht umbringt, macht mich stärker
本帖由系统于 4年前 自动加精