首页 » SEO优化 » phprun技巧_PHP机能周全优化值得收藏

phprun技巧_PHP机能周全优化值得收藏

访客 2024-10-29 0

扫一扫用手机浏览

文章目录 [+]

image.png

1.1 定义要求/响应声明周期

image.png

phprun技巧_PHP机能周全优化值得收藏

1.2 Apache Benchmark (ab工具)查看测试结果 image.png常用选项

n: 要仿照的要求数;c: 要仿照的并发要求数;t: 实行仿照所须要的韶光1.3 Siege

Siege可以仿照托管文档的用户流量,与ab不同的是,Siege可以对文本文件中指定的URL列表运行负载测试。
它还可以在实行其它要求之前让某个要求休眠,从而让你觉得某个用户在转移到Web运用程序的下一个文档之前正在读取该文档。

phprun技巧_PHP机能周全优化值得收藏
(图片来自网络侵删)
剖析结果 image.png测试指标 image.png常用参数

-c 200 指定并发数200-r 5 指定测试的次数5-f urls.txt 制订url的文件-i internet系统,随机发送url-b 要求无需等待 delay=0-t 5 持续测试5分钟 [H,M,S--时分秒,默认M]-r和-t一样平常不同时利用1.4 影响基准测试数字地理位置和网络问题相应大小代码处理浏览器行为Web做事配置2.提高客户端下载和呈现性能2.1 概述第一个工具集(Firebug、YSlow、Page Speed)可供应以下信息来帮助我剖析相应:Web做事器发送的相应的细节信息;剖析JavaScript中的前端逻辑;浏览器将读取的资源的逐项列表;浏览器获取和接管资源所花费的韶光;对如何优化相应的建议第二个工具集(YUI Compressor、Closure Compiler和Smush.it)将帮助我们优化相应,简言之,我们可以利用这些工具压缩JavaScript、CSS文件以及网页所需的图像。
2.2 Firebug

好吧,我没用过,个人以为Chrome自带的就够用了

image.png

还可以看韶光花费细节:

image.png

2.3 YSlow

优化规则:

2.3.1 CSS优化将CSS样式放置在HTML文档顶部;避免某种CSS表达式;精简CSS文件2.3.2 图像优化利用所哀求的图像大小,而不是在HTML利用高度和宽度重新调度图像尺寸;在可能的情形下创建子画面2.3.3 JavaScript优化将JavaScript放置在HTML底部;精简JavaScript将JavaScript做成外部文件####### 2.3.4 做事器优化做事器是否采取Gzip/bzip2压缩DNS查找是否有所减少是否实现了Etag2.4 YUI Compressor和Closure Compiler

这两个是JavaScript精简工具 现在不都是用gulp和webpack了吗?

2.5 图像压缩

利用Smush.it工具

3. PHP代码优化3.1 PHP最佳实践

一些小tips

ehco时用逗号连接比点连接更优;require优于require_once:require_once须要统计引入文件的引用次数for、foreach和while循环范围数组:foreach性能最好fread()、file_get_contents()、file()和readfile()。
file_get_contents()、readfile()、fread()以字符串返回数据,而file()则将文件中的数据作为数组返回,每一行是数组的一个元素。
四个方法都可以读取文件内容,但只有file_get_contents()将文件缓存到内存中,以便更快地进行读写操作,这种办法称为内存映射。
image.png3.2 利用VLD、strace和Xdebug一探究竟用VLD查看Opcode函数

pecl install channel://pecl.php.net/vld-0.14.0 安装

测试代码

<?phpecho 'hello' , 'World!';

实行

php -dvld.active=1 test.php

结果

Finding entry pointsBranch analysis from position: 0Jump found. (Code = 62) Position 1 = -2filename: /apps/www/test/test.phpfunction name: (null)number of ops: 5compiled vars: noneline # E I O op fetch ext return operands------------------------------------------------------------------------------------- 2 0 E > EXT_STMT 1 ECHO 'hello' 2 EXT_STMT 3 ECHO 'World%21' 3 4 > RETURN 1branch: # 0; line: 2- 3; sop: 0; eop: 4; out1: -2path #1: 0, helloWorld!利用strace进行C级跟踪(可以在Apache要求跟踪所调用的C函数,我玩的是nginx这部分跳过)3.3 创造瓶颈Xdebug是面向PHP的调试器和概要剖析工具,除了更多的调试信息外,Xdebug还可以为开拓职员供应如下的信息:PHP脚本的内存花费;对某个函数实行的调用总数;函数内部花费的总韶光;某个函数的完全栈跟踪;举例断点调试: image.png 环境配置点这里 phpstrom+wampserver+xdebug配置性能剖析(可以用phpstorm剖析xdebug天生的cachegrind.out日志): image.png 剖析结果: image.png行为追踪【实在便是代替断点单步打日志】示范代码:

