>  기사  >  PHP 프레임워크  >  thinkphp-queue 문제 해결 정보

thinkphp-queue 문제 해결 정보

藏色散人
藏色散人앞으로
2021-02-23 15:13:295419검색

튜토리얼 칼럼에서 소개한 내용입니다. 필요한 친구들에게 도움이 되었으면 좋겠습니다! 사용 버전: TP5.1, thinkphp-queue 2.0

mysql 시간 초과 및 연결 끊김 문제

큐 작업이 일정 시간 동안 실행되고 오류 메시지가 나타납니다: SQLSTATE[HY000]: 일반 오류: 2006 MySQL 서버가 사라졌습니다. 솔루션 및 분석:

구성 파일 database.php에서 연결 해제 및 재연결을 구성하세요.

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

구성 후에는 로그에 또 다른 오류가 표시됩니다: PDO::prepare(): send of errno=32 Broken Pipe로 인해 60바이트가 실패했지만 프로그램 실행 결과에는 영향을 미치지 않습니다. 연결을 끊었다가 다시 연결하면 프로그램에서 오류가 발생하기 때문입니다.

...} 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;}

database.php中配置断线重连:

[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=trueautorestart=truenumprocs=1user=root
stopasgroup=truekillasgroup=trueredirect_stderr=truestdout_logfile=/path/to/your-queue.log

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

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

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

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

1.将supervisor安装到php服务所在的容器中

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

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

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

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

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

rrreee

方法三有点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开头添加:

rrreee

日志将输出到runtime目录的queue-cli.logDocker 환경에서 프로세스를 모니터링하는 방법

일반적인 상황에서는 감독자를 사용하여 대기열 프로세스를 모니터링할 수 있습니다. Docker와 함께 사용하는 경우 다음과 같은 옵션이 있을 수 있습니다. 🎜🎜1. PHP 서비스가 있는 컨테이너에 감독자를 설치합니다. 🎜🎜2. 새 컨테이너를 실행하여 대기열 작업을 실행합니다. 감독자는 필요하지 않으며 컨테이너 자체는 데몬입니다. ) 🎜🎜3 .기존 PHP 컨테이너에서 직접 대기열 작업 실행(명령줄에서 –daemon 옵션 사용) 🎜🎜방법 1 감독자 참조 구성(/etc/supervisor/conf.d에 위치, 파일 이름은 { file-name}.conf): 🎜rrreee🎜방법 2: 새 미러 참조 구성 열기(docker-compose.yml에 서비스 추가): 🎜rrreee🎜방법 3은 온라인 환경을 크게 변경하지 않기 위해 약간 해킹됩니다. , 마지막으로 방법 3(호스트 시스템에서 작동)을 사용합니다. 🎜🎜시작: 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 시작 부분에 추가: 🎜rrreee🎜로그는 런타임의 <code>queue-cli.log 파일에 출력됩니다. 디렉토리 🎜                      🎜

위 내용은 thinkphp-queue 문제 해결 정보의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제