在小公司,特别是创业型公司,整个服务器的搭建一般也是我们 PHP 开发工程师的职责之一。其中,最主要的一项就是要配置好服务器的 php.ini 文件。一些参数会对服务器的性能产生深远的影响,而且也有些参数是可以在 PHP 运行时动态指定和获取的。今天,我们就来学习一些和 php.ini 文件有关的操作函数。

动态设置ini文件的配置参数

这个函数相信大家不会陌生,基本上做过 PHP 开发的都会使用过。但是,有些参数是无法修改的,这个你知道吗?

ini_set('allow_url_fopen', 0);
echo ini_get('allow_url_fopen'), PHP_EOL; // 1 ,无法修改,PHP_INI_SYSTEM ini_set('memory_limit', -1);
echo ini_get('memory_limit'), PHP_EOL; // -1,可以修改,PHP_INI_ALL

请注意看注释,第一条注释中写了 ,PHP_INI_SYSTEM ,并且这个参数无法修改。没错,相信聪明的你已经看出来了,这些参数是有对应的类型的。PHP_INI_SYSTEM 的意思就是只能在 php.ini 或者 httpd.conf 中进行修改,无法在语言动态运行时修改。

不同的 php.ini 配置参数对应有四种类型:

  • PHP_INI_USER:可在用户脚本(例如 ini_set())或 Windows 注册表(自 PHP 5.3 起)以及 .user.ini 中设定
  • PHP_INI_PERDIR:可在 php.ini,.htaccess 或 httpd.conf 中设定
  • PHP_INI_SYSTEM:可在 php.ini 或 httpd.conf 中设定
  • PHP_INI_ALL:可在任何地方设定

也就是说,使用 ini_set() 我们可以设定类型为 PHP_INI_USER 和 PHP_INI_ALL 类型的参数,而其它两种只能在 php.ini 或其他配置文件中设置修改。具体的配置参数对应的类型请参考 PHP 相关文档。

https://www.php.net/manual/zh/ini.list.php

获取ini文件中的配置信息

当然,读取 php.ini 文件中的配置信息就没有什么限制了。直接就可以读取,我们可以使用两个函数来进行读取,它们是:get_cfg_var() 和 ini_get() 。另外,还有一个可以获取数组集合形式的配置信息的函数 ini_get_all() 。我们一个一个来看。

get_cfg_var() 和 ini_get()

都是读取单个配置参数信息。

echo get_cfg_var('error_reporting'), PHP_EOL; // 32759
echo ini_get('error_reporting'), PHP_EOL; // 32759 echo get_cfg_var('request_order'), PHP_EOL; // GP
echo ini_get('request_order'), PHP_EOL; // GP // php.ini A=TEST_A
echo get_cfg_var('A'), PHP_EOL; // TEST_A
echo ini_get('A'), PHP_EOL; //

上面两条不用多解释,我们需要注意到的是,最后一条。我们在 php.ini 文件中定义了一个自定义的配置参数 A 。可以看到,get_cfg_var() 可以正常获取到这条信息,但 ini_get() 无法获取。我们再看另外一个例子。

ini_set('error_reporting', E_WARNING);
echo get_cfg_var('error_reporting'), PHP_EOL; // 32759,只返回.ini的内容
echo ini_get('error_reporting'), PHP_EOL; // 2,返回当前配置运行时的状态

使用 ini_set() 动态设置了 error_reporting 参数后,get_cfg_var() 返回是 ini_set() 设置的值,而 ini_get() 获取的依然是 php.ini 文件里面配置的值。

从上面两个例子可以看出这两个函数的区别:

  • get_cfg_var(),可以获取自定义的配置参数值,但只以 php.ini 文件为准,无法获得动态修改的参数值
  • ini_get(),无法获取自定义的配置参数值,以当前的动态脚本运行时的配置为准,也就是能够获取到 ini_set() 修改后的参数值

ini_get_all()

它获取的是一组数据,比如我们安装的一些扩展 Swoole 、 xDebug 或者 mysqlnd 这类的配置信息。

print_r(ini_get_all('swoole'));
echo PHP_EOL;
// Array
// (
// [swoole.display_errors] => Array
// (
// [global_value] => On
// [local_value] => On
// [access] => 7
// ) // [swoole.enable_coroutine] => Array
// (
// [global_value] => On
// [local_value] => On
// [access] => 7
// ) // [swoole.enable_library] => Array
// (
// [global_value] => On
// [local_value] => On
// [access] => 7
// ) // [swoole.enable_preemptive_scheduler] => Array
// (
// [global_value] => Off
// [local_value] => Off
// [access] => 7
// ) // [swoole.unixsock_buffer_size] => Array
// (
// [global_value] => 262144
// [local_value] => 262144
// [access] => 7
// ) // [swoole.use_shortname] => Array
// (
// [global_value] =>
// [local_value] =>
// [access] => 4
// ) // )

