


How to implement Swoole custom project initialization event handling (code)
The content of this article is about how to implement Swoole custom project initialization event processing (code). It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.
Recently using the imi framework developed based on Swoole to develop a project, I encountered a requirement, which is to do project initialization processing. You don't want Swoole to handle the request before the initialization process is completed. Because there may be some values that are not loaded in, there is a high possibility of problems processing the request.
The thinking process and demo code for solving the problem are given below.
First of all, after analysis, Swoole runs in multi-process mode and is divided into Master, Manager and Worker processes.
The Master process is the process where the cli command file where we start the service is located. There is a problem with the initialization here. All loaded classes and global variables can be used in other Worker processes and cannot be hot restarted to take effect.
The situation of the Manager process is basically the same as above.
Then only the Worker process does the processing, but if it is written in the WorkerStart event, each Worker process will execute it.
WorkerStart event definition:
function onWorkerStart(swoole_server $server, int $worker_id);
Then this is easy to handle, directly determine the workerid is 0 To trigger the project initialization event. The remaining question is how to prevent all Worker processes from processing requests until the initialization execution is completed.
Thinked about it and tried it. This problem can be solved by hanging the coroutine. The demo code is as follows:
<?php use Swoole\Coroutine; $http = new swoole_http_server('127.0.0.1', 8080); $http->on('WorkerStart', function(swoole_http_server $server, $workerId){ $initFlagFile = __DIR__ . '/init.flag'; if(0 === $server->worker_id && (!is_file($initFlagFile) || file_get_contents($initFlagFile) != $server->manager_pid)) { // 处理项目初始化事件 initApp(); // 写入文件,保证不再重复触发项目初始化事件 file_put_contents($initFlagFile, $server->manager_pid); // 当前worker进程恢复协程 resumeCos(); // 通知其它worker进程 for($i = 1; $i < $server->setting['worker_num']; ++$i) { $server->sendMessage('init', $i); } } }); $http->on('PipeMessage', function(swoole_http_server $server, $srcWorkerId, $data) { if(0 === $srcWorkerId && 'init' === $data && !defined('APP_INITED')) { // 其它worker进程恢复协程 resumeCos(); } }); $http->on('request', function (swoole_http_request $request, swoole_http_response $response) { // 判断未初始化完毕,则挂起协程 if(!defined('APP_INITED')) { $GLOBALS['WORKER_START_END_RESUME_COIDS'][] = Coroutine::getuid(); Coroutine::suspend(); } $response->header('content-type', 'text/html;charset=utf-8'); $response->end('IMI 是一款基于 Swoole 开发的协程 PHP 开发框架,拥有常驻内存、协程异步非阻塞IO等优点。官方网站:<a href="https://imiphp.com" target="_blank">https://imiphp.com</a>'); }); $http->start(); /** * 处理项目初始化事件,比如这里延时5秒,模拟初始化处理 * * @return void */ function initApp() { $count = 5; for($i = 0; $i < $count; ++$i) { echo 'initing ', ($i + 1), '/', $count, PHP_EOL; sleep(1); } } /** * 恢复协程 * * @return void */ function resumeCos() { define('APP_INITED', true); $coids = $GLOBALS['WORKER_START_END_RESUME_COIDS'] ?? []; fwrite(STDOUT, 'suspend co count: ' . count($coids) . PHP_EOL); foreach($coids as $id) { Coroutine::resume($id); } }
By judging whether the initialization is completed in the request event, if the initialization is not completed, hang Start the current coroutine and add the coroutine ID to the global variable.
After the 0th worker process completes the initialization, it wakes up the suspended coroutines by sending messages to other worker processes. The requests that came in during the initialization period will be executed at this time.
Related recommendations:
Detailed explanation of javascript implementation of custom events_javascript skills
How to use Angularjs custom instructions in the project use
The above is the detailed content of How to implement Swoole custom project initialization event handling (code). For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

In this chapter, we will understand the Environment Variables, General Configuration, Database Configuration and Email Configuration in CakePHP.

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

To work with date and time in cakephp4, we are going to make use of the available FrozenTime class.

To work on file upload we are going to use the form helper. Here, is an example for file upload.

In this chapter, we are going to learn the following topics related to routing ?

CakePHP is an open-source framework for PHP. It is intended to make developing, deploying and maintaining applications much easier. CakePHP is based on a MVC-like architecture that is both powerful and easy to grasp. Models, Views, and Controllers gu

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

Validator can be created by adding the following two lines in the controller.
