是,应将PHP-FPM错误日志、慢日志、opcache.file_cache、MySQL tmpdir及session.save_path(files模式)移至SSD,但需分路径部署、设权限、避免共用分区,并优先用Redis替代文件存储session。

PHP 应用日志写入慢,是不是该把 /var/log/php-fpm 挪到 SSD?
是,但得看写入模式。PHP-FPM 的错误日志、慢日志、access log 默认都落盘,如果全堆在机械盘(HDD)上,高并发时 fwrite() 会卡住 worker 进程——不是 PHP 慢,是磁盘 I/O 在拖后腿。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 把
error_log和slowlog放 SSD 分区(比如/ssd/log/php-fpm/),确保php-fpm.conf中对应路径已更新,且chown www-data:www-data权限到位 - access log 如果用于实时分析(如配合
goaccess或nginx -s reload触发日志轮转),也建议放 SSD;若只是归档备份,可留在 HDD - 别直接挂载 SSD 到
/var/log—— 万一 SSD 故障,系统日志和 PHP 日志一起丢,排查更难
session.save_path 设在 HDD 还是 SSD?files 和 redis 差异太大
用 files 存储时,session 文件每请求都要 open() + flock() + read(),HDD 随机小文件读写延迟高,容易堆积 session_write_close() 阻塞。SSD 能缓解,但治标不治本。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 优先切到
redis:改session.save_handler = redis,配session.save_path = "127.0.0.1:6379",不用管硬盘位置 - 非要用
files,则必须把session.save_path指向 SSD 上的独立目录(如/ssd/php-sessions),并设session.gc_probability = 0,靠外部定时任务清理,避免请求中触发 GC 扫 HDD - 别让多个 vhost 共用一个
session.save_path目录——文件锁竞争会加剧 HDD 瓶颈
opcache.file_cache 开了反而变慢?双硬盘下缓存路径选错是主因
OPcache 的文件缓存(opcache.file_cache)是用来进程重启后快速恢复 opcode 的,但它本身要频繁读写缓存文件。如果路径落在 HDD 上,每次 PHP-FPM reload 都要从 HDD 加载几百个 .bin 文件,比冷启动还慢。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 必须设为 SSD 路径,例如
opcache.file_cache=/ssd/opcache,且确保该目录chown给 PHP worker 用户 - 别和
opcache.memory_consumption混淆:file_cache是磁盘兜底,内存够就根本用不上它;但机器重启或 FPM 全量 reload 时,它就是唯一恢复来源 - HDD 上开
file_cache不仅没加速,还会因缓存文件碎片化导致更多寻道——相当于给慢操作加了一层慢包装
MySQL 临时表和 tmpdir 放哪?PHP 里 mysqli_query() 大结果集卡顿可能根在这
PHP 执行 mysqli_query() 或 PDO 查询时,如果结果集太大、内存不够,MySQL 会把中间结果写进 tmpdir。默认 tmpdir=/tmp,而 /tmp 往往是内存盘(tmpfs)或 HDD。前者爆内存,后者拖慢查询——你看到的“PHP 卡住”,其实是 MySQL 在 HDD 上刷临时表。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 查 MySQL 当前
tmpdir:连进去执行SHOW VARIABLES LIKE 'tmpdir'; - 把它改成 SSD 上的专用路径(如
/ssd/mysql-tmp),并chown mysql:mysql,再systemctl restart mysql - 顺便检查
sort_buffer_size和read_rnd_buffer_size,别盲目调大——buffer 太大会让 MySQL 更倾向用磁盘临时表
双硬盘系统里最易被忽略的,是不同服务对同一块 SSD 的争抢:PHP 日志、OPcache 缓存、MySQL 临时表如果全挤在一个 SSD 分区,突发写入可能互相阻塞。分目录、限 I/O 权重、必要时用 ionice 控制优先级,比光换硬盘重要得多。



















