【配置文件】PHP - php.ini & CLI下命令操作 & 动态设置PHP脚本运行配置

1. 文档

PHP: PHP 选项/信息 - Manual

PHP: ini_set - Manual

PHP: ini_get - Manual

视频教程

[PHP小课堂]关于php的ini文件相关操作函数浅析_哔哩哔哩_bilibili

2. 整理输出 环境

Mac Pro Intel / Mac M1

PHP 8.x

或者

Linux「CentOS」Docker+LNMP 「PHP-FPM 7.2」

前言 2.1 什么是PHP 脚本配置

简单说,就是控制PHP运行的设置。

比如,是否显示错误,设置最大脚本执行的超时时间,设置运行的可使用的最大内存等,

本质上就是控制脚本更好地符合我们的想法去运行,去解决场景问题。

2.2 PHP 脚本配置作用

见上面

2.3 如何设置PHP 脚本配置, 各自特点 方式有两个:

1. 修改配置文件php.ini文件,作用于所有请求的全部生命周期,固定不变,除非使用方式二在运行中洞动态修改。

2. 使用ini_set()等一些其他函数,在PHP脚本运行中「针对具体的请求」,动态修改配置 「临时修改PHP配置文件php.ini的设置,无需打开此文件「有可能就没权限接触到配置文件」,并且在代码执行结束后,就会还原,特别适合虚拟主机上临时修改PHP配置使用」。

如果有些请求,没有执行到php_ini()函数,则依然使用php.ini文件中配置。

ini_set('memory_limit', '64M'); // 配置PHP脚本所使用服务器内存的最大字节数

ini_set('display_errors', 1); // PHP配置输出错误的类别

ini_set('session.auto_start', 0); // PHP配置SESSION设置

ini_set('session.use_cookies', 1); // PHP临时配置COOKIE设置

ini_set('max_execution_time', 300); //300 seconds = 5 minutes

或者 ​​​​set_time_limit(300);

等等

Note:

1. web 运行方式和cli方式使用的配置文件可能不同「即php.ini文件,又可能存在两个,需要确认」

有可能是同一个,可以通过下面的方式去验证:

cli下:php --ini

浏览器访问:phpinfo.php 内容:

phpinfo();

对比Loaded Configuration File的文件路经「具体的文件」

如下:

可以知道,这里一样的,当然可以设置为不一样的配置, 需要另外设置。

2. php.ini()对于web和cli的约束,生效能力是不同的,

有的配置项只对web方式有作用,有的可能相反,具体需要查看配置文件注释说明或者官方文档。

2.4 查看PHP版本

➜ php-test-temp php -v

PHP 8.1.1 (cli) (built: Dec 17 2021 22:38:05) (NTS)

Copyright (c) The PHP Group

Zend Engine v4.1.1, Copyright (c) Zend Technologies

with Zend OPcache v8.1.1, Copyright (c), by Zend Technologies

➜ php-test-temp

2.5 查看扩展文件目录

➜ php-test-temp php-config --extension-dir

/usr/local/Cellar/php/8.1.1/pecl/20210902

➜ php-test-temp

2.6 查看配置文件目录

➜ ~ php --ini

Configuration File (php.ini) Path: /usr/local/etc/php/8.1

Loaded Configuration File: /usr/local/etc/php/8.1/php.ini

Scan for additional .ini files in: /usr/local/etc/php/8.1/conf.d

Additional .ini files parsed: /usr/local/etc/php/8.1/conf.d/ext-opcache.ini

➜ ~

➜ 8.1 ls

conf.d pear.conf php-fpm.conf php-fpm.d php.ini

➜ 8.1 pwd

/usr/local/etc/php/8.1

➜ 8.1

➜ php-test-temp php-config --ini-dir

/usr/local/etc/php/8.1/conf.d

Note

这里输出的目录结果是配置文件最底层目录,应是PHP将配置文件做了拆分,大的单一配置文件现在变成了多个小的配置文件,这样拆分,个人认为好处有,可以避免修改某一个配置,而不小心改到其他配置,而且更加各个配置之间分明,不用看很多无关的配置信息。

