stellt das Thinkphp-Queue-Problem vor. Ich hoffe, es wird für Freunde hilfreich sein, die es brauchen! Verwendete Version: TP5.1, thinkphp-queue 2.0
MySQL-Timeout und Verbindungstrennungsproblem
Konfigurieren Sie die Trennung und Wiederverbindung in der Konfigurationsdatei database.php
:
// 是否需要断线重连 'break_reconnect' => true, // 断线标识字符串 'break_match_str' => ['2006'],
Nach der Konfiguration erscheint ein weiterer Fehler im Protokoll: PDO::prepare(): send of 60 Bytes fehlgeschlagen mit errno=32 Broken Pipe, aber es hat keinen Einfluss auf die Ergebnisse der Programmausführung. Denn nach dem Trennen und erneuten Verbinden gibt das Programm einen Fehler aus:
...} 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
一般情况下,可以使用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
开头添加:
日志将输出到runtime
目录的queue-cli.log
So überwachen Sie den Prozess in der Docker-Umgebung
docker exec -i php7 php /path/to/think queue:work --queue=my-queue-name --sleep=3 --daemon
🎜🎜Neustart: docker exec -i php7 php /path/to/think queue:restart
(Nach dem Neustart ist der Warteschlangenprozess verschwunden), dann starten Sie erneut🎜🎜🎜Sehen Sie sich den Warteschlangenprozess an: ps -aux | 🎜🎜 Protokollanpassung🎜🎜Manchmal geht das Programm aus irgendeinem Grund schief und es wird eine große Anzahl von Protokollen generiert. Es ist am besten, die Protokolle anzupassen und zu trennen. Fügen Sie am Anfang der Konfigurationsdatei config/queue.php
hinzu: 🎜rrreee🎜Das Protokoll wird in der Runtime in die Datei <code>queue-cli.log
ausgegeben Verzeichnis 🎜 🎜Das obige ist der detaillierte Inhalt vonÜber die Lösung von Thinkphp-Queue-Problemen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!