PHP配置

推荐链接

链接目录

命令行环境下执行不同版本的PHP程序

'php5.6'
path\to\php5.6\php.exe script.php

'php8.0'
path\to\php8\php.exe script.php
D:\wamp64\bin\php\php8.0.26\php.exe windows.php

//有可能执行依旧有问题因为PHP.exe 查找的还是全局的PHPcli,导致还是会出现版本问题
'Windows 使用 Set 命令临时设置 PATH 环境变量'
set PATH=D:\wamp64\bin\php\php8.0.26;%PATH%
//设置完成后在尝试就没问题了

设置脚本的最大执行时间

// 设置最大执行时间为 60 秒
ini_set('max_execution_time', '60');
// 设置最大执行时间为无限制
ini_set('max_execution_time', 0);

opcache的配置与使用

开启

//[php] 区段下面写对应的配置文件(如果将 zend_extension 写到其他区段,配置不会生效)
[PHP]
;zend_extension=opcache.so #Linux环境下用来引用opcache。
zend_extension=opcache.dll #Windows环境下用来引用opcache。

[opcache]
;zend_extension ="php_opcache.so"
zend_extension ="d:/wamp64/bin/php/php5.6.25/ext/php_opcache.dll"
opcache.enable=1 #允许在web环境使用,默认是开启的。
opcache.enable_cli=1 #运行在cli环境使用


//配置完成后可以进行检测opcache
if (extension_loaded('Zend OPcache') && ini_get('opcache.enable')) {
    echo "Opcache 已开启";
} else {
    echo "Opcache 未开启";
}

//确保JIT确实有效
var_dump(opcache_get_status()['jit']);
array:7 [
  "enabled" => true
  "on" => true
  "kind" => 5
  "opt_level" => 4
  "opt_flags" => 6
  "buffer_size" => 4080
  "buffer_free" => 0
]
enabled和on是 true 说明配置成功

函数

opcache_compile_file — 无需运行,即可编译并缓存 PHP 脚本
opcache_get_configuration — 获取php.ini中的配置信息
opcache_get_status — 获取缓存的状态信息
opcache_invalidate — 废除脚本缓存
opcache_is_script_cached — 一个php文件是否被缓存
opcache_reset — 重置情况所有的缓存内容

//打开一个新的PHP脚本文件,在脚本文件中使用opcache_reset()函数来重置OPcache缓存
<?php
opcache_reset();
echo "OPcache缓存已清除。";
?>

常用配置

在开发环境下,不建议开启opcache,会影响正常效果展示。

opcache.enable=1  #开启
opcache.memory_consumption=128 #缓存opcode的最大内存空间
opcache.interned_strings_buffer=32 #存储临时字符串的内存大小
opcache.max_accelerated_files=200000 #可缓存的PHP文件数量
opcache.validate_timestamps=1 #是否开启PHPcode的缓存有效期
opcache.revalidate_freq=60 #PHPcode缓存时间
opcache.save_comments=0 #不缓存注释内容
;opcache.jit=on #控制OPcache的JIT编译功能
;opcache.jit_buffer_size=128M #为编译 JIT 代码保留的共享内存量


/**
opcache.validate_timestamps是否需要开启(不建议开启)
开启后,opcache会每隔一段时间去检查哪个opcode缓存是否到期,这必然会付出一点性能代价。在生产环境下,其实代码都是很固定的,很长时间不会变化,设置这样一个定时任务纯属浪费不必要的性能资源。
所以有必要把opcache.validate_timestamps关掉,当有新的代码上传到生产环境,只需要在脚本执行下opcache_reset函数,就可以清掉所有的缓存,让新代码在下次脚本执行时被缓存。

opcache.enable_cli是否需要开启(不建议开启)
启用opcache.enable_cli选项,在命令行(cli模式)下运行PHP脚本时才会有效果(例如 php index.php)。
OPcache扩展通过将缓存的操作码存储在当前进程的内存中来工作。
这仅在 PHP进程处理[可以重用这些操作码的多个请求]时有用,例如在Web服务器或FastCGI下。对于像PHP CLI这样运行一个“请求”并退出的进程,它只会浪费内存和时间。

如果使用了swoole拓展做常驻内存的web应用,可以开启。它的作用可以体现在这些地方:
比如【include多次调用同一PHP文件】,在一些模板组件中会遇到这些情况,比如TP模板引擎。
TP模板组件会多次调用include语句载入同一个模板PHP缓存文件,开启了cli模式下的opcache,第一次include就会把【编译好的模板PHP缓存文件的opcode】放入内存中,从第二次include开始直接从内存中读取,而不用每次都从硬盘上读取,再编译

*/

