Über die Lösung von Thinkphp-Queue-Problemen

藏色散人
Freigeben: 2021-02-24 09:01:05
nach vorne
5430 Leute haben es durchsucht

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

Die Warteschlangenaufgabe wird eine Zeit lang ausgeführt und es wird eine Fehlermeldung angezeigt: SQLSTATE[HY000]: Allgemeiner Fehler: 2006 Der MySQL-Server ist verschwunden. Lösung und Analyse:

Konfigurieren Sie die Trennung und Wiederverbindung in der Konfigurationsdatei database.php:

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

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;}
Nach dem Login kopieren

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
Nach dem Login kopieren

配置后虽然日志中会出现另一个报错: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
Nach dem Login kopieren

如何在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'],]);
Nach dem Login kopieren

方法二新开一个镜像参考配置(在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.logSo überwachen Sie den Prozess in der Docker-Umgebung

Unter normalen Umständen können Sie Supervisor verwenden, um den Warteschlangenprozess zu überwachen. Bei Verwendung mit Docker gibt es wahrscheinlich mehrere Optionen: 🎜🎜1. Installieren Sie den Supervisor in dem Container, in dem sich der PHP-Dienst befindet. 🎜🎜2. Führen Sie einen neuen Container aus, um Warteschlangenaufgaben auszuführen (es ist kein Supervisor erforderlich, der Container selbst ist ein Daemon ) 🎜🎜3 .Führen Sie die Warteschlangenaufgabe direkt im vorhandenen PHP-Container aus (verwenden Sie die Option –daemon in der Befehlszeile) 🎜🎜Methode 1 Supervisor-Referenzkonfiguration (in /etc/supervisor/conf.d platzieren, die Datei heißt { Dateiname}.conf): 🎜rrreee🎜Methode 2: Öffnen Sie eine neue Spiegelreferenzkonfiguration (fügen Sie einen Dienst in docker-compose.yml hinzu): 🎜rrreee🎜Methode 3 ist etwas hackig, um die Online-Umgebung nicht wesentlich zu verändern Verwenden Sie schließlich Methode 3 (Betrieb auf dem Host-Computer). 🎜🎜Starten: 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!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage