🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## aphp ~~~ // 主进程上不支持事件循环,不支持定时器 // 进程层级不能超过二级 // 同一个进程内只支持一种类型的 事件循环 // 通常,主进程 wait() 负责监听收养子进程,子进程 eventLoop() 运行事件循环 // 主进程也叫父进程,如果只定义一个进程,并无子进程,那么它不算父进程,可以使用 eventLoop() // wait() eventLoop() 后的代码不会被执行,所以二者不能在一个进程内同时使用 ~~~ ```php <?php use aphp\Process; use aphp\IPC; use aphp\TcpServer; // GLOBALS_1 process::$event = new \aphp\Event\Select(); process::config([]); // 申明主进程 $master = process::create([ 'name' => 'master process', 'workdir' => __DIR__, 'umask' => 0, 'user' => 'root', 'group' => 'root', 'tty' => 'rtty', 'daemon' => true, ]); // 申明 主进程开始后 $master->onStart = function ($process) { echo "master: $process->pid"; $ipc = new IPC('unix:/temp/ipc-{uuid}.sock'); $ipc->register($process->pid); // $process->bindIPC($ipc); // 无序接收消息 [非会话消息 on] $process->onIPCMessage = function ($message, $ipc) { // $ipc->pid }; // 会话消息 // 向该 IPC 上所有绑定的进程发送消息(除了自己) $process->sendIPCAll('msg'); // $ipc->sendAll('msg'); // [异步非会话] 消息 $process->sendIPC($process->pid, 'msg'); // 给自己发送 [异步会话] 消息,不会触发 [非会话消息 on] $process->sendIPC($process->pid, 'msg', function ($msg) {}); // $ipc->send($process->pid, 'msg', function ($msg) {}); // 给自己发送必回消息,即发送并同步阻塞直至接收到消息(接收回复超时 .5s) $recvMsg = $process->sendRecvIPC($process->pid, 'msg', 0.5); // $recvMsg = $ipc->sendRecv($process->pid, 'msg', 0.5); // GLOBALS_2 // 申明 创建子进程 // 返回子进程实例 $child = $process->child([ 'num' => 4, 'name' => 'child process', 'workdir' => __DIR__, ]); // 申明 子进程开始后 $child->onStart = function ($process) use ($ipc) { echo "child: $process->id : $process->pid : $process->ppid"; $ipc->register($process->id); $process->onIPCMessage = function ($message, $ipc) { // 来自父进程的消息 if ($ipc->pid === $process->ppid) { } // 来自兄弟进程的消息 if ($process->isBrother($ipc->pid)) { } }; $tcpServer = new TcpServer('tcp://0.0.0.0:81'); $tcpServer->onConnect = function ($connect) {}; $tcpServer->onClose = function ($connect) {}; $tcpServer->onError = function ($connect) {}; $tcpServer->onBreak = function ($connect) {}; $tcpServer->onMessage = function ($connect) {}; $tcpServer->onRead = function ($connect) {}; $tcpServer->listen(); // $tcpServer->accept(); // 前两个子进程不做网络服务 if ($process->id > 1) { $child->addSocketObserver($tcpServer); } // GLOBALS_3 if (0 == $process->id) { // 第一个子进程什么都不做 } if (1 === $process->id) { // 第二个子进程加一个定时器 // 每隔 1s 给其它兄弟进程发信息 Timer::add(1, function () use ($process) { $process->sendIPC($process->brotherPids, time()); }); // 每隔 15s 给 祖先进程 发信息 Timer::crontab('*/15 * * * * *', function () use ($process) { $process->sendIPC($process->ancestorsPid, 'hello'); }); } }; // $child->onXXX ... // $child->eventLoop(); // process::$event->loop(); }; $master->onStarted = function () { }; // $master->onXXX ... $master->wait(); // $master->eventLoop(); // $child->eventLoop(); ``` ---- [linux之wait()和waitpid()详解_lwz-qq的博客-CSDN博客_linux wait()](https://blog.csdn.net/lwz15071387627/article/details/87991394?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0-87991394-blog-116556619.pc_relevant_multi_platform_whitelistv1&spm=1001.2101.3001.4242.1&utm_relevant_index=3)