使用版本: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使用的話,大概有幾方案:
將supervisor安裝到php服務所在的容器中
跑一個新的容器來執行佇列任務(不用supervisor,容器本身是一個daemon)
直接在現有的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 協議》,轉載必須註明作者和本文連結