xdebug_start_trace('/tmp/trace', XDEBUG_TRACE_APPEND ); //开始,日志写到/tmp/trace文件class Node { public $val; //值 public $d; //间隔 public $p; //父节点 public $linkedNodes = [];//连接的顶点 public function __construct($val) { $this->val = $val; }}/ Dijkstra /class DijkstraAlgorithm{ / 天生图 @param array $vertex @return array / public function buildGraph($vertex) { $graph = []; $nodes = array_keys($vertex); foreach ($nodes as $node) { $graph[$node] = new Node($node); } foreach ($vertex as $key => $item) { foreach ($item as $value) { if (isset($graph[$value])) { $graph[$key]->linkedNodes[] = $graph[$value]; } } } return $graph; } / 初始化操作 @param array $graphNodes @param Node $s / public function init(&$graphNodes, &$s) { foreach ($graphNodes as $graphNode) { $graphNode->d = 9999999; } $s->d = 0; } / 松弛操作 @param Node $u @param Node $v @param Array $w @return bool / public function relax(&$u, &$v, $w) { $d = $u->d + $w[$u->val . '_' . $v->val]; if($v->d > $d) { $v->d = $d; $v->p = $u; return true; } return false; } / 从行列步队取出最小间隔的顶点 @param array $queue / public function extractMin(&$queue) { $result = []; foreach ($queue as $item) { $result[$item->d] = $item; } ksort($result); $queue = array_values($result); return array_shift($queue); } / Dijkstra 算法 问题1:没考虑到负环路 @param $graphNodes @param $s / public function dijkstra(&$graphNodes, $s, $w) { $this->init($graphNodes, $s); $gather = []; $queue = $graphNodes; while (!empty($queue)) { $node = $this->extractMin($queue); $gather[] = $node; foreach ($node->linkedNodes as $linkedNode) { if($this->relax($node, $linkedNode, $w)) { if(!in_array($linkedNode, $queue)) { array_push($queue, $linkedNode); } } } } }}//顶点$vertex = [ 'a' => ['b', 'c'], 'b' => ['d'], 'd' => ['e'], 'c' => ['e'], 'e' => [],];//边的权重$w = [ 'a_b' => 1, 'a_c' => 3, 'b_d' => 2, 'd_e' => 2, 'c_e' => 4,];$g = new DijkstraAlgorithm();$graphNodes = $g->buildGraph($vertex);$g->dijkstra($graphNodes, $graphNodes['a'], $w);$w = [ 'a_b' => 1, 'a_c' => 3, 'b_d' => 2, 'd_e' => 2, 'c_e' => 4,];xdebug_stop_trace();//结束行为追踪

centos的php.ini配置:

[xdebug]zend_extension="/apps/install/php/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so"xdebug.remote_enable = 1xdebug.trace_format = 1xdebug.auto_trace = 0xdebug.trace_output_dir = /tmp/xdebug.trace_output_name = trace.%c.%pxdebug.collect_params = 4xdebug.collect_includes = Onxdebug.collect_return = Onxdebug.show_mem_delta = Onxdebug.var_display_max_depth = 2

剖析结果

image.png

以上看起来不是很清晰,可以借助这个PHP进行剖析:用法:

usage: php run-cli tracefile [sortkey] [elements]Allowed sortkeys: calls, time-inclusive, memory-inclusive, time-own, memory-own //后四个分别指包含子方法的耗时, 包含子方法的内存花费,自己方法的耗时,自己方法体的内存花费

示例:

php tracefile-analyser.php trace.log.xt time-inclusive 20 //获取最耗时的20个方法

结果:

