- 32
- 0
Linux 使用 PHP Ev 扩展,监听 socket。
这边有两个递进的监听:
- 监听客户端连接
- 客户端连接后,监听客户端进行收发数据
具体实现代码如下:
<?php
$tcp = "127.0.0.1:9005";
$count = 2;
$pids = [];
// 端口多进程监听
for ($i = 0; $i < $count; ++$i)
{
$pid = pcntl_fork();
if ($pid < 0) {
exit('生成子进程失败\n');
} else if ($pid > 0) {
// 父进程
$pids[] = $pid;
} else {
var_dump("产生子进程 {$i}");
// 创建资源流上下文
$context = stream_context_create([
'socket' => [
//
'backlog' => 102400
]
]);
// 设置端口重用
stream_context_set_option($context , 'socket' , 'so_reuseport' , 1);
// 监听客户端链接 + 设置端口重用
$server = stream_socket_server($tcp , $errno , $errstr , STREAM_SERVER_BIND | STREAM_SERVER_LISTEN , $context);
$clients = [];
// 如果资源可读,读取,并且一直监听
$ev = new EvIo($server , Ev::READ , function($watcher) use($clients , $server){
var_dump("接收到客户端链接");
var_dump($watcher->fd === $server);
// $client = stream_socket_accept($watcher->fd);
$client = stream_socket_accept($server);
$clients[] = $client;
// 设置资源阻塞模式
stream_set_blocking($client , false);
// 事件监听
$ev = new EvIO($client , Ev::READ | Ev::WRITE , function($watcher) use($client , $clients){
var_dump($watcher->fd === $client);
var_dump("客户端资源可读!!");
});
var_dump("监听客户端数据收发已经就绪");
});
// 开始事件监听!
Ev::run();
// 不要进入父进程领域
exit;
}
}
foreach ($pids as $v)
{
pcntl_waitpid($v , $status , WUNTRACED);
}
var_dump("所有进程都已经退出");
运行后发现,如果有客户端连接,则触发回调函数,但是,如果该客户端发送了数据到服务器,却没有触发回调。
不知道该如何破解??
0
打赏
收藏
点击回答
- 共 0 条
- 全部回答
-
几人难应 普通会员 1楼
在PHP Ev扩展中,可以使用
listen函数来监听嵌套的事件。listen函数接受两个参数:事件的名称和事件监听器的函数。以下是一个简单的例子,展示了如何在PHP Ev扩展中监听嵌套的事件:
```php
listen('child', function ($childEvent) { echo "Child event triggered: " . $childEvent->getEventName(); }); // 添加一个事件监听器 $event->listen('parent', function ($parentEvent) { echo "Parent event triggered: " . $parentEvent->getEventName(); }); // 启动事件监听器 $event->start(); ?>```
在这个例子中,我们首先创建了一个事件,并添加了一个事件监听器。然后,我们添加了一个事件监听器,该监听器会触发子事件,并输出子事件的名称。
请注意,
listen函数在多线程环境中工作,因此在运行此代码时,你应该确保所有的事件监听器都在同一线程中运行。否则,可能会出现错误。
更多回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

