本文主要介绍PHP解决高并发问题(opcache)。本文通过一个简单的案例来说明对这项技术的理解和使用。以下是详细内容,有需要的朋友可以参考一下。
php中的高并发Opcache
今天接触到一个客户的服务器,业务逻辑比较简单。估计pv在120w左右,用阿里云2c4g的服务器。一大早就卡了,登录服务器后负载高达八九十。
那就想办法调整一下。突然想起一个学长说:打开opcache,真的会变快。
所以我马上就开始了,过程很简单。
1.转到php,ini在ini中搜索opcache。
2.修改相应的参数(如下)
Zend_extension=opcache.so #是在扩展php7中引入的,默认已经安装了。也许你被鼓励使用它。
[opcache]
;Opcache开关
opcache.enable=1
;在CLI环境下,PHP启用OPcache。
opcache.enable_cli=1
;OPcache共享内存存储大小,以MB为单位
opcache.memory_consumption=128
;PHP使用一种叫做字符串实习的技术来提高性能。比如你在代码中使用字符串“foobar”1000次,那么在PHP中第一次使用时,只会分配一个不可变的内存区域来存储这个字符串,其他999次使用都会直接指向这个内存区域。这个选项将把这个特性提升到一个更高的水平。默认情况下,这个不可变的内存区域只存在于单个php-fpm进程中。如果设置了这个选项,它将在所有php-fpm进程中共享。在较大的应用程序中,这可以节省内存并提高应用程序的性能。
该选项的值以兆字节为单位。如果设置为16,则表示16MB,默认值为4MB。
op cache . interned _ strings _ buffer=8
;该选项用于控制内存中可以缓存的PHP文件的最大数量。该选项必须设置得足够大,以大于项目中所有PHP文件的总和。
设置范围的最小值为200,最大值在PHP 5.5.6之前为100000,PHP 5.5.6之后为1000000。也就是说200到100万之间。
op cache . max _ accelerated _ files=10000
;设置缓存过期时间(秒)。如果是0,每次都会检查。
opcache.revalidate _ freq=60
;字面意思是“允许更快关闭”。它的作用是提供一个更快的机制,在单个请求结束时调用代码中的析构函数,从而加快PHP的响应速度和PHP进程资源的回收速度,让应用程序更快地响应下一个请求。您可以通过将它设置为1来使用这种机制。
opcache.fast_shutdown=1
;如果启用(设置为1),OPcache将在opcache.revalidate _ freq设置的秒数内检测文件的时间戳,以检查脚本是否更新。
如果这个选项被禁用(设置为0),opcache.revalidate _ freq将被忽略,PHP文件将永远不会被检查。这意味着,如果您修改了您的代码,然后您将它更新到服务器,然后在浏览器上请求与更新的代码相对应的功能,您将看不到更新的效果。
强烈建议您在生产环境中将其设置为0,然后在更新代码后平滑重启PHP和web服务器。
opcache.validate_timestamps=0
;打开Opcache文件缓存(实验)。打开这个,我们就可以让Opcache缓存操作码到外部文件中,这样会明显提高一些脚本的性能。
这样PHP会在/tmp目录下缓存一些Opcode的二进制导出文件,可以跨PHP生命周期存在。
opcache.file_cache=/tmp
4.重启php服务器(如果有配置问题,将在相应的错误检查后重做)
5.检查php -m中是否已经有扩展,看是否有opcache,或者在phpinfo()中检查。
6.检查程序中是否有相应的错误,打开后可能会影响一些程序(尤其是那些依赖评论的程序,右对右就是删除评论会出错的那种)
7.完成验证效果。
简单解释一下为什么opcache会加快php的效率。Php是一种解释型语言,每次执行都要经过解释器的翻译,形成字节码,但程序定型后基本不会改变。Opcache将这些内容缓存在内存中。为了减少不必要的重复劳动,减轻负担。至于表演对应,明天就去看下一张图了。效果还是很明显的。服务器从最大容量到大约70%的容量启动。
下面有更详细的配置描述。有需要的话可以看看。
1 opcache.enable布尔值
2启用操作码缓存。如果禁用此选项,将不会优化和缓存代码。运行时,使用ini_set()函数只能禁用opcache.enable设置,而不能启用。如果您尝试在脚本中启用此设置项,将会生成警告。
三
4 opcache.enable_cli布尔值
5仅对PHP的CLI版本启用操作码缓存。通常用于测试和调试。
六
7 opcache.memory_consumption整数
8 op cache的共享内存大小,以兆字节为单位。
九
10 op cache . interned _ strings _ buffer整数
1用于存储临时字符串的内存大小,以兆字节为单位。PHP 5.3.0之前的版本将忽略此配置指令。
12
13 op cache . max _ accelerated _ files整数
1opcache哈希表中可以存储的脚本文件的最大数量。的实际值是素数集合{223,463,983,1979,3907,7963,16229,32531,65407,130987}中第一个大于设定值的素数。设置范围的最小值为200,最大值在PHP 5.5.6之前为100000,PHP 5.5.6之后为1000000。
15
16 op cache . max _ wasted _ percentage整数
17浪费内存的上限,以百分比表示。如果达到这个上限,那么OPcache将生成一个重启继续事件。
18
19 opcache.use_cwd布尔值
20如果启用,OPcache将在哈希表的脚本键后追加更改脚本的工作目录,以避免同名脚本的冲突。禁用此选项可以提高性能,但可能会导致应用程序崩溃。
21
22 opcache.validate_timestamps布尔值
23如果启用,则OPcache将检查是否每秒更新一次由opcache.revalidate _ freq设置的脚本。如果禁用此选项,则必须使用OPcache_reset()或opcache_invalidate()函数手动重置opcache,或者重新启动Web服务器以使文件系统更改生效。
24
25 opcache.revalidate _ freq整数
26检查脚本时间戳是否有更新的周期,以秒为单位。设置为0会导致OPcache检查每个请求的脚本更新。
27如果opcache.validate_timestamps配置指令设置为disable,该设置项将被忽略。
28
29 opcache.revalidate _ path布尔值
30如果禁用此选项,将重用同一include_path中的现有缓存文件。因此,在包含路径中找不到同名的文件。
31
32 opcache.save_comments布尔值
3如果禁用,脚本文件中的注释将不会包含在操作码缓存文件中,这可以有效地减小优化后的文件大小。禁用此配置指令可能会导致一些依赖于注释或批注的应用程序或框架无法正常工作,如Doctrine、Zend Framework 2和PHPUnit。
34
35 opcache.load_comments布尔值
36如果禁用,即使文件包含注释,也不会加载这些注释。这个选项可以和opcache.save_comments一起使用,按需加载注释。
37
38 opcache.fast_shutdown布尔值
39如果启用,将使用快速停止继续事件。所谓急停延续事件,是指依靠Zend引擎的内存管理模块一次性释放所有被请求的变量,而不是依次释放每一个被分配的内存块。
40
41 opcache.enable_file_override布尔值
42如果启用,当调用函数file_exists()、is_file()和is_readable()时,将检查操作码缓存,不管文件是否已被缓存。如果应用程序包含检查PHP脚本的存在性和可读性的功能,就可以提高性能。但是,如果opcache.validate_timestamps选项被禁用,则可能存在返回过期数据的风险。
43
44 opcache.optimization_level整数
45二进制位掩码来控制优化级别。
46
47 opcache.inherited_hack布尔值
PHP 5.3之前,OPcache会在代码中存储使用DECLARE_CLASS操作码实现继承的位置。当加载文件时,OPcache将尝试使用当前环境绑定继承的类。因为在当前脚本中可能不需要DECLARE_CLASS操作码,所以如果需要定义相应的操作码,这样的脚本可能不会运行。
49在PHP 5.3及以后的版本中,这个配置指令将被忽略。
50
51 opcache.dups_fix布尔值
52仅作为“不可重新定义的类”错误的解决方案。
53
54 opcache.blacklist_filename字符串
55 OPcache黑名单文件位置。黑名单是一个文本文件,它包含未通过预编译优化的文件名,每行一个文件名。黑名单中的文件名可以使用通配符或前缀。分号(;)将被视为评论。
五十六岁
57一个简单的黑名单文件可能如下所示:
58
59 ;将特定文件添加到黑名单
60 /var/www/broken.php
61 ;以字符X开头的文件文件
62 /var/www/x
63 ;通配符匹配
64 /var/www/*-broken.php
65
67 opcache.max_file_size整数
68缓存的最大文件大小,以字节为单位。设置为0将缓存所有文件。
六十九
70 opcache.consistency_checks整数
7如果为非零值,OPcache将每n次请求检查一次缓存校验和。n是该配置指令的设定值。由于此选项对性能有很大影响,请在调试环境中使用它。
七十二个
73 op cache . force _ restart _ time out整数
74如果缓存处于非活动状态,在计划重新启动之前要等待多少秒。如果超过设定的时间,OPcache模块将终止持有缓存锁的进程并重新启动它。
75如果opcache.log_verbosity_level选项的值设置为3或更大,则重启时会在日志中记录一条错误消息。
76
77 opcache.error_log字符串
7OpCache模块的错误日志文件。如果留空,它将被视为stderr,错误日志将被发送到标准错误输出(通常是Web服务器的错误日志文件)。
79
80 opcache.log_verbosity_level整数
8OpCache模块的日志级别。默认情况下,将只记录致命级别(0)和错误级别(1)的日志。其他可用级别有:警告(2)、信息(3)和调试(4)。
82
83 op cache . preferred _ memory _ model字符串
8OpCache的首选内存模块。如果留空,OPcache将选择适用的模块。通常情况下,自动选择可以满足要求。
85可选值包括:mmap、shm、posix和win32。
86
87 opcache.protect_memory布尔值
8保护共享内存,避免执行脚本时出现意外写入。仅用于内部调试。
八十九
90 opcache.mmap_base字符串
9 Windows平台上共享内存段的基址。所有PHP进程都将共享内存映射到同一个地址空间。使用此配置说明来避免“无法重新附加到基址”错误。
92
93 opcache.restrict_api字符串
94只有路径以指定字符串开头的PHP脚本才允许调用OPcache API函数。默认值是空字符串“”,这意味着没有限制。
95
关于PHP解决高并发问题(opcache)的文章到此为止。关于PHP的opcache的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。