CentOS7 Linux 下 phpmyadmin 提示“无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正并正确配置 PHP 安装”

上一次将某网站迁移到 CentOS 7 之后,运营和开发人员一直没有反映有什么问题,直到今天下午开发人员告诉我他在目录里放的一个 phpmyadmin 不能登陆,提示是“无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正并正确配置 PHP 安装”,放狗搜之,发现可能是 php 的 session.save_path 有问题。

稍微看了一下这个的作用:

PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置。Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用——w3school

查看 php 错误日志:

检查该目录,发现竟然是目录不存在(什么鬼,这种目录不应该是自动生成的吗),于是手动生成:

再访问发现错误依旧,继续查看目录,发现错误变了:

检查目录权限为755,似乎没有问题。

打开 htop 查看 PHP 进程,惊讶地发现 CentOS 7 下的 php-fpm 进程是以 apache 用户和组启动的,而我的服务器上根本没安装 apache2 或是 httpd 包,虽然可以手动修改 php-fpm 的配置文件 /etc/php-fpm.d/www.conf更改这个配置,我很好奇为什么默认配置会是这样,在 Debian 系下从来没有见过这种默认配置。

事后在 stackoverflow 查到这样一个问题, Debian 和 CentOS 的默认 session.save_path 有所不同:

On Ubuntu or Debian machines, if  session.save_path is not set, then session files are saved in  /var/lib/php5.

On RHEL and CentOS systems, if  session.save_path is not set, session files will be saved in  /var/lib/php/session

I think that if you compile PHP from source, then when  session.save_path is not set, session files will be saved in  /tmp (I have not tested this myself though).

迁移的时候并没有用到 phpmyadmin (我自己也不用这个),虽然在迁移前 diff 对比过新旧服务器的 php.ini 以确保配置是一致的,但是发行版区别的坑实在是不踩到一次就很难注意到,比如这次的问题,在上线前只是让开发人员简单的测试了一下功能,覆盖不够完全,等用到了才发现问题,好在 phpmyadmin 不是什么很重要的功能,问题解决的很快没有造成什么影响。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.