Nginx/Apache也都是如此。

额外

php-config -h // 下面的信息通常够用了

--extension-dir [/usr/local/Cellar/php/8.1.1/pecl/20210902]

--include-dir [/usr/local/Cellar/php/8.1.1/include/php]

--man-dir [/usr/local/Cellar/php/8.1.1/share/man]

--php-binary [/usr/local/Cellar/php/8.1.1/bin/php]

--php-sapis [ apache2handler cli fpm phpdbg cgi]

--ini-path [/usr/local/etc/php/8.1]

--ini-dir [/usr/local/etc/php/8.1/conf.d]

2.7 查看扩展信息 以swoole为例

php --ri swoole

如下:

➜ swoole-src php --ri swoole

swoole

Swoole => enabled

Author => Swoole Team

Version => 4.8.12

Built => Oct 25 2022 20:49:20

coroutine => enabled with boost asm context

kqueue => enabled

rwlock => enabled

openssl => OpenSSL 3.0.5 5 Jul 2022

dtls => enabled

http2 => enabled

pcre => enabled

zlib => 1.2.11

async_redis => enabled

Directive => Local Value => Master Value

swoole.enable_coroutine => On => On

swoole.enable_library => On => On

swoole.enable_preemptive_scheduler => Off => Off

swoole.display_errors => On => On

swoole.use_shortname => On => On

swoole.unixsock_buffer_size => 262144 => 262144

➜ swoole-src

2.8 设置或者获取配置值的方式 方式有两种:

方式一:更加推荐,统一好记

ini_set() / ini_get()

如:

ini_set(‘error_reporting’, 0);

ini_set('display_errors', 'On');

相同的效果:「但是参数和返回值的类型或可不同」

ini_set('error_reporting', 32767);

ini_set('error_reporting', E_ALL);

error_reporting(E_ALL);

E_ALL 常量value即 32767

-------------------------------------------------------------------------------------

ini_set('error_reporting', 32767);

// 或者

ini_set('error_reporting', E_ALL);

$level = ini_get('error_reporting'); // string(5) "32767"

error_reporting(E_ALL);

$lev = error_reporting();

var_dump($level); // string(5) "32767"

var_dump($lev); // int(32767)

-------------------------------------------------------------------------------------ini_set('display_errors','Off'); ini_set('log_errors', 'On'); ini_set('error_log', RUNTIME_PATH. 'logs/error.log');

专门的相关函数

如:

error_reporting(E_ALL); // 设置错误级别为所有错误

error_reporting(); // 获取当前错误级别

error_reporting(E_ALL ^ E_NOTICE) // 除了E_NOTICE报错

error_reporting(E_ERROR | E_WARNING | E_PARSE) // 三或

2.9 常用配置项

一时想不起,通常不需要配置,但是还是结合自身项目,并且借鉴网上的优秀实践进行配置。

1). 配置错误级别

error_reporting(); // 设置 PHP 的报错级别并返回当前级别。

error_reporting(0); // 禁用错误报告

error_reporting(0); // 禁用错误报告 error_reporting(E_ALL ^ E_NOTICE); // 显示除去 E_NOTICE 之外的所有错误信息 error_reporting(E_ALL^E_WARNING^E_NOTICE); // 显示除去E_WARNING E_NOTICE 之外的所有错误信息

error_reporting(E_ERROR | E_WARNING | E_PARSE); // 显示运行时错误,与error_reporting(E_ALL ^ E_NOTICE);效果相同。

error_reporting(E_ALL); // 显示所有错误

error_reporting(E_ALL || ~E_NOTICE); // 应该也是显示所有错误

2). 显示错误

ini_set('display_errors','On'); // 打开

ini_set('display_errors','1'); // 打开

ini_set('display_errors','Off'); // 关闭

ini_set('display_errors','0'); // 关闭

3). 内存使用

tbd

后续补充

...