外链论坛

 找回密码
 立即注册
搜索
查看: 16|回复: 1

让PHP应用性能维持在更高水平,你怎么做

[复制链接]

2832

主题

316

回帖

9191万

积分

论坛元老

Rank: 8Rank: 8

积分
91919718
发表于 2024-10-4 16:01:59 | 显示全部楼层 |阅读模式
点击进入“PHP开源社区”    免费获取进阶面试、文档、视频资源默认状况下安装的PHP类似于在百货商店中购买的常规软件包,但它非常合适,但并不完美。调优的PHP就像是量身定制的装备。

然则,应该重视的是,调优PHP只是加强PHP性能和效率的一种手段,它与不良的代码和无响应的API调用无关。

php.ini文件

PHP 解释器在 php.ini 文件中配置和调优,此文件的位置在区别的操作系统中是区别的,并且常规命令行对应 php.ini 和 PHP-FPM 对应的 php.ini 文件是掰开的。在这儿咱们假设配置PHP-FPM 对应于php.ini然则下面讲的优化办法适用于所有 php.ini注:咱们首要应该运用 PHP Iniscan 工具扫描 php.ini,检测运用了安全方面的最佳实践。

内存

运行 PHP 时需要关心每一个 PHP 进程要运用多少内存,php.ini 中的 memory_limit 设置用于设定单个 PHP 进程能够运用的系统内存最大值。此设置的默认值为128M,这可能适用于大都数中小型PHP应用程序。然则倘若您正在运行微型PHP应用程序,则能够降低此值以节省系统资源。另一方面,倘若您正在运行内存密集型的PHP应用程序,则能够增多该值。此值的体积由可用的系统内存确定,确定为PHP分配多少值是一门艺术。决定给 PHP 分配多少内存,以及能包袱起多少个 PHP-FPM 进程时,能够按照以下维度信息进行判断:

一共能够分配给 PHP 多少内存?以一个 2G 内存的 VPS 为例,这台设备中可能还运行了其他进程,如 MySQL、Nginx 等,那样留 512M 给 PHP 是合适的。

每一个 PHP 进程平均耗费多少内存?这个要监控进程的内存运用量,能够运用命令行命令 top能够在 PHP 脚本中调用memory_get_peak_usage() 函数,不管运用哪种方式,都要多次运行同一个脚本,而后取内存消耗的平均值。

包袱起多少个 PHP-FPM 进程?假设我给 PHP 分配了 512M 内存,每一个 PHP 进程平均耗费 15M 内存,那样能够包袱起 34 个 PHP-FPM 进程。

有足够的系统资源吗?最后还需要确认有足够的系统资源运行 PHP 应用并处理预期的流量。

注:咱们应该运用 Apache Bench 或 Siege 在类似生产环境的要求下对 PHP 应用做压力测试,以确定生产环境是不是有足够的资源可用。

Zend OPcache

确定要分配多少内存后,就能够配置 PHP 的 Zend OPcache 扩展PHP 5.5.0+ 内置了这个扩展,下面是在 php.ini 文件中配置和优化 Zend OPcache 扩展所用的设置:

opcache.memory_consumption = 64:为操作码缓存分配的内存量(以MB为单位)。分配的内存量应能够存储应用程序中所有PHP脚本编译的操作码。该值能够按照应用程序的体积设置为区别的值。

opcache.interned_strings_buffer = 16:用于存储常驻字符串的内存量(以MB为单位)。什么是驻留字符串?  PHP解释器将在其后找到同一字符串的多个实例,并将此字符串保留在内存中。

倘若再次运用相同的字符串,PHP解释器将运用指针,以节省内存。默认状况下,PHP驻留字符串在每一个PHP进程中都是隔离的。

此设置准许PHP-FPM进程池将所有进程驻留字符串存储在共享缓冲区中,以便能够将其存储在PHP-FPM进程池中。在多个进程之间引用常驻字符串,从而节省了更加多内存。

opcache.max_accelerated_files = 4000能够存储在操作码缓存中的PHP脚本的最大数量。取值范围是2000〜100,000。此值必须大于PHP应用程序中的文件数。

opcache.validate_timestamps = 1:当此设置的值为1时,一段时间后,PHP将检测PHP脚本的内容是不是已更改,并检测间隔由 opcache.revalidate_freq 设置指定。倘若此设置的值为0,则PHP将不会检测PHP脚本的内容是不是有更改,并且咱们必须自己清除缓存的操作码。意见研发环境中将其设置为1,在生产环境中将其设置为0。

opcache.revalidate_freq = 0:设置多久(单位是秒)检测一次 PHP 脚本内容是不是有变化。设置为0秒的含义是仅当opcache.validate_timestamps 设置为1时,每次请求PHP文件时都会重新验证它们,因此呢,每次在研发环境中而不是在生产环境中都会重新验证PHP文件。