全部配置

//启用(设置为1) 禁用(设置为0)

opcache.enable boolean
	启用操作码缓存。如果禁用此选项,则不会优化和缓存代码。 在运行期使用 ini_set() 函数只能禁用 opcache.enable 设置,不可以启用此设置。 如果在脚本中尝试启用此设置项会产生警告。

opcache.enable_cli boolean
	仅针对 CLI 版本的 PHP 启用操作码缓存。 通常被用来测试和调试。

opcache.memory_consumption integer
	opcache的共享内存大小,以兆字节(MB)为单位。


opcache.interned_strings_buffer integer
;opcache.interned_strings_buffer=8
	用来存储临时字符串的内存大小,以兆字节为单位。 PHP 5.3.0 之前的版本会忽略此配置指令。
这是一个很有用的选项,但是似乎完全没有文档说明。PHP使用了一种叫做字符串驻留(stringinterning)的技术来改善性能。例如,如果你在代码中使用了1000次字符串“foobar”,在PHP内部只会在第一使用这个字符串的时候分配一个不可变的内存区域来存储这个字符串,其他的999次使用都会直接指向这个内存区域。这个选项则会把这个特性提升一个层次——默认情况下这个不可变的内存区域只会存在于单个php-fpm的进程中,如果设置了这个选项,那么它将会在所有的php-fpm进程中共享。在比较大的应用中,这可以非常有效地节约内存,提高应用的性能,如果把它设置为16,则表示16MB,默认是4MB。


opcache.max_accelerated_files integer
;opcache.max_accelerated_files=4000
  opcache哈希表中可存储的脚本文件数量上限。 真实的取值是在质数集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一个比设置值大的质数。 设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000PHP 5.5.6 及之后是 1000000。
  

opcache.validate_timestamps boolean
;opcache.validate_timestamps=1
    如果启用,那么 OPcache 会每隔 opcache.revalidate_freq 设定的秒数 检查脚本是否更新。 如果禁用此选项,你必须使用 opcache_reset() 或者 opcache_invalidate() 函数来手动重置 OPcache,也可以 通过重启 Web 服务器来使文件系统更改生效。

opcache.revalidate_freq integer
;opcache.revalidate_freq=60
    检查脚本时间戳是否有更新的周期,以秒为单位。 设置为 0 会导致针对每个请求, OPcache 都会检查脚本更新。
    如果 opcache.validate_timestamps 配置指令设置为禁用,那么此设置项将会被忽略。

opcache.revalidate_path boolean
    如果禁用此选项,在同一个 include_path 已存在的缓存文件会被重用。 因此,将无法找到不在包含路径下的同名文件。

opcache.save_comments boolean
    如果禁用,脚本文件中的注释内容将不会被包含到操作码缓存文件, 这样可以有效减小优化后的文件体积。 禁用此配置指令可能会导致一些依赖注释或注解的 应用或框架无法正常工作, 比如: Doctrine, Zend Framework 2 以及 PHPUnit。


opcache.max_wasted_percentage integer
 浪费内存的上限,以百分比计。 如果达到此上限,那么 OPcache 将产生重新启动续发事件。

