首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
我想问下我这边有个需求应该怎么样处理
### 问题描述 就是我需要同时用到服务端和客户端。也就是代理服务器 比如我要开启个服务端,这个服务端onworkerstart的时候创建一个客户端并和一个外部的服务器保持长连接。可能需要开启N个WORKER。每个WORKER里都需要作为客户端连接这个外部服务器 当我的用户请求服务端的时候,在某些业务里我会向外部的服务器请求然后拿到外部服务器返回的数据后,然后在返回给用户。 我应该怎么做? 另外我看了下我做为客户端接收外部服务器的返回的时候,recv的超时设置了1秒。现在的是有点问题。问题是即使我没有发送数据过去。程序也会一直判断我是超时的。我想要的效果是。我发送了数据到外部服务器。外部服务器返回很慢。比如超过了3秒。那么这次请求我就废弃掉。而不是一直报出超时 代码如下 ### Swoole版本,PHP版本,以及操作系统版本信息 SWOOLE4.6 PHP7.4 操作系统LINUX ### 相关代码 以前我可以这样写: ```php class ProxyServer { protected $clients; protected $backends; protected $serv; function run() { $serv = swoole_server_create("127.0.0.1", 9509); swoole_server_set($serv, array( 'timeout' => 1, //select and epoll_wait timeout. 'poll_thread_num' => 1, //reactor thread num 'worker_num' => 1, //reactor thread num 'backlog' => 128, //listen backlog 'max_conn' => 10000, 'dispatch_mode' => 2, //'open_tcp_keepalive' => 1, 'log_file' => '/tmp/swoole.log', //swoole error log )); swoole_server_handler($serv, 'onWorkerStart', array($this, 'onStart')); swoole_server_handler($serv, 'onConnect', array($this, 'onConnect')); swoole_server_handler($serv, 'onReceive', array($this, 'onReceive')); swoole_server_handler($serv, 'onClose', array($this, 'onClose')); swoole_server_handler($serv, 'onWorkerStop', array($this, 'onShutdown')); //swoole_server_addtimer($serv, 2); #swoole_server_addtimer($serv, 10); swoole_server_start($serv); } function onStart($serv) { $this->serv = $serv; echo "Server: start.Swoole version is [" . SWOOLE_VERSION . "]\n"; } function onShutdown($serv) { echo "Server: onShutdown\n"; } function onClose($serv, $fd, $from_id) { //backend if (isset($this->clients[$fd])) { $backend_client = $this->clients[$fd]['socket']; unset($this->clients[$fd]); $backend_client->close(); unset($this->backends[$backend_client->sock]); echo "client close\n"; } } function onConnect($serv, $fd, $from_id) { $socket = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); echo microtime() . ": Client[$fd] backend-sock[{$socket->sock}]: Connect.\n"; $this->backends[$socket->sock] = array( 'client_fd' => $fd, 'socket' => $socket, ); $this->clients[$fd] = array( 'socket' => $socket, ); $socket->on('connect', function ($socket) { echo "connect to backend server success\n"; }); $socket->on('error', function ($socket) { echo "connect to backend server fail\n"; }); $socket->on('receive', function ($socket) { swoole_server_send($this->serv, $this->backends[$socket->sock]['client_fd'], $socket->recv()); }); $socket->connect('127.0.0.1', 9501, 0.2); } function onReceive($serv, $fd, $from_id, $data) { echo microtime() . ": client receive\n"; $backend_socket = $this->clients[$fd]['socket']; $backend_socket->send($data); echo microtime() . ": send to backend\n"; echo str_repeat('-', 100) . "\n"; } } $serv = new ProxyServer(); $serv->run(); ``` 但现在升级到4.x版本后 不知道咋弄了。 ### 你期待的结果是什么?实际看到的错误信息又是什么?
发布于3年前 · 18 次浏览 · 来自
提问
s
stonery
### 问题描述 就是我需要同时用到服务端和客户端。也就是代理服务器 比如我要开启个服务端,这个服务端onworkerstart的时候创建一个客户端并和一个外部的服务器保持长连接。可能需要开启N个WORKER。每个WORKER里都需要作为客户端连接这个外部服务器 当我的用户请求服务端的时候,在某些业务里我会向外部的服务器请求然后拿到外部服务器返回的数据后,然后在返回给用户。 我应该怎么做? 另外我看了下我做为客户端接收外部服务器的返回的时候,recv的超时设置了1秒。现在的是有点问题。问题是即使我没有发送数据过去。程序也会一直判断我是超时的。我想要的效果是。我发送了数据到外部服务器。外部服务器返回很慢。比如超过了3秒。那么这次请求我就废弃掉。而不是一直报出超时 代码如下 ### Swoole版本,PHP版本,以及操作系统版本信息 SWOOLE4.6 PHP7.4 操作系统LINUX ### 相关代码 以前我可以这样写: ```php class ProxyServer { protected $clients; protected $backends; protected $serv; function run() { $serv = swoole_server_create("127.0.0.1", 9509); swoole_server_set($serv, array( 'timeout' => 1, //select and epoll_wait timeout. 'poll_thread_num' => 1, //reactor thread num 'worker_num' => 1, //reactor thread num 'backlog' => 128, //listen backlog 'max_conn' => 10000, 'dispatch_mode' => 2, //'open_tcp_keepalive' => 1, 'log_file' => '/tmp/swoole.log', //swoole error log )); swoole_server_handler($serv, 'onWorkerStart', array($this, 'onStart')); swoole_server_handler($serv, 'onConnect', array($this, 'onConnect')); swoole_server_handler($serv, 'onReceive', array($this, 'onReceive')); swoole_server_handler($serv, 'onClose', array($this, 'onClose')); swoole_server_handler($serv, 'onWorkerStop', array($this, 'onShutdown')); //swoole_server_addtimer($serv, 2); #swoole_server_addtimer($serv, 10); swoole_server_start($serv); } function onStart($serv) { $this->serv = $serv; echo "Server: start.Swoole version is [" . SWOOLE_VERSION . "]\n"; } function onShutdown($serv) { echo "Server: onShutdown\n"; } function onClose($serv, $fd, $from_id) { //backend if (isset($this->clients[$fd])) { $backend_client = $this->clients[$fd]['socket']; unset($this->clients[$fd]); $backend_client->close(); unset($this->backends[$backend_client->sock]); echo "client close\n"; } } function onConnect($serv, $fd, $from_id) { $socket = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); echo microtime() . ": Client[$fd] backend-sock[{$socket->sock}]: Connect.\n"; $this->backends[$socket->sock] = array( 'client_fd' => $fd, 'socket' => $socket, ); $this->clients[$fd] = array( 'socket' => $socket, ); $socket->on('connect', function ($socket) { echo "connect to backend server success\n"; }); $socket->on('error', function ($socket) { echo "connect to backend server fail\n"; }); $socket->on('receive', function ($socket) { swoole_server_send($this->serv, $this->backends[$socket->sock]['client_fd'], $socket->recv()); }); $socket->connect('127.0.0.1', 9501, 0.2); } function onReceive($serv, $fd, $from_id, $data) { echo microtime() . ": client receive\n"; $backend_socket = $this->clients[$fd]['socket']; $backend_socket->send($data); echo microtime() . ": send to backend\n"; echo str_repeat('-', 100) . "\n"; } } $serv = new ProxyServer(); $serv->run(); ``` 但现在升级到4.x版本后 不知道咋弄了。 ### 你期待的结果是什么?实际看到的错误信息又是什么?
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2021-07-30
鲁飞
你可以判断错误码,根据你的业务逻辑进行处理
赞
0
回复
微信公众号
热门内容
作者其它话题
- 我想问下磁盘的IO影响异步SOCKET通信的速度吗?
暂无回复的问答
- 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一直是同一个。没用使用到多进程啊。