Showing the 20 most costly calls sorted by 'time-inclusive'. Inclusive Ownfunction #calls time memory time memory----------------------------------------------------------------------------------------------------------------------------------------- 1 5.8553 12017136 5.8553 12017136common\services\qmyx\BuildingInfoService->getBuildingList 1 1.7179 3559752 0.0038 -457592common\repositories\qmyx\MyParamValueRepository->getParamOptionByScopeIdAndValueAndParamCode 45 1.3890 914592 0.0126 -275240yii\db\ActiveQuery->one 46 1.3441 1012584 0.0062 704yii\db\Query->one 46 1.2831 951440 0.0055 -323104yii\db\Command->queryInternal 52 1.1350 1326664 0.0155 3504yii\db\Command->queryOne 47 0.9962 1061744 0.0038 0PDOStatement->execute 52 0.8573 634848 0.8573 634848yii\db\ActiveQuery->createCommand 50 0.3639 268176 0.0090 -56976yii\db\QueryBuilder->build 50 0.2823 78424 0.0150 -133952yii\db\QueryBuilder->buildCondition 295 0.1507 32400 0.0082 10392yii\db\QueryBuilder->buildWhere 50 0.1488 27376 0.0025 224yii\BaseYii::createObject 73 0.1318 5219896 0.0062 0yii\db\QueryBuilder->buildAndCondition 92 0.1316 22928 0.0060 -8896yii\db\Command->queryAll 4 0.1239 247608 0.0002 0yii\di\Container->get 75 0.1239 5219896 0.0051 0yii\di\Container->build 75 0.1189 5219896 0.0083 18056yii\log\Logger->log 156 0.1131 739152 0.0470 -2074992ReflectionClass->newInstanceArgs 75 0.1009 5022912 0.0037 99568common\services\project\ProjectService->filterDisabledProjectIdsByAppCode 1 0.0961 596344 0.0003 -48804. Opacode缓存4.1 回顾路线图

image.png

4.2 PHP的生命周期

image.png

在此补充一下,php7新加了语法解析树。

运用了Opcode缓存的PHP生命周期:

image.png

4.2 Opcode缓存工具Alternative PHP Cache(APC)XCacheeAccelerator

现在用opcache啦~~ 有兴趣看看鸟哥这篇文章 让PHP7达到最高性能的几个Tips

5. 变量缓存

image.png

缓存可以用memcached或者redis等中间件。

6. 选择精确的Web做事器

并发当然是选择nginx

7. 优化Web做事器和内容交付

大部分是针对Apache的优化,略过。
还有负载均衡、共享会话、分布式架构的一些问题(缓存同等性、缓存版本等等)、监控运用程序Ganglia、Cacti、Nagios。

8. 数据库优化MySQL的MyISAM的优缺陷: image.pngInnoDB的优缺陷: image.png选择存储引擎1.当运用程序实行的大部分是读取操作时(95%)--MyISAM; 当事务性和同等性非常主要时---InnoDB; 当你有一个包含很多连接表的繁芜模式时---InnoDB; 当不间断操作非常主要时---InnoDB(由于MyISAM没用防止数据崩溃的日志、版本掌握和记录功能)理解MySQL如何利用内存MySQL对内存来者不拒,你给它的内存越多,它的性能就越好,直到达到某个点。
这个点便是MySQL的速率超过数据“事情集”的速率,超过这个点之后,无论你再为它分配多少内存,它的性能险些都不会再有提高。

“事情集”便是常常利用的数据集,如果这个数据集可以轻松地放到内存中,性能的提高也基本上就到了极限,特殊是当拥有一个好的索引集时。

InnoDB与MyISAM内存利用的比较 MySQL配置文件供应了很多指令,可用于掌握做事器的内存占用。
分为下面几大类: 1.影响缓冲区和缓存大小的指令,适用所有存储引擎; 2.仅影响MyISAM存储引擎的指令; 3.仅影响InnoDB存储引擎的指令,常日以“innodb_”开头; 4.掌握各种资源(如连接数量等)限定的指令; 定义属性(如字符集、路径等)的指令。
每做事器和每连接(线程)内存利用的比较 必须记住,当在配置文件中配置内存缓冲区和缓存的大小时,一些内存构造是按照每个 连接或每个连接来分配的。
当连接到MySQL的连接数增加时,MySQL将利用更多的内 存,因此一定要从运用程序连接到数据库做事器打开的连接数减至最少,这一点非常重 要。
MySQL可以利用的最大内存定义如下: image.png查找配置文件 image.pngMysqltuner.pl: 优化数据库做事器的内存1). top监控进程

