Home
Download
Document
Forum
Video
Donate
Source Code
Sponsors
AI 助理
Products
Swoole-Compiler
CRMEB 新零售社交电商系统
Vprix 远程桌面系统
Login
Register
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。
### 问题描述 ### Swoole版本,PHP版本,以及操作系统版本信息 ### 相关代码 ```php 请将代码粘贴至此处(请勿用截图)//多进程管理模块 $pool = new Process\Pool(2); //让每个OnWorkerStart回调都自动创建一个协程 $pool->set(['enable_coroutine' => true]); $pool->on('workerStart', function ($pool, $id) { //每个进程都监听9501端口 $server = new Coroutine\Server('127.0.0.1', 9501, false, true); $server->set([ 'open_eof_check'=>true, //是否检测结尾 'package_eof'=>PHP_EOL, //结尾标识,这里的结尾最好使用不容易跟真正的body混淆的字符 'open_eof_split'=>true //必须开启切割 ]); //收到15信号关闭服务 Process::signal(SIGTERM, function () use ($server) { $server->shutdown(); }); //接收到新的连接请求 并自动创建一个协程 $server->handle(function (Connection $conn) { while (true) { $pid = posix_getpid(); //接收数据 $data = $conn->recv(1); $data = rtrim($data,PHP_EOL); echo "pid:{$pid};服务端接收的数据:{$data}\n"; //----数据处理---- //---- if ($data === '' || $data === false) { $errCode = swoole_last_error(); $errMsg = socket_strerror($errCode); echo "errCode: {$errCode}, errMsg: {$errMsg}\n"; $conn->close(); break; } //发送数据 $conn->send('完成'); Coroutine::sleep(1); } }); //开始监听端口 $server->start(); }); $pool->start(); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 为什么recv()打印出来的pid都是同一个? 如何使用多进程去接收数据?
发布于2年前 · 20 次浏览 · 来自
提问
次房间卡
### 问题描述 ### Swoole版本,PHP版本,以及操作系统版本信息 ### 相关代码 ```php 请将代码粘贴至此处(请勿用截图)//多进程管理模块 $pool = new Process\Pool(2); //让每个OnWorkerStart回调都自动创建一个协程 $pool->set(['enable_coroutine' => true]); $pool->on('workerStart', function ($pool, $id) { //每个进程都监听9501端口 $server = new Coroutine\Server('127.0.0.1', 9501, false, true); $server->set([ 'open_eof_check'=>true, //是否检测结尾 'package_eof'=>PHP_EOL, //结尾标识,这里的结尾最好使用不容易跟真正的body混淆的字符 'open_eof_split'=>true //必须开启切割 ]); //收到15信号关闭服务 Process::signal(SIGTERM, function () use ($server) { $server->shutdown(); }); //接收到新的连接请求 并自动创建一个协程 $server->handle(function (Connection $conn) { while (true) { $pid = posix_getpid(); //接收数据 $data = $conn->recv(1); $data = rtrim($data,PHP_EOL); echo "pid:{$pid};服务端接收的数据:{$data}\n"; //----数据处理---- //---- if ($data === '' || $data === false) { $errCode = swoole_last_error(); $errMsg = socket_strerror($errCode); echo "errCode: {$errCode}, errMsg: {$errMsg}\n"; $conn->close(); break; } //发送数据 $conn->send('完成'); Coroutine::sleep(1); } }); //开始监听端口 $server->start(); }); $pool->start(); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 为什么recv()打印出来的pid都是同一个? 如何使用多进程去接收数据?
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
还没有评论!
微信公众号
热门内容
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。