可以看出,我们针对 Swoole 所作的所有配置信息都以数组形式返回了。

还原配置信息

当我们使用了 ini_set() 动态设置了参数信息后,想还原为 php.ini 文件中的默认配置的话,直接使用一个 ini_restore() 函数就可以了。

ini_restore('error_reporting');
echo ini_get('error_reporting'), PHP_EOL; // 32759

依然是沿用上面的代码, error_reporting 已经被我们修改为了 2 ,这时,我们直接使用 ini_restore() 进行了还原,再使用 ini_get() 就可以看到 error_reporting 参数还原回了 php.ini 文件中定义的原始值。

获取当前加载的配置文件路径

当你接手一台服务器的时候,往往第一步就是找到它的相关应用配置文件,比如 mysql 的 my.ini 或者 nginx 的 conf 相关配置文件路径,而 PHP 中我们第一步就是要找到 php.ini 文件在哪里。

echo php_ini_loaded_file(), PHP_EOL;
// /usr/local/etc/php/7.3/php.ini echo php_ini_scanned_files(), PHP_EOL;

我们直接使用 php_ini_loaded_file() 就可以方便的获取到当前运行的脚本环境中加载的 php.ini 文件的路径。而 php_ini_scanned_files() 函数则是会以逗号分隔的形式返回所有可以扫描 php.ini 文件的路径。其实这两个参数在 phpinfo() 中都都有所体现,但很多时候我们并不能直接在生产环境中去使用 phpinfo() 。

其实,相对于这两个函数或 phpinfo() 来说,更好的方案是直接在命令行查找 php.ini 文件的位置。

php --ini
# Configuration File (php.ini) Path: /usr/local/etc/php/7.3
# Loaded Configuration File: /usr/local/etc/php/7.3/php.ini
# Scan for additional .ini files in: /usr/local/etc/php/7.3/conf.d
# Additional .ini files parsed: /usr/local/etc/php/7.3/conf.d/ext-opcache.ini php -i | grep "Configuration"
# Configuration File (php.ini) Path => /usr/local/etc/php/7.3
# Loaded Configuration File => /usr/local/etc/php/7.3/php.ini
# Configuration

phpinfo()

关于 phpinfo() ,我们不用解释太多,里面的内容都有什么应该是学习使用 PHP 的开发人员的必修课。在这里,我们只是介绍一下 phpinfo() 这个函数的参数。没错,它是有参数的,可以只显示一部分的信息而不是全部都显示出来。

  • INFO_GENERAL:配置的命令行、 php.ini 的文件位置、建立的时间、Web 服务器、系统及更多其他信息。
  • INFO_CREDITS:PHP 贡献者名单。参加 phpcredits()。
  • INFO_CONFIGURATION:当前PHP指令的本地值和主值。参见 ini_get()。
  • INFO_MODULES:已加载的模块和模块相应的设置。参见 get_loaded_extensions()。
  • INFO_ENVIRONMENT:环境变量信息也可以用 $_ENV 获取。
  • INFO_VARIABLES:显示所有来自 EGPCS (Environment, GET, POST, Cookie, Server) 的 预定义变量。
  • INFO_LICENSE:PHP许可证信息。参见 » license FAQ。
  • INFO_ALL:显示以上所有信息。
phpinfo(INFO_MODULES);

上面的代码在页面中所显示的信息就只是已加载模式相关的配置信息了。phpinfo() 会直接输出到页面上,如果想将它的内容保存在一个变量中,我们需要使用输出缓冲控制来进行操作。我们将在后面的文章中讲到这方面的内容。这里就简单的给一段代码。

ob_start();
phpinfo();
$v = ob_get_contents();
ob_end_clean(); echo $v;

总结

不看不知道,一看吓一跳。原来只是使用过 ini_set() 去修改运行时内存大小,但直到今天才知道原来 ini_set() 并不是所有的配置都可以修改的,每个参数是否能动态修改还要看它的参数类型。而且上面还忘了说了,我们并不能使用 ini_set() 去增加配置参数。也就是说,使用 ini_set("B", "TEST_B") 增加一个 B 参数,然后直接使用 ini_get() 也是无法获取的。而且简单的获取参数信息的两个函数也有这么多的不同,phpinfo() 原来也有这么多参数。果然,文档才是最好的学习资料。旅程还没有停止,我们刷文档的脚步依然不能停,一起加油冲冲冲!!

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202005/source/%E5%85%B3%E4%BA%8Ephp%E7%9A%84ini%E6%96%87%E4%BB%B6%E7%9B%B8%E5%85%B3%E6%93%8D%E4%BD%9C%E5%87%BD%E6%95%B0%E6%B5%85%E6%9E%90.php

