Swoole 사용자 정의 프로젝트 초기화 이벤트 처리 구현 방법(코드)
이 글의 내용은 Swoole 커스텀 프로젝트 초기화 이벤트 처리(코드)를 구현하는 방법에 대한 내용입니다. 필요한 친구들이 참고하시면 좋을 것 같습니다.
최근 Swoole을 기반으로 개발된 imi 프레임워크를 사용하여 프로젝트를 개발하다가 프로젝트 초기화 처리를 해야 한다는 요구사항이 발생했습니다. 초기화 프로세스가 완료되기 전에 Swoole이 요청을 처리하는 것을 원하지 않습니다. 일부 로드되지 않은 값이 있을 수 있으므로 요청 처리에 문제가 발생할 가능성이 높습니다.
문제 해결을 위한 사고 과정과 데모 코드는 아래와 같습니다.
우선 분석 후 Swoole은 다중 프로세스 모드로 실행되며 Master, Manager, Worker 프로세스로 구분됩니다.
마스터 프로세스는 서비스를 시작하는 cli 명령 파일이 위치한 프로세스입니다. 여기서 로드된 모든 클래스와 전역 변수는 다른 Worker 프로세스에서 사용할 수 없으며 초기화에 문제가 있습니다. 적용하려면 다시 시작해야 합니다.
Manager 프로세스의 상황은 기본적으로 위와 동일합니다.
그러면 Worker 프로세스만 처리를 하는데, WorkerStart 이벤트에 쓰면 각 Worker 프로세스가 이를 실행하게 됩니다.
WorkerStart 이벤트 정의:
function onWorkerStart(swoole_server $server, int $worker_id);
그렇다면 이것은 처리하기 쉽고 직접 판단합니다. 작업자 ID 프로젝트 초기화 이벤트를 트리거하려면 0입니다. 남은 질문은 초기화 실행이 완료될 때까지 모든 작업자 프로세스가 요청을 처리하지 못하도록 하는 방법입니다.
고민하고 시도해본 후, 이 문제는 코루틴을 걸면 해결될 수 있습니다. 데모 코드는 다음과 같습니다.
<?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); } }
초기화가 완료되었는지 판단하면 됩니다. 초기화되지 않은 경우 요청 이벤트 완료되면 현재 코루틴이 일시 중지되고 코루틴 ID가 전역 변수에 추가됩니다.
0번째 작업자 프로세스가 초기화를 완료하면 초기화 기간 동안 들어온 요청이 이때 다른 작업자 프로세스에 메시지를 보내 일시 중단된 코루틴을 깨웁니다.
관련 권장사항:
사용자 정의 events_javascript 기술의 javascript 구현에 대한 자세한 설명
#🎜 🎜#프로젝트에서 Angularjs 사용자 정의 지침을 사용하는 방법
위 내용은 Swoole 사용자 정의 프로젝트 초기화 이벤트 처리 구현 방법(코드)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP에서 데이터베이스 작업은 매우 쉽습니다. 이번 장에서는 CRUD(생성, 읽기, 업데이트, 삭제) 작업을 이해하겠습니다.

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

CakePHP에 로그인하는 것은 매우 쉬운 작업입니다. 한 가지 기능만 사용하면 됩니다. cronjob과 같은 백그라운드 프로세스에 대해 오류, 예외, 사용자 활동, 사용자가 취한 조치를 기록할 수 있습니다. CakePHP에 데이터를 기록하는 것은 쉽습니다. log() 함수는 다음과 같습니다.

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는
