本文目录导读:

- 同一请求内共享(全局变量 / 单例模式)
- 不同请求之间共享(Session / Cookie)
- 不同进程/服务之间共享(文件 / 数据库 / Redis)
- 跨服务器共享(共享文件系统 / 消息队列)
- 性能对比与推荐
- 企业级最佳实践
在 PHP 中实现数据共享,主要取决于你的应用场景(如:同一请求内、不同请求之间、不同进程之间、不同服务器之间),以下是几种常见的数据共享方案及代码示例:
同一请求内共享(全局变量 / 单例模式)
适用于同一个 HTTP 请求中不同函数/类之间共享数据。
// 方式一:全局变量(不推荐,易污染)
$globalData = [];
function setData($key, $value) {
global $globalData;
$globalData[$key] = $value;
}
// 方式二:单例模式(推荐)
class DataShare {
private static $instance = null;
private $data = [];
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
public function set($key, $value) {
$this->data[$key] = $value;
}
public function get($key) {
return $this->data[$key] ?? null;
}
}
// 使用
DataShare::getInstance()->set('user', 'Alice');
echo DataShare::getInstance()->get('user'); // Alice
不同请求之间共享(Session / Cookie)
适用于用户登录状态、购物车等需要跨请求保持的数据。
// Session(服务端存储)
session_start();
$_SESSION['user_id'] = 123;
$_SESSION['cart'] = ['item1', 'item2'];
// Cookie(客户端存储,不安全,大小有限制)
setcookie('preference', 'dark_mode', time() + 86400);
echo $_COOKIE['preference']; // dark_mode
不同进程/服务之间共享(文件 / 数据库 / Redis)
适用于集群部署、负载均衡环境。
// 文件共享(简单但性能低)
file_put_contents('/tmp/shared_data.json', json_encode(['count' => 5]));
$data = json_decode(file_get_contents('/tmp/shared_data.json'), true);
// Redis(推荐,高性能)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->set('shared_key', 'value');
echo $redis->get('shared_key'); // value
// MySQL 数据库共享
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
$pdo->exec("INSERT INTO shared_data (key_name, value) VALUES ('last_login', NOW())");
跨服务器共享(共享文件系统 / 消息队列)
// NFS 共享文件系统
// 所有服务器挂载同一目录,通过文件共享数据
// RabbitMQ 消息队列
use PhpAmqpLib\Connection\AMQPStreamConnection;
$connection = new AMQPStreamConnection('localhost', 5672, 'user', 'password');
$channel = $connection->channel();
$channel->basic_publish(new AMQPMessage('Hello World!'), '', 'task_queue');
性能对比与推荐
| 方案 | 适合场景 | 性能 | 复杂度 |
|---|---|---|---|
| 单例模式 | 同一请求内 | 极快 | 低 |
| Session | 同一用户跨请求 | 中等 | 低 |
| Cookie | 少量客户端数据 | 快 | 低 |
| 文件 | 小规模共享 | 慢 | 低 |
| Redis/Memcached | 高并发集群 | 极快 | 中 |
| 数据库 | 需要持久化 | 中等 | 中 |
企业级最佳实践
// 使用依赖注入容器(如 Laravel 的服务容器)
// config/app.php
'app' => [
'shared_service' => function($app) {
return new SharedService();
}
];
// 任意位置获取
$sharedService = app('shared_service');
- 同一请求:用单例或依赖注入容器
- 同一用户跨请求:用 Session
- 不同用户/进程:用 Redis 或数据库
- 分布式系统:用消息队列或分布式缓存(Redis Cluster)
选择时考虑:数据一致性要求 > 性能需求 > 开发复杂度。