opcache.use_cwd boolean
    如果启用,OPcache 将在哈希表的脚本键之后附加改脚本的工作目录, 以避免同名脚本冲突的问题。 禁用此选项可以提高性能,但是可能会导致应用崩溃。


opcache.load_comments boolean
    如果禁用,则即使文件中包含注释,也不会加载这些注释内容。 本选项可以和 opcache.save_comments 一起使用,以实现按需加载注释内容。

opcache.fast_shutdown boolean
    如果启用,则会使用快速停止续发事件。 所谓快速停止续发事件是指依赖 Zend 引擎的内存管理模块 一次释放全部请求变量的内存,而不是依次释放每一个已分配的内存块。

opcache.enable_file_override boolean
    如果启用,则在调用函数 file_exists()is_file() 以及 is_readable() 的时候, 都会检查操作码缓存,无论文件是否已经被缓存。 如果应用中包含检查 PHP 脚本存在性和可读性的功能,这样可以提升性能。 但是如果禁用了 opcache.validate_timestamps 选项, 可能存在返回过时数据的风险。

opcache.optimization_level integer
    控制优化级别的二进制位掩码。

opcache.inherited_hack boolean
    在 PHP 5.3 之前的版本,OPcache 会存储代码中使用 DECLARE_CLASS 操作码 来实现继承的位置。当文件被加载之后,OPcache 会尝试使用当前环境来绑定被继承的类。 由于当前脚本中可能并不需要 DECLARE_CLASS 操作码,如果这样的脚本需要对应的操作码被定义时, 可能无法运行。
    在 PHP 5.3 及后续版本中,此配置指令会被忽略。

opcache.dups_fix boolean
    仅作为针对 “不可重定义类”错误的一种解决方案。

opcache.blacklist_filename string
    OPcache 黑名单文件位置。 黑名单文件为文本文件,包含了不进行预编译优化的文件名,每行一个文件名。 黑名单中的文件名可以使用通配符,也可以使用前缀。 此文件中以分号(;)开头的行将被视为注释。

//php8新特性
opcache.jit=off
;opcache.jit=on
	控制OPcache的JIT(Just-In-Time)编译功能。JIT编译是OPcache的一项特性,它可以将PHP代码动态地编译为本机机器码,以提高执行效率。
;opcache.jit=1255(如果想要最高性能可以使用)
	CPU特定的优化标志:
		0	没有
		1个	启用AVX指令生成
	R-寄存器分配:	
		0	不执行寄存器分配
		1个	使用本地线性扫描寄存器分配器
		2	使用全局线性扫描寄存器分配器
	JIT触发器:
		0	JIT在第一次脚本加载时的所有功能
		1个	首次执行时的JIT函数
		2	在第一个请求时进行概要分析,并在第二个请求时编译热功能
		3	动态分析并编译热功能
		4	在文档注释中使用@jit标记编译函数
		5	跟踪JIT
	O-优化级别:
		0	不要准时
		1个	最小JIT(调用标准VM处理程序)
		2	选择性VM处理程序内联
		3	基于单个函数的静态类型推断的优化JIT
		4	静态类型推断和调用树的优化JIT
		5	基于静态类型推断和内部过程分析的优化JIT



;opcache.jit_buffer_size=0
opcache.jit_buffer_size=128M
	为编译 JIT 代码保留的共享内存量,0 表示禁用 JIT

PHP版本号隐藏

PHP 版本信息泄露
系统数据包 X-Powered-By 字段泄露了 PHP 具体版本信息

//找到php.ini文件
//要修改的位置,把expose_php=On 改为 expose_php=Off
//service php-fpm restart  #apache服务器可使用命令service httpd restart 

PHP链接SQLServer数据库

首先要确定sqlserver扩展是否启用

//第一种
<?php
phpinfo();
?>
'搜索关键词 "sqlsrv""pdo_sqlsrv"。
如果找到了与 SQL Server 相关的扩展信息,则表示 PHP 已经启用了 SQL Server 扩展。'

