首頁  >  文章  >  php框架  >  關於thinkphp-queue問題解決

關於thinkphp-queue問題解決

藏色散人
藏色散人轉載
2021-02-23 15:13:295433瀏覽

使用版本: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服務所在的容器中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=trueautorestart=truenumprocs=1user=root
stopasgroup=truekillasgroup=trueredirect_stderr=truestdout_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

                       

                     

以上是關於thinkphp-queue問題解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除