Officiellement, il est dit que tous les processus des travailleurs et des tâches peuvent être redémarrés en douceur via
$swoole->reload() ou swoole_process::kill($ master_pid , SIGUSR1), ou kill directement -USR1 master_pid, etc.
Apprentissage recommandé : Tutoriel vidéo swoole
Test simple
Ouvrez un swoole_http_server, le processus de travail et le processus de tâche sont tous deux 1 Ensuite, le navigateur lance une requête http, et le contenu de la requête n'est qu'une simple veille. Grâce à la fonction de veille, il devrait pouvoir indiquer que le travailleur traitant cette requête est en état de fonctionnement, puis effectuer une opération de rechargement pendant. la période de sommeil.
Lorsqu'une requête est lancée sur le serveur swoole pour la première fois, le processus gestionnaire planifiera la requête auprès du travailleur pour traitement. Puis, pendant la période de sommeil du traitement du travailleur, si une autre requête arrive, la requête est envoyée au serveur swoole pour la première fois. Le gestionnaire n'enverra pas la demande suivante. La demande est planifiée pour le seul processus de travail, car le processus de travail est toujours occupé à traiter la première demande. Cela peut être confirmé par un simple test.
Les requêtes http sont simplement acheminées ci-dessous. Étant donné que le framework easyswoole est utilisé, l'exécution de la commande php easyswoole reload all équivaut en fait à kill -USR1 master_pid.
Configuration du serveur
$swoole_server->set([ 'worker_num' => 1, 'task_worker_num' => 1, 'reload_async' => true, 'max
Démarrer les tests
1 La logique de la tâche est écrite dans le processus de travail
Méthode http
public function test() { $start = microtime(true); echo '请求开始时间:' . $start . PHP_EOL; echo 'pid: ' . getmypid() . PHP_EOL; sleep(30); # 这里睡眠脚本作测试 echo 'finish sleep' . PHP_EOL; $end = microtime(true); echo '请求结束时间:' . $end . PHP_EOL; $this->writeJson(0, round(($end - $start), 3)); }
Surveiller. onWorkerStart ()Method
EventHelper::registerWithAdd(ServerManager::getInstance()->getMainEventRegister(),EventRegister::onWorkerStart,function (\swoole_server $server,$workerId){ if(PHP_OS != 'Darwin'){ $name = Config::getInstance()->getConf('SERVER_NAME'); if( ($workerId < Config::getInstance()->getConf('MAIN_SERVER.SETTING.worker_num')) && $workerId >= 0){ $type = 'Worker'; }else{ $type = 'TaskWorker'; } cli_set_process_title("{$name}.{$type}.{$workerId}"); } # 下面是打印测试的 if ($type == 'Worker') { echo "这个是reload worker的时间:" . microtime(true) . "\n"; } if ($type == 'TaskWorker') { echo "这个是reload TaskWorker的时间:" . microtime(true) . "\n"; } });
Résultat du test :
Heure de début de la demande : 1566880257.9533 # L'interface http est demandée ici, qui est test()
pid : 42108
c'est le moment de recharger TaskWorker : 1566880265.1501 # C'est le moment d'exécuter php easyswoole reload all. Parce que le tasker est inactif et n'a aucune tâche, il peut être rechargé immédiatement.
Voici le temps de rechargement du travailleur : 1566880275.1524 # C'est le temps de rechargement du travailleur, car sleep(30) est en test() et qu'il dépasse max_wait_time, la couche inférieure ne continuera pas à attendre la tâche du travailleur à terminer, et directement L'ancien travailleur a été licencié, mais « terminer le sommeil » n'a pas été imprimé et un nouveau travailleur a été créé.
#Mais pourquoi faut-il 10 secondes pour recréer l'ouvrier ? Max_wait_time est réglé sur 5 s ? ? C'est quelque chose que je n'ai jamais réussi à comprendre.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!