PHP知识集锦
参考Linux知识集锦。
1 2 |
; 根据QPS调整 listen.backlog = 65536 |
相应的调整内核参数: sysctl net.core.somaxconn=65536
1 2 3 4 5 6 7 8 9 10 11 |
zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=0 opcache.memory_consumption=512 opcache.interned_strings_buffer=16 opcache.max_accelerated_files=10000 opcache.max_wasted_percentage=5 opcache.validate_timestamps=0 opcache.revalidate_freq=0 opcache.revalidate_path=0 opcache.huge_code_pages=1 |
Linux的HugePage可以让PHP的TEXT段、内存分页都以巨页的方式存储,减少TLB相关的性能损耗。
先设置内核参数: sysctl vm.nr_hugepages=128
然后配置: opcache.huge_code_pages=1
GCC 4.8以上编译器能够提升5%的性能,原因是开启Global Register对opline/execute_data的支持。
所谓剖析引导优化(PGO,Profile Guided Optimization),是通过剖析,给编译器以目标应用程序特点的提示信息,然后编译器进行针对性优化的技术。
首先,构建能产生Profile的二进制文件:
1 |
make prof-gen -j 8 |
然后,开始运行PHP-FPM,进行训练:
1 |
/php-7.3.1/sapi/fpm/php-fpm -R --fpm-config /usr/local/php/etc/php-fpm.conf |
最后,重新编译并安装:
1 2 |
make prof-clean make prof-use -j 8 && make install |
OPcache通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是省去了每次加载和解析 PHP 脚本的开销。PHP 5.5.0 及后续版本中已经绑定了 OPcache 扩展。
如果OPcache和Xdebug一起使用,必须先加载OPcache。
OPcache只能编译为共享扩展。如果你通过--disable-all禁用了默认扩展的构建,则需要--enable-opcache来开启OPcache。
编译之后,可以用下面的指令将该扩展加载到PHP中:
1 |
zend_extension=/full/path/to/opcache.so |
配置项 | 说明 |
opcache.enable |
默认1,可修改范围PHP_INI_ALL 启用操作码缓存。如果禁用此选项,则不会优化和缓存代码。在运行期使用 ini_set() 函数只能禁用 opcache.enable 设置,不可以启用 |
opcache.enable_cli |
默认0,PHP_INI_SYSTEM 仅针对 CLI 版本的 PHP 启用操作码缓存 |
opcache.memory_consumption |
默认64,PHP_INI_SYSTEM OPcache 的共享内存大小,单位MB |
opcache.interned_strings_buffer |
默认4,PHP_INI_SYSTEM 用来存储预留字符串的内存大小,单位MB |
opcache.max_accelerated_files |
默认2000,PHP_INI_SYSTEM OPcache 哈希表中可存储的脚本文件数量上限,200-1000000之间 真实的取值是在质数集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一个大于等于设置值的质数 |
opcache.max_wasted_percentage |
默认5,PHP_INI_SYSTEM 浪费内存的上限,以百分比计。 如果达到此上限 |
opcache.use_cwd |
默认1,PHP_INI_SYSTEM 哈希表的键是脚本的名字+脚本的工作目录,这样可以避免同名脚本导致键冲突 禁用此选项可以提高性能,但是可能会导致应用崩溃 |
opcache.validate_timestamps |
默认1,PHP_INI_ALL 如果启用,那么 OPcache 会每隔 opcache.revalidate_freq秒检查脚本是否更新 如果禁用,则需要使用 opcache_reset() 或者 opcache_invalidate() 函数来手动重置 OPcache,或者重启Web服务 |
opcache.revalidate_freq |
默认2,PHP_INI_ALL 检查脚本时间戳是否有更新的周期,以秒为单位 |
opcache.save_comments |
默认1,PHP_INI_SYSTEM 如果禁用,脚本文件中的注释内容将不会被包含到操作码缓存文件, 这样可以有效减小优化后的文件体积。 禁用此配置指令可能会导致一些依赖注释或注解的 应用或框架无法正常工作, 比如: Doctrine, Zend Framework 2 以及 PHPUnit |
opcache.enable_file_override |
默认0,PHP_INI_SYSTEM 如果启用,则在调用函数 file_exists(), is_file() 以及 is_readable() 的时候, 都会检查操作码缓存,无论文件是否已经被缓存。 如果应用中包含检查 PHP 脚本存在性和可读性的功能,这样可以提升性能 |
opcache.optimization_level |
默认0x7FFFBFFF,PHP_INI_SYSTEM 控制优化级别的二进制位掩码 |
opcache.blacklist_filename |
默认"",PHP_INI_SYSTEM OPcache 黑名单文件位置。 黑名单文件为文本文件,包含了不进行预编译优化的文件名,每行一个文件名。 黑名单中的文件名可以使用通配符,也可以使用前缀。 此文件中以分号开头的行将被视为注释 |
opcache.max_file_size |
默认0,PHP_INI_SYSTEM 以字节为单位的缓存的文件大小上限。设置为 0 表示缓存全部文件 |
opcache.consistency_checks |
默认0,PHP_INI_ALL 如果是非 0 值,OPcache 将会每隔 N 次请求检查缓存校验和。 N 即为此配置指令的设置值 |
opcache.force_restart_timeout |
默认180,PHP_INI_SYSTEM 如果缓存处于非激活状态,等待多少秒之后计划重启。 如果超出了设定时间,则 OPcache 模块将杀除持有缓存锁的进程, 并进行重启 |
opcache.error_log |
默认"",PHP_INI_SYSTEM OPcache 模块的错误日志文件。 如果留空,则视为 stderr, 错误日志将被送往标准错误输出 |
opcache.log_verbosity_level |
默认1,PHP_INI_SYSTEM OPcache 模块的日志级别。 默认情况下,仅有致命级别(0)及错误级别(1)的日志会被记录。 其他可用的级别有:警告(2),信息(3)和调试(4) |
opcache.preferred_memory_model |
默认"",PHP_INI_SYSTEM 通常情况下,自动选择就可以满足需求。可选值包括: mmap,shm, posix 以及 win32 |
opcache.restrict_api |
默认"",PHP_INI_SYSTEM 仅允许路径是以指定字符串开始的 PHP 脚本调用 OPcache API 函数。 默认值为空字符串 "",表示不做限制 |
opcache.file_update_protection |
默认2,PHP_INI_ALL 如果文件的最后修改时间距现在不足此项配置指令所设定的秒数,那么这个文件不会进入到缓存中。 这是为了防止尚未完全修改完毕的文件进入到缓存。 如果你的应用中不存在部分修改文件的情况,把此项设置为 0 可以提高性能 |
opcache.huge_code_pages |
默认0,PHP_INI_SYSTEM 启用或者禁用将 PHP 代码(文本段)拷贝到 HUGE PAGES 中。 此项配置指令可以提高性能,但是需要在 OS 层面进行对应的配置 |
opcache.lockfile_path |
默认/tmp,PHP_INI_SYSTEM 用来存储共享锁文件的绝对路径 |
opcache.file_cache |
默认NULL,PHP_INI_SYSTEM 置二级缓存目录并启用二级缓存。 启用二级缓存可以在 SHM 内存满了、服务器重启或者重置 SHM 的时候提高性能。 默认值为空字符串 "",表示禁用基于文件的缓存 |
opcache.file_cache_only |
默认0,PHP_INI_SYSTEM 启用或禁用在共享内存中的 opcode 缓存 |
opcache.file_cache_consistency_checks |
默认1,PHP_INI_SYSTEM 当从文件缓存中加载脚本的时候,是否对文件的校验和进行验证 |
官方文档的推荐配置如下:
1 2 3 4 5 6 |
opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=1 opcache.enable_cli=1 |
可以使用json_decode函数:
1 2 3 4 5 6 7 8 |
/** * @param $json 带解析的JSON字符串 * @param $assoc 如果设置为true,返回结果被转换为关联数组 * @param $depth 最大递归深度 * @param $options 选项位域,目前仅支持JSON_BIGINT_AS_STRING * @return 与JSON内容对应的PHP类型,如果无法解析返回null */ mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] ); |
使用函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/** * 搜索一个匹配正则式的子串 * * @param $pattern 用于匹配的正则式,注意 / / 包围 * @param $subject 被匹配的字符串 * @param &$matches 可选,存放匹配结果的数组引用。第一个元素将存放完整匹配的子串,之后的元素对应每个捕获(用括号包围的子正则式)的匹配 * @param $flags 匹配标记,可选值: * PREG_OFFSET_CAPTURE 把匹配的子串位于字符串的偏移量添加到$matches数组 * @param $offset 开始搜索的偏移量,单位字节 * @return 如果不匹配,返回0,否则返回1 */ int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ); /** * 搜索全部匹配 */ int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] ) |
示例:
1 |
preg_match('/crayon-[0-9a-f]+-i/',$capture[2]); |
Leave a Reply