
PHP变量怎么跨请求保存
PHP脚本每次执行完就销毁所有变量,想让变量“活下来”必须借助外部存储机制。没有内置的“持久化变量”语法,global、static、引用这些都只在单次请求内有效。
- 最常用也最稳妥的是
$_SESSION:依赖会话机制,需调用session_start(),数据存在服务端(默认文件),适合用户级状态(如登录态、购物车) - 临时轻量场景可用
apcu_store()(需启用 APCu 扩展):内存级键值存储,无过期自动清理,不跨进程共享,适合缓存计算结果 - 别用
serialize()+ 文件写入来“手动持久化”变量——没加锁、无原子性、并发写容易损坏,除非你明确控制单写多读且接受风险
$_SESSION 为什么有时存不住数据
不是 PHP 问题,是会话生命周期和配置没对齐。常见现象:$_SESSION 赋值后刷新页面就空了,或不同页面间取不到值。
- 漏调
session_start():每个要用$_SESSION的脚本开头都得有它,包括 AJAX 后端脚本 - 响应头已发送后调用
session_start():触发Warning: session_start(): Cannot start session when headers already sent,后续赋值无效 -
session.cookie_lifetime设为 0(默认)意味着浏览器关闭即失效;若要长期保持,得配合session_set_cookie_params()设置较长的$lifetime - 多个子域名共用 session?确保
session.cookie_domain正确设为.example.com(注意开头的点)
apcu_store() 和 $_SESSION 性能差多少
APCu 是纯内存操作,apcu_store() 写入比 $_SESSION 快 3–5 倍,读取快 2–4 倍,但适用范围完全不同。
本文档主要讲述的是Android传感器编程;传感器是一种物理装置或生物器官,能够探测、感受外界的信号、物理条件(如光、热、湿度)或化学组成(如烟雾),并将探知的信息传递给其它装置或器官。同时也可以说传感器是一种检测装置,能感受被测量的信息,并能将检测的感受到的信息,按一定规律变换成为电信号或其它所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。它是实现自动检测和自动控制的首要环节。感兴趣的朋友可以过来看看
-
apcu_store()不绑定用户,所有请求共享同一份 key,适合全局配置、热点数据缓存;不能用来存用户私有数据(比如apcu_store('user_balance', 100)会导致所有人看到同一个余额) -
$_SESSION自动按PHPSESSID隔离,天然支持多用户,但底层可能写磁盘(file handler)或走网络(Redis handler),IO 成本高 - 如果用了 Redis 作为 session handler(
session.save_handler = redis),性能接近 APCu,同时保有用户隔离能力——这是高并发下更推荐的组合
用 file_put_contents() 序列化变量安全吗
不安全,也不可靠。虽然代码能跑通,但实际生产环境几乎必然出问题。
立即学习“PHP免费学习笔记(深入)”;
- 并发写入时大概率出现
file_put_contents()覆盖或截断,serialize()后的数据不是原子写入 - 没做反序列化校验:如果文件被篡改,
unserialize()可能触发任意代码执行(PHP 7.4+ 默认禁用危险类,但仍存在风险) - 权限失控:生成的文件若落在 Web 可访问目录下,可能被直接下载,泄露敏感数据
- 真要落地文件,改用
fopen()+flock()+fwrite()+fflush()+fclose()全流程加锁,但复杂度远超收益——不如直接上 Redis 或数据库










