本文目录导读:

在 PHP 中实现常驻变量(即跨请求保持数据)主要有以下几种方法:
使用缓存系统(最常用)
Redis 缓存
<?php
// 写入
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->set('user_count', 100);
// 读取
$count = $redis->get('user_count');
echo $count; // 100
// 设置过期时间
$redis->setex('temp_data', 3600, '这个数据一小时后过期');
?>
Memcached 缓存
<?php
$memcached = new Memcached();
$memcached->addServer('127.0.0.1', 11211);
// 写入
$memcached->set('site_config', ['name' => 'My Site', 'version' => '1.0']);
// 读取
$config = $memcached->get('site_config');
print_r($config);
?>
使用会话(Session)
<?php session_start(); // 设置会话变量 $_SESSION['user_id'] = 123; $_SESSION['cart_items'] = ['item1', 'item2', 'item3']; // 保存数据(会自动保存) // 会话数据在服务器端保持,直到用户会话结束 ?>
使用 APCu(APC 用户缓存)
<?php
// 检查 APCu 是否可用
if (function_exists('apcu_store')) {
// 存储数据
apcu_store('app_config', ['debug' => true, 'version' => '1.0.1'], 3600);
// 读取数据
$config = apcu_fetch('app_config');
// 递增计数
apcu_inc('request_count');
// 删除
apcu_delete('old_data');
}
?>
使用数据库(推荐用于持久化)
设置数据库连接池
<?php
// config.php
class Database {
private static $instance = null;
private $connection;
private function __construct() {
$this->connection = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new Database();
}
return self::$instance;
}
public function getConnection() {
return $this->connection;
}
}
// 使用
$db = Database::getInstance()->getConnection();
$stmt = $db->prepare("SELECT * FROM settings WHERE key = ?");
$stmt->execute(['site_config']);
$config = $stmt->fetch();
?>
使用文件存储
<?php
// 写入文件
file_put_contents('/tmp/php_cache.txt', json_encode($data));
// 读取文件
$data = json_decode(file_get_contents('/tmp/php_cache.txt'), true);
// 使用锁防止并发问题
$fp = fopen('/tmp/counter.txt', 'c+');
if (flock($fp, LOCK_EX)) {
$count = (int)trim(fgets($fp));
$count++;
ftruncate($fp, 0);
rewind($fp);
fwrite($fp, $count);
flock($fp, LOCK_UN);
}
fclose($fp);
?>
使用全局静态变量(单请求内)
<?php
class GlobalConfig {
private static $config = [];
public static function set($key, $value) {
self::$config[$key] = $value;
}
public static function get($key) {
return isset(self::$config[$key]) ? self::$config[$key] : null;
}
}
// 在任何地方使用(同一请求内)
GlobalConfig::set('user_name', 'John');
echo GlobalConfig::get('user_name'); // John
?>
使用环境变量
<?php
// putenv 和 getenv
putenv('APP_ENV=production');
$env = getenv('APP_ENV');
// 或者使用 $_ENV 数组
$_ENV['API_KEY'] = 'your-api-key';
?>
<!-- .env 文件示例 -->
<!-- APP_NAME=MyApp -->
<!-- APP_ENV=production -->
<?php
// 使用 dotenv 库读取
require 'vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
echo $_ENV['APP_NAME'];
?>
最佳实践建议
- 简单数据:使用 APCu 或 Redis
- 需要持久化的数据:使用 MySQL/MongoDB
- 用户会话数据:使用 PHP Session 或 Redis Session
- 配置信息:使用环境变量或配置文件
- 复杂应用:通常组合使用多种方式
注意事项
- PHP 每个请求完成后会释放所有内存,所以变量不会自动保持
- 分布式环境考虑使用 Redis/Memcached
- 考虑数据过期策略和内存清理
- 避免存储敏感数据
- 注意并发写入的同步问题
选择哪种方案取决于你的具体需求:数据量大小、访问频率、持久性要求和部署环境。