//第二种
<?
if (extension_loaded('sqlsrv')) {
    echo "SQL Server 扩展已启用";
} else {
    echo "SQL Server 扩展未启用";
}
?>
$server = '链接的服务器地址';
$database = '数据库名称';
$username = '用户名称';
$password = '用户密码';

$conn = sqlsrv_connect($server, array('UID'=>$username, 'PWD'=>$password, 'Database'=>$database,"CharacterSet" => "UTF-8"));
if( $conn  ) {
    echo "连接成功";
    $sql = "SELECT top 100 * FROM tb_user";
    $res = sqlsrv_query($conn, $sql);
    if ($res === false) {
        die(print_r(sqlsrv_errors(), true));
    }
    while ($row = sqlsrv_fetch_array($res, SQLSRV_FETCH_ASSOC)) {
        //字段必须要完全一样
        echo "<p>ID: " . $row['字段1'] . ", user_name: " . $row['字段2'] .  "</p>";
    }
} else {
    echo "连接失败";
}

PHP 扩展

apache 和 PHP 的报错日志真的很重要,很重要,很重要

在 Windows 上有两种加载 PHP 扩展的方式:把扩展编译进 PHP,或者加载 DLL。加载预编译的扩展是更简单更被推荐的方式。
要加载扩展,需要在系统中有可用的 .dll 文件。

PHP性能分析

Xdebug

'xdebug2'
#zend_extension="xdebug.so"
zend_extension="xdebug.dll"
# profiler功能的开关,默认值0,如果设为1,则每次请求都会生成一个性能报告文件。
# xdebug.profiler_enable=0

# 默认值是0,如果设为1 则当我们的请求中包含 XDEBUG_PROFILE 参数时才会生成性能报告文件
#127.0.0.1/test/index.php?XDEBUG_PROFILE=1
xdebug.profiler_enable_trigger=1

# 分析文件保存目录, 默认是 /var/tmp
xdebug.profiler_output_dir="/var/tmp/xdebug"
'xdebug3'
[xdebug]
zend_extension="d:/wamp64/bin/php/php8.0.26/zend_ext/php_xdebug-3.1.6-8.0-vs16-x86_64.dll"
;xdebug.mode=profile
xdebug.mode = debug
xdebug.start_with_request=trigger
xdebug.output_dir="d:/wamp64/xtmp"

;确保端口未被占用
xdebug.client_port = 9003
;IDE所在的IP地址 本地默认不用配置
xdebug.client_host=127.0.0.1 

/**

Xdebug 3 提供了多种不同的模式,用于不同的调试和开发需求:
debug:这是用于交互式调试的模式。
develop:提供额外的信息,帮助开发者更好地理解和修复代码。
trace:生成函数调用的跟踪日志。
profile:生成性能分析文件,帮助找出程序中的性能瓶颈。
gcstats:收集关于垃圾回收机制的统计信息。
coverage:用于代码覆盖率分析,通常与单元测试一起使用。

xdebug.mode=profile:这个选项设置Xdebug的模式为“profile”,这意味着Xdebug将启用性能分析功能。
xdebug.mode=debug,profile,trace 以同时启用多个功能


xdebug.start_with_request=trigger:这个选项允许您通过一个触发器来启动性能分析。触发器可以是一个GET参数、POST参数或者Cookie。例如,您可以在请求的URL中添加?XDEBUG_PROFILE或者发送一个名为XDEBUG_PROFILE的Cookie来触发性能分析。这样,只有当触发器存在时,Xdebug的性能分析功能才会启动,而不是在每个请求上都启动。
xdebug.start_with_request=yes: 则会导致每个请求开始时自动启动性能分析
xdebug.output_dir="d:/wamp64/xtmp":这个选项指定了Xdebug生成的性能分析文件(通常是.cachegrind文件)的存储目录。您需要确保指定的目录存在,并且您的Web服务器有权限写入该目录。
*/

Webgrind