参考文档:

https://www.php.net/manual/zh/function.get-cfg-var.php

https://www.php.net/manual/zh/function.ini-set.php

https://www.php.net/manual/zh/function.ini-restore.php

https://www.php.net/manual/zh/function.ini-get.php

https://www.php.net/manual/zh/function.ini-get-all.php

https://www.php.net/manual/zh/function.ini-alter.php

https://www.php.net/manual/zh/function.php-ini-loaded-file.php

https://www.php.net/manual/zh/function.php-ini-scanned-files.php

https://www.php.net/manual/zh/ini.list.php

https://www.php.net/manual/zh/configuration.changes.modes.php

关于php的ini文件相关操作函数浅析的更多相关文章

  1. linux新定时器:timefd及相关操作函数

    timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #inclu ...

  2. (二十四)linux新定时器:timefd及相关操作函数

    timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #inclu ...

  3. python字符串 列表 元组 字典相关操作函数总结

    1.字符串操作函数 find 在字符串中查找子串,找到首次出现的位置,返回下标,找不到返回-1 rfind 从右边查找 join 连接字符串数组 replace 用指定内容替换指定内容,可以指定次数 ...

  4. Git基本命令 -- 基本工作流程 + 文件相关操作

    可以先找一个已经被git管理的项目, 我就使用这个项目吧: https://github.com/solenovex/ID3-Editor 基本工作流程 克隆以后呢, 进入该目录查看一下状态: 然后添 ...

  5. python文件相关操作

    Python文件相关操作 打开文件 打开文件,采用open方法,会将文件的句柄返回,如下: f = open('test_file.txt','r',encoding='utf-8') 在上面的代码中 ...

  6. C语言对文件的操作函数用法详解2

    fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const  ...

  7. C语言对文件的操作函数用法详解1

    在ANSIC中,对文件的操作分为两种方式,即: 流式文件操作 I/O文件操作 一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下: typedef str ...

  8. VC++文件相关操作的函数封装实现

    在开发编译工具中,需要用到文件的相关操作,于是就封装了相关的函数实现: //判断文件是否存在 BOOL FileIsExist(CString strFileName) { CFileFind fin ...

  9. Delphi对ini文件的操作

    一.INI文件的结构:; 注释[小节名]关键字=值 INI文件允许有多个小节,每个小节又允许有多个关键字, “=”后面是该关键字的值. 值的类型有三种:字符串.整型数值和布尔值.其中字符串存贮在INI ...

随机推荐

  1. Sqli-Labs less23-24

    less-23 23关和第1关很像,但是观察代码发现他对--+和#都进行了转义,不能再用这种方式注释 可以用新的注释符:;%00或者and和or语句进行闭合 语句:http://192.168.5.1 ...

  2. HttpClient调用doGet、doPost、JSON传参及获得返回值

    调用 doPost:map传参 Map<String,Object> map = new HashMap<>(); map.put("test"," ...

  3. BuildPack 打包

    无需 dockerfile,使用 buildpacks 打包镜像 书接上文,聪明如你已经发现项目中没有定义 dockerfile,但我们依然能打镜像,是如何做到的呢?正如上面提到的 gradle 的 ...

  4. Linux搭建Syslog服务器

    在大多数据的Linux发行版中,rsyslog是一个预先安装的标准日志后台进程.在 客户端/服务端 的系统配置中,rsyslog 能扮演两个角色;作为一个日志服务器能从其它设备收集日志信息,而作为一个 ...

  5. vs code 调试angular2

    调试步骤: 1.安装nodejs 2.安装vscode 3.vscode安装debugger for chrome插件 4.选择调试->打开调试配置,选择chrome配置,打开lauch.jso ...

  6. gitlab-ci集成SonarQube代码质量检查

    SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误. docker安装 1.拉取 postgres:docker pull postgres:10 2.拉取sona ...

  7. 安全|常见的Web攻击手段之CSRF攻击

    对于常规的Web攻击手段,如XSS.CRSF.SQL注入.(常规的不包括文件上传漏洞.DDoS攻击)等,防范措施相对来说比较容易,对症下药即可,比如XSS的防范需要转义掉输入的尖括号,防止CRSF攻击 ...

  8. nodejs根据word模板生成文档

    这里使用的模块是 docx-templates,直接npm安装即可[方法二:https://www.cnblogs.com/vichang/p/10416449.html]  1,模板文件 +++QU ...

  9. DQL,DML,DDL,DCL分别是什么?

    SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 数据查询语言DQL数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句 ...

  10. 转:自增(自减)在Java与C中的区别

    转自:http://seiyatime.blog.sohu.com/84358295.html 话说昨日面试,在笔试的25个选择题中,涉及自增自减不止一两题,以前在开发过程中并没太在意这方面的问题,也 ...