首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
Process创建进程挂载到Server,发生异常自动重启后,exportSocket导出的Socket无法recv
### 问题描述 Process创建进程挂载到HttpServer,pipeType为SOCK_DGRAM,能正常在worker发送数据到Process,一旦发生异常自动重启后,exportSocket导出的Socket->recv总是空,无法在通信。是进程退出时把pipe销毁掉了么? ### Swoole版本,PHP版本,以及操作系统版本信息 ``` PHP 7.4.7 (cli) (built: Jun 12 2020 07:44:05) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.7, Copyright (c), by Zend Technologies Swoole => enabled Author => Swoole Team <team@swoole.com> Version => 4.5.2 Built => Aug 22 2020 06:35:03 coroutine => enabled epoll => enabled eventfd => enabled signalfd => enabled cpu_affinity => enabled spinlock => enabled rwlock => enabled sockets => enabled openssl => OpenSSL 1.1.1g 21 Apr 2020 http2 => enabled pcre => enabled zlib => 1.2.11 mutex_timedlock => enabled pthread_barrier => enabled futex => enabled mysqlnd => enabled async_redis => enabled Directive => Local Value => Master Value swoole.enable_coroutine => On => On swoole.enable_library => On => On swoole.enable_preemptive_scheduler => Off => Off swoole.display_errors => On => On swoole.use_shortname => On => On swoole.unixsock_buffer_size => 8388608 => 8388608 ``` ### 相关代码 https://github.com/NHZEX/think-swoole/blob/91d34cf741731900bb35f278436f838687f8fc59/src/contract/ProcessAbstract.php#L114-L138 ### 你期待的结果是什么?实际看到的错误信息又是什么? 进程重启后能通过pipe继续接收消息
发布于6年前 · 0 次浏览 · 来自
提问
zxin
### 问题描述 Process创建进程挂载到HttpServer,pipeType为SOCK_DGRAM,能正常在worker发送数据到Process,一旦发生异常自动重启后,exportSocket导出的Socket->recv总是空,无法在通信。是进程退出时把pipe销毁掉了么? ### Swoole版本,PHP版本,以及操作系统版本信息 ``` PHP 7.4.7 (cli) (built: Jun 12 2020 07:44:05) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.7, Copyright (c), by Zend Technologies Swoole => enabled Author => Swoole Team <team@swoole.com> Version => 4.5.2 Built => Aug 22 2020 06:35:03 coroutine => enabled epoll => enabled eventfd => enabled signalfd => enabled cpu_affinity => enabled spinlock => enabled rwlock => enabled sockets => enabled openssl => OpenSSL 1.1.1g 21 Apr 2020 http2 => enabled pcre => enabled zlib => 1.2.11 mutex_timedlock => enabled pthread_barrier => enabled futex => enabled mysqlnd => enabled async_redis => enabled Directive => Local Value => Master Value swoole.enable_coroutine => On => On swoole.enable_library => On => On swoole.enable_preemptive_scheduler => Off => Off swoole.display_errors => On => On swoole.use_shortname => On => On swoole.unixsock_buffer_size => 8388608 => 8388608 ``` ### 相关代码 https://github.com/NHZEX/think-swoole/blob/91d34cf741731900bb35f278436f838687f8fc59/src/contract/ProcessAbstract.php#L114-L138 ### 你期待的结果是什么?实际看到的错误信息又是什么? 进程重启后能通过pipe继续接收消息
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2020-09-04
鲁飞
发一个最简复现代码出来,不要直接就是tp-swoole的源码
赞
0
回复
2020-09-04
zxin
回复
鲁飞
我这个是自己维护得分支,不是tp的源码,我试试抽出来复现,主要是我确认这样用是否有问题
赞
0
回复
2020-09-04
zxin
回复
鲁飞
问题复现代码 ``` <?php use Swoole\Coroutine; use Swoole\Coroutine\Socket; use Swoole\ExitException; use Swoole\Http\Server; use Swoole\Process; use Swoole\Runtime; use Swoole\Timer; $serv = new Server('0.0.0.0', 9511); $serv->set([ 'worker_num' => 1, ]); $process = new Process(function (Process $proc) { Runtime::enableCoroutine(true); echo "process start#{$proc->id}, pid={$proc->pid}\n"; Coroutine::create(function () use ($proc) { /** @var Socket $socket */ $socket = $proc->exportSocket(); while (true) { $data = $socket->recv(); if ($data === false) { echo "process pipe: [{$socket->errCode}] {$socket->errMsg}\n"; break; } if ($data === '') { echo "process pipe: down [empty recv]\n"; break; } echo "process recv: {$data}\n"; } }); Timer::after(1000 * 5, function () { echo "warning!!!\n"; throw new ExitException('test'); }); }, false, SOCK_DGRAM, true); $serv->addProcess($process); $serv->on('workerStart', function (Server $serv) use ($process) { Runtime::enableCoroutine(true); echo "worker start#{$serv->worker_id}\n"; Timer::tick(1000, function () use ($process, $serv) { /** @var Socket $socket */ $socket = $process->exportSocket(); $str = date('H:i:s.') . mt_rand(); $socket->send("worker#{$serv->worker_id} send, {$str}"); }); }); $serv->on('request', function () { }); $serv->start(); ``` 执行结果 ``` vagrant@homestead:~/code$ php swp-test.php worker start#0 process start#1, pid=10432 process recv: worker#0 send, 15:01:12.1817550843 process recv: worker#0 send, 15:01:13.1258003387 process recv: worker#0 send, 15:01:14.823978948 process recv: worker#0 send, 15:01:15.1189333991 warning!!! PHP Fatal error: Uncaught Swoole\ExitException: test in /home/vagrant/code/swp-test.php:39 Stack trace: #0 {main} thrown in /home/vagrant/code/swp-test.php on line 39 Fatal error: Uncaught Swoole\ExitException: test in /home/vagrant/code/swp-test.php:39 Stack trace: #0 {main} thrown in /home/vagrant/code/swp-test.php on line 39 [2020-09-03 15:01:16 $10429.0] WARNING swManager_check_exit_status: worker#1[pid=10432] abnormal exit, status=255, signal=0 process start#1, pid=10433 process recv: worker#0 send, 15:01:16.728083935 process pipe: down [empty recv] warning!!! PHP Fatal error: Uncaught Swoole\ExitException: test in /home/vagrant/code/swp-test.php:39 Stack trace: #0 {main} thrown in /home/vagrant/code/swp-test.php on line 39 Fatal error: Uncaught Swoole\ExitException: test in /home/vagrant/code/swp-test.php:39 Stack trace: #0 {main} thrown in /home/vagrant/code/swp-test.php on line 39 [2020-09-03 15:01:21 $10429.0] WARNING swManager_check_exit_status: worker#1[pid=10433] abnormal exit, status=255, signal=0 process start#1, pid=10434 process pipe: down [empty recv] warning!!! PHP Fatal error: Uncaught Swoole\ExitException: test in /home/vagrant/code/swp-test.php:39 Stack trace: #0 {main} thrown in /home/vagrant/code/swp-test.php on line 39 Fatal error: Uncaught Swoole\ExitException: test in /home/vagrant/code/swp-test.php:39 Stack trace: #0 {main} thrown in /home/vagrant/code/swp-test.php on line 39 [2020-09-03 15:01:26 $10429.0] WARNING swManager_check_exit_status: worker#1[pid=10434] abnormal exit, status=255, signal=0 process start#1, pid=10436 process pipe: down [empty recv] ``` 异常退出复活后如何pipe就废掉了么
赞
0
回复
2020-09-04
鲁飞
升级swoole版本,v4.5.3测试没问题 ``` [root@VM_32_17_centos ~]# php test.php process start#1, pid=18016 worker start#0 process recv: worker#0 send, 09:00:08.1391941609 process recv: worker#0 send, 09:00:09.521453295 process recv: worker#0 send, 09:00:10.2084891508 process recv: worker#0 send, 09:00:11.1867294689 warning!!! PHP Fatal error: Uncaught Swoole\ExitException: test in /root/test.php:40 Stack trace: #0 {main} thrown in /root/test.php on line 40 [2020-09-04 09:00:12 $18010.0] WARNING check_worker_exit_status: worker#1[pid=18016] abnormal exit, status=255, signal=0 process start#1, pid=18132 process recv: worker#0 send, 09:00:12.1912386844 process recv: worker#0 send, 09:00:13.1105720605 process recv: worker#0 send, 09:00:14.1533027499 process recv: worker#0 send, 09:00:15.2138612964 process recv: worker#0 send, 09:00:16.483529946 process recv: worker#0 send, 09:00:17.172891150 warning!!! PHP Fatal error: Uncaught Swoole\ExitException: test in /root/test.php:40 Stack trace: #0 {main} thrown in /root/test.php on line 40 [2020-09-04 09:00:17 $18010.0] WARNING check_worker_exit_status: worker#1[pid=18132] abnormal exit, status=255, signal=0 process start#1, pid=18242 process recv: worker#0 send, 09:00:18.1046325242 process recv: worker#0 send, 09:00:19.1089183538 process recv: worker#0 send, 09:00:20.994746555 process recv: worker#0 send, 09:00:21.1658326585 ```
赞
0
回复