🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 进程隔离 进程隔离也是很多新手经常遇到的问题。修改了全局变量的值,为什么不生效,原因就是全局变量在不同的进程,内存空间是隔离的,所以无效。所以使用`Swoole`开发`Server`程序需要了解`进程隔离`问题。 * 不同的进程中PHP变量不是共享,即使是全局变量,在A进程内修改了它的值,在B进程内是无效的 * 如果需要在不同的Worker进程内共享数据,可以用`Redis`、`MySQL`、`文件`、`Swoole\Table`、`APCu`、`shmget`等工具实现 * 不同进程的文件句柄是隔离的,所以在A进程创建的Socket连接或打开的文件,在B进程内是无效,即使是将它的fd发送到B进程也是不可用的 #### 实例: ~~~ $server = new Swoole\Http\Server('127.0.0.1', 9500); $i = 1; $server->on('Request', function ($request, $response) { global $i; $response->end($i++); }); $server->start(); ~~~ 在多进程的服务器中,`$i`变量虽然是全局变量(`global`),但由于进程隔离的原因。假设有`4`个工作进程,在`进程1`中进行`$i++`,实际上只有`进程1`中的`$i`变成`2`了,其他另外`3`个进程内`$i`变量的值还是`1`。 正确的做法是使用`Swoole`提供的`Swoole\Atomic`或`Swoole\Table`数据结构来保存数据。如上述代码可以使用`Swoole\Atomic`实现。 ~~~ $server = new Swoole\Http\Server('127.0.0.1', 9500); $atomic = new Swoole\Atomic(1); $server->on('Request', function ($request, $response) use ($atomic) { $response->end($atomic->add(1)); }); $server->start(); ~~~ * `Swoole\Atomic`数据是建立在共享内存之上的,使用`add`方法加`1`时,在其他工作进程内也是有效的