PHP 怎么PHP 数据共享

wen PHP项目 3

本文目录导读:

PHP 怎么PHP 数据共享

  1. 同一请求内共享(全局变量 / 单例模式)
  2. 不同请求之间共享(Session / Cookie)
  3. 不同进程/服务之间共享(文件 / 数据库 / Redis)
  4. 跨服务器共享(共享文件系统 / 消息队列)
  5. 性能对比与推荐
  6. 企业级最佳实践

在 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)

选择时考虑:数据一致性要求 > 性能需求 > 开发复杂度

抱歉,评论功能暂时关闭!