![image.png](https://upload-images.jianshu.io/upload_images/3596546-d9b99687b1416f6f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)2). iostat查看I/O性能

image.png

选项 解释

image.png

若 %iowait 的值过高,表示硬盘存在I/O瓶颈若 %idle 的值高但系统相应慢时,有可能是CPU等待分配内存,此时应加大内存容量若 %idle 的值持续低于1,则系统的CPU处理能力相对较低,表明系统中最须要办理的资源是 CPU image.png3).Mysqltuner.pl

当你看到较高的%util或%iowait值,那么该当查看驱动器的性能,或者看看打开的一些MySQL内存缓冲区以减少MySQL做事器命中磁盘所需的韶光。
但该系统没有显示I/O性能的任何问题,因此我们可以连续进行。
Mysqltuner.pl可以减轻配置和检讨数据做事器的大量事情。

示例可能涌现的问题:

image.png

附上MySQL的常用命令和设置

-- show variables like '%max_connections%'; 查看最大连接数set global max_connections=1000 重新设置mysql> show status like 'Threads%';+-------------------+-------+| Variable_name | Value |+-------------------+-------+| Threads_cached | 58 || Threads_connected | 57 | ###这个数值指的是打开的连接数| Threads_created | 3676 || Threads_running | 4 | ###这个数值指的是激活的连接数,这个数值一样平常远低于connected数值+-------------------+-------+ Threads_connected 跟show processlist结果相同,表示当前连接数。
准确的来说,Threads_running是代表当前并发数 这是是查询数据库当前设置的最大连接数mysql> show variables like '%max_connections%';+-----------------+-------+| Variable_name | Value |+-----------------+-------+| max_connections | 1000 |+-----------------+-------+ 可以在/etc/my.cnf里面设置数据库的最大连接数[mysqld]max_connections = 1000命令: show processlist; 如果是root帐号,你能看到所有用户确当前连接。
如果是其它普通帐号,只能看到自己占用的连接。
show processlist;只列出前100条,如果想全列出请利用show full processlist; [MySQL](http://lib.csdn.net/base/14 "MySQL知识库")> show processlist;命令: show status;命令:show status like '%下面变量%';Aborted_clients 由于客户没有精确关闭连接已经去世掉,已经放弃的连接数量。
Aborted_connects 考试测验已经失落败的MySQL做事器的连接的次数。
Connections 试图连接MySQL做事器的次数。
Created_tmp_tables 当实行语句时,已经被创造了的隐含临时表的数量。
Delayed_insert_threads 正在利用的延迟插入处理器线程的数量。
Delayed_writes 用INSERT DELAYED写入的行数。
Delayed_errors 用INSERT DELAYED写入的发生某些缺点(可能重复键值)的行数。
Flush_commands 实行FLUSH命令的次数。
Handler_delete 要求从一张表中删除行的次数。
Handler_read_first 要求读入表中第一行的次数。
Handler_read_key 要求数字基于键读行。
Handler_read_next 要求读入基于一个键的一行的次数。
Handler_read_rnd 要求读入基于一个固定位置的一行的次数。
Handler_update 要求更新表中一行的次数。
Handler_write 要求向表中插入一行的次数。
Key_blocks_used 用于关键字缓存的块的数量。
Key_read_requests 要求从缓存读入一个键值的次数。
Key_reads 从磁盘物理读入一个键值的次数。
Key_write_requests 要求将一个关键字块写入缓存次数。
Key_writes 将一个键值块物理写入磁盘的次数。
Max_used_connections 同时利用的连接的最大数目。
Not_flushed_key_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块。
Not_flushed_delayed_rows 在INSERT DELAY行列步队中等待写入的行的数量。
Open_tables 打开表的数量。
Open_files 打开文件的数量。
Open_streams 打开流的数量(紧张用于日志记载) Opened_tables 已经打开的表的数量。
Questions 发往做事器的查询的数量。
Slow_queries 要花超过long_query_time韶光的查询数量。
Threads_connected 当前打开的连接的数量。
Threads_running 不在就寝的线程数量。
Uptime 做事器事情了多少秒。
My.ini配置 虚拟内存[](http://www.pc51.net/data/MySQL/2007-01-04/2551.html)innodb_buffer_pool_size=576M ->128M InnoDB引擎缓冲区query_cache_size=100M ->32 查询缓存tmp_table_size=102M ->32M 临时表大小key_buffer_size=16m ->8M设置max_connections命令:show variables like '%max_connections%' (这个办法在debian+mysql Ver 12.22 Distrib 4.0.22, for pc-[Linux](http://lib.csdn.net/base/linux "Linux知识库") (i386)里实验了)设置办法是在my.cnf文件中,添加下面的末了赤色的一行:--------------------------------------------------------------------------------[mysqld] port=3306 #socket=MySQL skip-locking set-variable = key_buffer=16K set-variable = max_allowed_packet=1M set-variable = thread_stack=64K set-variable = table_cache=4 set-variable = sort_buffer=64K set-variable = net_buffer_length=2K set-variable = max_connections=32000 (在院里的DELL机器mysql4.0里的语法不同max_connecionts=2000直接这么写就好了)--------------------------------------------------------------------------------修正完毕后,重启MySQL即可。
当然,为了确保设置精确,该当查看一下max_connections。
把稳: 1、虽然这里写的32000。
但实际MySQL做事器许可的最大连接数16384; 2、除max_connections外,上述其他配置该当根据你们系统自身须要进行配置,不必拘泥; 3、添加了最大许可连接数,对系统花费增加不大。
4、如果你的mysql用的是my.ini作配置文件,设置类似,但设置的格式要稍作变通。
用mysqld --help 可以查看到max_connections 变量。
 或者 mysql -uuser -p后mysql>show variables;也会看到max_connections 。
下面是修正张老师 的redhat9的方法:先是mysql -uw01f -pmysql>show variables;看到max_connections 为100mysql>exit;vi /etc/my.cnf [mysqld]set-variable=max_connections=250 #加入这些内容:wq/etc/init.d/mysqld restart
优化InnoDB 1.innodb_file_per_table:InnoDB为每个数据库创建一个文件并用这个文件来管理数据库的表。
这意味着如果表的大小先增大然后又缩小,则很难规复磁盘空间。
设置该选项将使每个表利用一个独立的数据存储文件。
如果你想在现有数据库上变动此设置,该当备份该数据库,然后删除它,再变动选项,然后重新启动做事器,末了从备份中重新加载该数据库; 2.innodb_buffer_pool_size:如果你只利用InnoDB表,可以把这一项设置为可用内存的70%旁边,如果混用MyISAM,则可以小一些; 3.innodb_log_buffer_size=4M:4M可以知足绝大部分记录的需求,而且供应了一个合理的性能; 4.innodb_log_file_size=256M:推举值,可以在规复数据库的速率与保持较高的运行时性能之间取得良好的平衡; 5.innodb_flush_log_at_trx_commit=2:这一项掌握将日志文件刷新到磁盘的频率,如果你可以容忍在发生崩溃时丢失一些记录,那么可以把它的值设置为2来减少磁盘写入的数量、加快性能以及减少驱动器上的I/O包袱。
找到有问题的日志 查看慢查询日志,开启和如何查看就不说了,网上一搜铺天盖地的。
剖析有问题的查询 explain神器

标签:

相关文章

我国土地利用分类代码的构建与应用

土地利用分类代码是我国土地管理的重要组成部分,是土地资源调查、规划、利用和保护的依据。土地利用分类代码的构建与应用显得尤为重要。本...

SEO优化 2025-02-18 阅读1 评论0

微信跳转微信支付便捷支付体验的秘密武器

移动支付已成为人们日常生活中不可或缺的一部分。作为我国领先的社交平台,微信支付凭借其便捷、安全的支付方式,深受广大用户的喜爱。而微...

SEO优化 2025-02-18 阅读0 评论0

探寻会计科目代码背后的奥秘分类与

会计科目代码是会计信息系统中不可或缺的组成部分,它将企业的经济活动进行分类和归纳,为会计核算、财务分析和决策提供重要依据。本文将从...

SEO优化 2025-02-18 阅读1 评论0