编程技术分享平台

网站首页 > 技术教程 正文

记一次因PHP的配置文件(php.ini)引发的小插曲

xnh888 2024-10-07 17:58:03 技术教程 21 ℃ 0 评论

系统环境

centos7.2+nginx1.18.0+php7.2.13+mysql5.7

nginx1.18.0+php7.2.13+mysql5.7中间件均为编译安装

nginx针对php请求,设置了转发到PHP-FPM(PHP-FPM:PHP的一个FastCGI管理器,用于提高Web环境下PHP的性能)

php安装目录/usr/local/php/

事故现象

刚搭建的web测试服务器(centos+nginx+php+mysql),部署完php程序。程序运行时,发现定时任务(linux crontab)执行出现error(有访问mysql数据库的时候)报错描述:找不到pdo_mysql驱动。随后访问网站地址,查看程序运行(有访问mysql数据库的功能),一切正常。你说这是咋回事?

排查分析

  1. 打开php安装目录下的php.ini文件

vi /usr/local/php/php.ini

找到了pdo_mysql驱动的配置

  1. 查看编译安装时,指定的配置文件是/usr/local/php/php.ini吗?

查看安装php指定的配置文件目录:

--with-config-file-path=/usr/local/php/etc/

  1. 查看/usr/local/php/etc/目录下面,是否存在php.ini文件。

cd /usr/local/php/etc/ && ls

查看结果,不存在php.ini文件。因此,这个很可能是因为定时任务执行php,找不到php配置文件,造成的错误。

  1. 那么问题产生,定时任务命令行执行php使用的php配置文件和访问网站地址使用的php配置文件是不一样的?那么就要捋一下了!
  • 命令行执行:

PHP-FPM会直接去使用在编译安装 PHP 指定的 --with-config-file-path选项指定的路径下的 php.ini 文件。

  • 访问网址:

浏览器访问通过nginx代理服务器,转发到PHP-FPM进程管理器,在 PHP-FPM 中,默认的 PHP 配置文件搜索路径是硬编码在编译时的,默认安装路径,而不受到--with-config-file-path选项的影响。因此,即使您在编译时指定了--with-config-file-path=/usr/local/php/etc,PHP-FPM 仍然会在默认的安装路径/usr/local/php中寻找php.ini文件。

起初怀疑php-fpm.conf配置中设置php_admin_value[include_path]则使用该目录下的php.ini文件。但其实 php_admin_value[include_path] 并不会影响 PHP 查找 php.ini 文件的路径。PHP-FPM 启动后会先读取 php.ini 文件,然后再读取相应的 conf 配置文件,conf 配置可以覆盖 php.ini 的配置。PHP-FPM 仍然会在默认的安装路径/usr/local/php中寻找php.ini文件。如果你想更改 PHP 查找 php.ini 文件的路径,可以在 PHP 的命令行中使用 -c 参数指定路径。示例:php -c /usr/local/php/etc/php.ini aaa.php

因此,即使您在编译时指定了其他的--with-config-file-path,PHP-FPM 也会优先使用它的默认规则去寻找 php.ini 文件,无法像PHP命令行那样受--with-config-file-path配置项的影响。这是 PHP-FPM 在设计时的一种默认行为。

综上所述:通过访问网址,php读取的是/usr/local/php/php.ini文件,所以能找到配置文件;而定时任务是在命令行执行php,由于编译安装指定的配置文件目录是/usr/local/php/etc/下面,php读取的是/usr/local/php/etc/php.ini文件,正是/usr/local/php/etc/目录下面没有php.ini文件,导致的此次报错。

修复方案

  • 执行cp /usr/local/php/php.ini /usr/local/php/etc/ 使两个目录下保持php.ini文件同步
  • 或者卸载php,重新编译安装php并指定配置文件目录/usr/local/php/

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表