workerman icon indicating copy to clipboard operation
workerman copied to clipboard

F 修复可能导致网关进程退出的问题

Open xiasf opened this issue 1 year ago • 1 comments

修复 gateway-worker 项目中 Gateway::closeClient($client_id, (array) $message); 会导致 网关进程报错退出的问题:

2023-03-08 17:50:28 pid:19154 Workerman[/home/myweb/spug_repos/gatewayworker_test/23_20230308175027/Applications/AdvertApp/start_g.php] already running

2023-03-09 10:46:19 pid:1361 Exception: You can't send(array) to client, you need to convert it to a string.  in /home/myweb/spug_repos/gatewayworker_test/23_20230302113526/vendor/workerman/workerman/Protocols/Websocket.php:230


Stack trace:
#0 /home/myweb/spug_repos/gatewayworker_test/23_20230302113526/vendor/workerman/workerman/Connection/TcpConnection.php(321): Workerman\Protocols\Websocket::encode(Array, Object(Workerman\Connection\TcpConnection))
#1 /home/myweb/spug_repos/gatewayworker_test/23_20230302113526/vendor/workerman/workerman/Connection/TcpConnection.php(821): Workerman\Connection\TcpConnection->send(Array, false)
#2 /home/myweb/spug_repos/gatewayworker_test/23_20230302113526/vendor/workerman/gateway-worker/src/Gateway.php(603): Workerman\Connection\TcpConnection->close(Array)
#3 /home/myweb/spug_repos/gatewayworker_test/23_20230302113526/vendor/workerman/workerman/Connection/TcpConnection.php(638): GatewayWorker\Gateway->onWorkerMessage(Object(Workerman\Connection\TcpConnection), Array)
#4 /home/myweb/spug_repos/gatewayworker_test/23_20230302113526/vendor/workerman/workerman/Events/Select.php(295): Workerman\Connection\TcpConnection->baseRead(Resource id #11674178)
#5 /home/myweb/spug_repos/gatewayworker_test/23_20230302113526/vendor/workerman/workerman/Worker.php(2465): Workerman\Events\Select->loop()
#6 /home/myweb/spug_repos/gatewayworker_test/23_20230302113526/vendor/workerman/gateway-worker/src/Gateway.php(287): Workerman\Worker->run()
#7 /home/myweb/spug_repos/gatewayworker_test/23_20230302113526/vendor/workerman/workerman/Worker.php(1574): GatewayWorker\Gateway->run()
#8 /home/myweb/spug_repos/gatewayworker_test/23_20230302113526/vendor/workerman/workerman/Worker.php(1416): Workerman\Worker::forkOneWorkerForLinux(Object(GatewayWorker\Gateway))
#9 /home/myweb/spug_repos/gatewayworker_test/23_20230302113526/vendor/workerman/workerman/Worker.php(1390): Workerman\Worker::forkWorkersForLinux()
#10 /home/myweb/spug_repos/gatewayworker_test/23_20230302113526/vendor/workerman/workerman/Worker.php(1722): Workerman\Worker::forkWorkers()
#11 /home/myweb/spug_repos/gatewayworker_test/23_20230302113526/vendor/workerman/workerman/Worker.php(1660): Workerman\Worker::monitorWorkersForLinux()
#12 /home/myweb/spug_repos/gatewayworker_test/23_20230302113526/vendor/workerman/workerman/Worker.php(559): Workerman\Worker::monitorWorkers()
#13 /home/myweb/spug_repos/gatewayworker_test/23_20230302113526/Applications/AdvertApp/start_g.php(99): Workerman\Worker::runAll()
#14 {main}




2023-03-09 10:46:19 pid:607 worker[AdvertApp-gateway:1361] exit with status 64000
2023-03-09 10:46:19 pid:20899 Worker[20899] process terminated with ERROR: E_ERROR "Uncaught Error: Class '\Workerman\Events\Select' not found in /home/myweb/spug_repos/gatewayworker_test/23_20230302113526/vendor/workerman/workerman/Worker.php:2432

xiasf avatar Mar 29 '23 08:03 xiasf

$buffer = (string) $buffer;

这样强制转换发送给客户端不太好。 举个例子: $buffer = [ 'sss', 'aaa' ];

$connection->send((string)$buffer)); 输出是 "array " 字符串,php不知道如何解析,最终你把array 字符串推送给ws客户端了。 你可以选择return,不做任何处理丢弃这次数据(本身数据就不太合法)

twomiao avatar Oct 05 '23 06:10 twomiao