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

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

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

phpini下载记一次因PHP的设置装备摆设文件phpini激发的小插曲 Python

事件征象

刚搭建的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/