在onMessage中把业务逻辑拆分出来比较好的实现方式是什么?
在同一进程中,如何做到连接之间不相互污染数据?
================================
刚刚测试了一下同一个进程中在其中的一个连接发送阻塞标识信息,执行for600W次的file_put_contents写入操作,其他连接发送消息会被挂起,甚至会出现超时,
process_timeout:
#1 /data/gateway/gateway/vendor/workerman/workerman/Events/Select.php(263): pcntl_signal_dispatch()
#2 /data/gateway/gateway/vendor/workerman/workerman/Worker.php(2231): Workerman\Events\Select->loop()
#3 /data/gateway/gateway/vendor/workerman/gateway-worker/src/BusinessWorker.php(197): Workerman\Worker->run()
#4 /data/gateway/gateway/vendor/workerman/workerman/Worker.php(1356): GatewayWorker\BusinessWorker->run()
#5 /data/gateway/gateway/vendor/workerman/workerman/Worker.php(1188): Workerman\Worker::forkOneWorkerForLinux(Object(GatewayWorker\BusinessWorker))
#6 /data/gateway/gateway/vendor/workerman/workerman/Worker.php(1162): Workerman\Worker::forkWorkersForLinux()
#7 /data/gateway/gateway/vendor/workerman/workerman/Worker.php(1490): Workerman\Worker::forkWorkers()
#8 /data/gateway/gateway/vendor/workerman/workerman/Worker.php(1439): Workerman\Worker::monitorWorkersForLinux()
#9 /data/gateway/gateway/vendor/workerman/workerman/Worker.php(480): Workerman\Worker::monitorWorkers()
#10 /data/gateway/gateway/start.php(37): Workerman\Worker::runAll()
这样一来是不是我们无须考虑高并发带来的同一进程中的多个链接在业务流程中的数据污染,因为同一时间同一个进程永远在处理一个连接的业务?是不是可以这样理解?
单个进程里业务代码是串行执行的,业务代码都是在函数/类方法中运行,执行过程中产生的临时变量在函数/类方法执行完毕后会自动释放,不会有多个业务代码并发执行同时访问更改进程内某变量的情况。
但是全局变量以及类的静态成员存储的数据默认不会被自动系统释放,所以多个连接的多个请求可以共享全局变量以及类的静态成员存储的数据,但是也不会出现多个业务代码并发访问的情况,仍然是顺序执行,进程内的所有变量不用考虑并发问题。
虽然单个进程内部业务代码是串行执行,无并发访问问题,但是多个进程的业务代码是并发执行的(进程间的变量是隔离的,变量同样没有并发访问问题),但是要注意多个进程读写外部存储(mysql/redis)的并发问题。
那么对于全局变量和静态成员变量的初始化和send后的数据重置应该就可以正常使用吧?还是说更加建议使用类实例化操作来避免万一忘记重置静态变量成员数据出错?感觉有点选择强迫症- -
正常使用。没有必要都实例化。静态成员变量一般用来记录全局性的东西,一般不用重置
@1:好的 谢谢大大