git链接: webgrind
将webgrind下载下来后解压到本地的web目录,然后在浏览器中执行http://127.0.0.1/webgrind-master/,并且在显示webgrind页面右上角点击update
非正常情况:如果执行了浏览器只显示webgrind页面,执行update没有显示表格,那么可能需要执行在webgrind-master目录下执行 composer install,然后在config.php 设置对应xdebug生成cachegrind.out报告的路径

'webgrind-master文件夹下的config.php可以做相关配置'
//一个可以写入的文件夹路径。(存储分析后生成的 cachegrind文件,为空就是用系统tmp文件夹或者xdebug的tmp文件夹。)
$storageDir

//如果没装xdebug,webgrind就会到此路径下分析里面的cachegrind文件。如果安装了xdebug那么会查找它的xdebug.profiler_output_dir。(默认是/tmp)
$profilerDir 

Show::webgrind把所有被调用函数/方法首先做一个排序,由高到低显示。然后取出前N个,使他们耗时比率之和在90-100%之间。注意: 最好不要选择100%,这样将会显示所有被调用的函数/方法,如果是一个代码复杂的页面,那么webgrind偶尔会被卡死。并且通常我们只要关注耗时前几名的函数即可。
of: 就是选择profile文件。默认是分析最新一次的xdebug记录。如果之前设置好路径和记录机制那么我们就会发现下拉列表里有很多选项。
in: 显示百分比/毫秒/微秒
彩色进度条: 蓝代表php内置函数,灰色代表requir/onclude,绿代表类方法,橙黄代表类其他过程函数 (用户自定义函数)
update: 表示更新在这里插入图片描述
需要配合下面的PHP代码进行分析,分析时候记得调整show到100%
invocation count 表示的是整个php页面从载入到执行完毕呈现,各种函数被调用的总次数(如sleep不管被哪个函数调用,总共页面期执行了6次,自身调用一次,t3调用一次,t4调用一次,t4调用t3一次,t5调用t4间接导致t3调用,1+1+2+2 = 6)。
total self cost 表示的是函数自身消耗(就如t5中10万次循环,但sleep执行了2000毫秒,但自身消耗并不把其他任何函数调用算在其中)。
total inclusive cost 表示的是此函数从开始到执行完毕所用消耗 ,包括自身消耗和调用其他函数消耗。
Calls 此函数中调用并执行的所有函数/方法名 次数 及耗时。
Total Call Cost 被此父函数调用时,执行的总耗时。
Count - 父函数调用子函数的次数。

//仅使用内置函数
function t1(){
    time();
}
//自定义函数外再执行一次
time();
sleep(1);
t1();

//t2调用自定义函数
function t2(){
    t1();
}
t2();

//增加内置函数耗时
function t3(){
    sleep(1);
}
t3();


//t4增加调用自定义函数t3一次。
function t4(){
    t3();
    sleep(1);
}
t4();


//t5增加非调用函数式内耗 for循环10万次,并调用t4
function t5()
{ $u=0;
    for($i=0;$i<100000;$i++)
    {  $u+=$i;   }
    t4();
}
t5();

die;

xhprof

//这是一个配置节的标识符,用于指定接下来的配置项适用于 xhprof 扩展。
[xhprof]
//这是指定要加载的 xhprof 扩展的 DLL 文件
extension=php_xhprof.dll
//指定 xhprof 输出文件的目录路径。xhprof 扩展会生成性能分析数据,并将其保存在指定的输出目录中。
xhprof.output_dir="D:/wamp64/xtmp/xhprof"
//使用phpinfo()来搜索xhprof或者使用下面代码

// 判断xhprof扩展是否安装
if (extension_loaded('xhprof')) {
    echo 'xhprof扩展已安装';
} else {
    echo 'xhprof扩展未安装';
}

// 判断xhprof扩展是否开启
if (function_exists('xhprof_enable')) {
    echo 'xhprof扩展已开启';
} else {
    echo 'xhprof扩展未开启';
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值