在多进程模式下进程之间的内存是相互隔离的,在一个工做进程中的全局变量和超全局变量,在另外一个工做进程中是没法读取和操做的。php
若是只有一个工做进程,则不存在进程隔离问题,能够使用全局变量和超全局变量。react
要实现进程间共享数据,咱们能够使用第三方的 Redis
内存数据库或 Swoole
内置的 Table
共享内存来实现。数据库
200
万次;Table
内置行锁自旋锁,全部操做均是多线程 / 多进程安全。用户层彻底不须要考虑数据同步问题;Table
能够用于多进程之间共享数据;CPU
时间,并发读取同一条数据才会进行发生抢锁。使用示例:安全
<?php // 实例化一个占用的共享内存大小为1024的内存表 $table = new Swoole\Table(1024); // 内存表增长3列 $table->column('fd', Swoole\Table::TYPE_INT); $table->column('reactor_id', Swoole\Table::TYPE_INT); $table->column('data', Swoole\Table::TYPE_STRING, 64); $table->create(); $serv = new Swoole\Server('127.0.0.1', 9501); // 设置数据包分发策略:轮循模式 $serv->set(['dispatch_mode' => 1]); $serv->table = $table; $serv->on('receive', function ($serv, $fd, $reactor_id, $data) { $cmd = explode(" ", trim($data)); if ($cmd[0] == 'get') { //get self if (count($cmd) < 2) { $cmd[1] = $fd; } $get_fd = intval($cmd[1]); $info = $serv->table->get($get_fd); $serv->send($fd, var_export($info, true) . "\n"); } elseif ($cmd[0] == 'set') { // 使用链接的文件描述符做为key写入内存表 $ret = $serv->table->set($fd, array('fd' => $fd, 'reactor_id' => $reactor_id, 'data' => $cmd[1])); if ($ret === false) { $serv->send($fd, "ERROR\n"); } else { $serv->send($fd, "OK\n"); } } else { $serv->send($fd, "command error.\n"); } }); $serv->start();