在小公司,尤其是创业型公司,整个服务器的搭建一般是我们PHP开发工程师的职责之一。其中,最重要的是配置服务器的php.ini文件。有些参数会对服务器的性能产生深远的影响,有些参数可以在PHP运行时动态指定和获取。今天,我们将学习一些与php.ini文件相关的操作函数。动态设置ini文件配置参数的功能相信大家都不陌生。基本上做过PHP开发的都会用。但是有些参数是不能修改的,你知道吗?ini_set('allow_url_fopen',0);echoini_get('allow_url_fopen'),PHP_EOL;//1,不可修改,PHP_INI_SYSTEMMini_set('memory_limit',-1);echoini_get('memory_limit'),PHP_EOL;//-1,可以修改,PHP_INI_ALL请注意注释,第一条注释写的是,PHP_INI_SYSTEM,这个参数不能修改。没错,相信聪明的你已经看出来了,这些参数都有对应的类型。PHP_INI_SYSTEM表示只能在php.ini或httpd.conf中修改,语言动态运行时不能修改。有四种类型对应不同的php.ini配置参数:setPHP_INI_SYSTEMin.htaccessorhttpd.conf:可以在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()都读取单个配置参数信息。echoget_cfg_var('error_reporting'),PHP_EOL;//32759echoini_get('error_reporting'),PHP_EOL;//32759echoget_cfg_var('request_order'),PHP_EOL;//GPechoini_get('request_order'),PHP_EOL;//GP//php.iniA=TEST_Aechoget_cfg_var('A'),PHP_EOL;//TEST_Aechoini_get('A'),PHP_EOL;//上面两个就不用解释了,我们需要注意的是最后一个。我们在php.ini文件中定义了一个自定义的配置参数A。可以看出get_cfg_var()可以正常获取到这个信息,而ini_get()却获取不到。让我们看另一个例子。ini_set('error_reporting',E_WARNING);echoget_cfg_var('error_reporting'),PHP_EOL;//32759,只返回.ini的内容echoini_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_set()和ini_get_all()修改后的参数值,即获取一组数据,比如我们的一些扩展安装Swoole、xDebug或mysqlnd等配置信息。print_r(ini_get_all('swoole'));echoPHP_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');echoini_get('error_reporting'),PHP_EOL;//32759还是用上面的代码,error_reporting已经被我们改成2了,此时我们直接使用ini_restore()恢复,然后使用ini_get(),可以看到error_reporting参数恢复为原来的在php.ini文件中定义的值。获取当前加载的配置文件路径当你接手一台服务器时,第一步往往是找到它相关的应用配置文件,比如mysql的my.config文件。第一步是找到php.ini文件的位置。echophp_ini_loaded_file(),PHP_EOL;///usr/local/etc/php/7.3/php.iniechophp_ini_scanned_files(),PHP_EOL;我们可以通过直接使用php_ini_loaded_file()轻松获取当前运行脚本环境中加载的php.ini文件的路径。php_ini_scanned_files()函数返回所有可以扫描php.ini文件的路径,以逗号分隔。其实这两个参数在phpinfo()中都有体现,但是很多时候我们在生产环境中是不能直接使用phpinfo()的。其实比起这两个函数还是phpinfo(),更好的解决办法是直接在命令行中找到php.ini文件的位置。php--ini#配置文件(php.ini)路径:/usr/local/etc/php/7.3#加载的配置文件:/usr/local/etc/php/7.3/php.ini#扫描额外的.ini文件在:/usr/local/etc/php/7.3/conf.d#解析的其他.ini文件:/usr/local/etc/php/7.3/conf.d/ext-opcache.iniphp-i|grep"Configuration"#配置文件(php.ini)路径=>/usr/local/etc/php/7.3#加载的配置文件=>/usr/local/etc/php/7.3/php.ini#配置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的所有预定义变量(环境、GET、POST、Cookie、服务器)。INFO_LICENSE:PHP许可证信息。请参阅?许可证常见问题解答。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.phphttps://www.php.net/manual/zh/function.ini-set.phphttps://www.php.net/manual/zh/function.ini-restore.phphttps://www.php.net/manual/zh/function.ini-get.phphttps://www.php。net/manual/zh/function.ini-get-all.phphttps://www.php.net/manual/zh/function.ini-alter.phphttps://www.php.net/manual/zh/function。php-ini-loaded-file.phphttps://www.php.net/manual/zh/function.php-ini-scanned-files.phphttps://www.php.net/manual/zh/ini.list。phphttps://www.php.net/manual/zh/configuration.changes.modes.php各媒体平台均可搜索【硬核项目经理】