opcache.fast_shutdown = 1:此设置准许操作码运用更快的停机时间,将对象破坏和内存释放留给Zend Engine的内存管理器。

文件上传

倘若您的应用程序准许上传文件,则最好设置能够上传的最大文件体积另一,最好设置一次能够上传多少个文件:file_uploads = 1upload_max_filesize = 10

M

max_file_uploads = 3默认状况下,PHP准许在单个请求中上传20个文件。 上传的最大文件为2MB。在这儿,我将其设置为在单个请求中最多上传3个文件,每一个文件的最大体积为10MB。不要设置此值。很大,否则会出现超时。注:倘若非要上传大文件,Web 服务器的配置要做相应调节。除了在 php.ini 中设置之外,还要调节 Nginx 虚拟主机配置中的 client_max_body_size 设置。

最长执行时间

php.ini 文件中的 max_execution_time 用于设置单个PHP进程在终止之前能够运行的最长期。此设置默认为30秒,意见将其设置为5秒:max_execution_time = 5注:在 PHP 脚本中能够调用 set_limit_time() 函数覆盖这个设置。假设咱们要生成报告并将结果生作为PDF文件。该任务可能需要10分钟才可完成,并且咱们当然不期盼等待PHP请求10分钟。咱们应该编写一个单独的PHP文件,并将其放在单独的背景中。在该流程中执行后,Web应用程序能够在几毫秒内生成一个单独的后台流程,而后返回HTTP响应:exec(echo "create-report.php" | at now

);

echo report pending...

;

create-report.php在单独的后台进程中运行。运行之后,您能够更新数据库或将报告经过电子邮件发送给收件人。然则,这种用法很少见。一般咱们经过异步运用队列来实现类似的功能。无论在安全性,可伸缩性和可守护性方面,效果都更好。关联组件拥有轻量级信息队列PHPResque等。

处理会话

PHP的默认会话处理程序减慢了大型应用程序的速度,由于该处理程序将会话数据存储在硬盘上,从而导致不必要的磁盘I / O并浪费时间。咱们应该将会话数据保存在内存中,例如运用Memcached或Redis。这还有一个额外的好处-将来更易扩展倘若会话数据存储在硬盘上,则添加其他服务器不方便。倘若会话数据存储在Memcached或Redis中,则任何分布式PHP-FPM服务器都能够拜访会话数据。倘若想把会话数据保留在 Memcached 中,需要做如下配置:session.save_handler =memcachedsession.save_path = 127.0.0.1:11211

缓冲输出

倘若在更少的块中发送更加多的数据,而不是在更加多的块中发送更少的数据,则网络将更加有效便是说,以更少的片段浏览器传递内容以进行拜访,这能够减少HTTP请求的总数。因此呢咱们必须让PHP缓冲输出。默认状况下,PHP已启用输出缓冲功能,并且PHP将在缓冲4096字节的输出后将内容发送到Web服务器。output_buffering = 4096implicit_flush = false注:倘若想要修改输出缓冲区的体积保证运用的值是4(32位系统)或8(64位系统)的倍数

真实路径缓存

PHP 会缓存应用运用的文件路径,这般每次包括或导入文件时就无需持续搜索包括路径了,这个缓存叫真实路径缓存(realpath cache),倘若运行的是大型的 PHP 文件(如 Composer 组件),运用海量文件,增多 PHP 真实路径缓存的体积能得到更好的性能。真实路径缓存的默认体积为16K。此缓存所需的确切体积很难确定,但能够运用有些技巧:首要增多实质路径高速缓存的体积并将其设置为尤其大的值,例如256K。最后在php脚本末尾添加上 print_r(realpath_cache_size());,输出真实路径缓存的真正体积,最后,把真实路径缓存的体积改为这个真正的值。咱们能够在 php.ini文件中设置真实路径缓存的体积realpath_cache_size = 64

K

*声明:本文于网络整理,版权归原作者所有,如源自信息有误或侵犯权益,请联系咱们删除或授权事宜。

ENDPHP开源社区

扫描关注  进入”PHP资料“

免费获取进阶

面试、文档、视频资源

点击“查看原文”获取更加多




上一篇:电脑pdf文件一般用什么打开?pdf文件怎么打开?五种办法打开PDF
下一篇:【乐柠】 我叫牛钰宸,来自河北张家口,现就读于乐柠教育PHP互联网专业。
回复

使用道具 举报

3129

主题

3万

回帖

9996万

积分

论坛元老

Rank: 8Rank: 8

积分
99968654
发表于 7 天前 | 显示全部楼层
你的见解独到,让我受益匪浅,非常感谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-18 05:36 , Processed in 0.103766 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.