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数据库的功能),统统正常。你说这是咋回事?
排查剖析打开php安装目录下的php.ini文件vi /usr/local/php/php.ini
找到了pdo_mysql驱动的配置
查看编译安装时,指定的配置文件是/usr/local/php/php.ini吗?查看安装php指定的配置文件目录:
--with-config-file-path=/usr/local/php/etc/
查看/usr/local/php/etc/目录下面,是否存在php.ini文件。cd /usr/local/php/etc/ && ls
查当作果,不存在php.ini文件。因此,这个很可能是由于定时任务实行php,找不到php配置文件,造成的缺点。
那么问题产生,定时任务命令行实行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/