1、如何优化PHP性能
如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍。
当然了,这个测试方法需要在十万级以上次执行,效果才明显。
其实静态方法和非静态方法的效率主要区别在内存:静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快。
静态方法始终调用同一块内存,其缺点就是不能自动进行销毁,而是实例化可以销毁。
2、PHP开发中如何提高系统的稳定性和可靠性
PHP 应用的高性优化,很多时候我们把业务代码做一些优化,反而是简单又高效的。
业务的异步解耦,比如,我们把耗时的多个分表数据的排行榜,通过其他服务做分布统计,然后再综合,最终输出到redis list 中,那我们前端 PHP 在调用数据的时候,就不用实时计算了。
缓存的多级处理,业务复杂以后,经常看到一份相同的数据读取 N 次,尽管是有缓存服务器,但是读取的时候也会有网络 I/O 的开销,考虑到我们 PHP 一般使用场景下都是单进程,使用频率高的,则应该优先使用进程内缓存。然后再本地缓存,然后再到网络缓存。
单例的运用,不要小看了对象的构造,很多时候我们在同一进程中,会发现同时构造了 N 多相同的对象。每一次的初始化都是一块内存的开辟和 CPU 的消耗。
高性能,一个就是运行环境的优化,另一个是代码本身的优化。
运行环境的优化,覆盖面也很广,包括系统层面的内核,文件系统类型,数据库及缓存服务本身的性能优化,再到PHP解释器的性能优化等等,PHP不同运行方式的差异(比如Apache模块,还有PHP-FPM等等)。
代码优化方面,我觉得可维护性和代码可读性的重要性大于高性能。代码优化可以借助profiling工具来分析,找到真实访问条件下,处理瓶颈在哪里,再去做针对性的优化。当然自己在初次设计和实现的时候,就需要做一定的整体考虑,例如怎么设计能够减少数据库的查询次数,如何减少重复的操作,了解同一问题的多种解决办法哪一种效率更高(包括算法上的差异,以及PHP的不同方式导致的差异等等),如何设计缓存来提高缓存命中率等等。有一些设计需要在体验和效率上做个权衡。
保证稳定性,同样也分运行环境和代码本身。前者要对线上服务做完整的监控,这个有很多完善和强大的开源工具可以使用,保障基础环境是稳定可控的,并且能够及时发现问题,进行修复。至于代码,除了尽量做完整的测试,开发的时候就需要考虑可能的问题。另外针对PHP,开发环境可以把error_reporting完全打开。还有需要知道常见的安全问题(XSS,SQL注入,CSRF,越权等),毕竟安全问题也是稳定的一部分。
3、如何设置宝塔面板优化php服务器性能
1.定期释放内存
2.添加swap
3.安装php缓存扩展
4.php配置调整
5.php并发调整
6.php版本和mysql数据版本
7.卸载多余扩展插件
8.搭配阿里云存储oss使用
以上纯手打。只是列出个大概。具体还得自己慢慢优化。
4、如何对低硬件配置的中小型php网站进行性能优化
本人对php不熟悉,现在采用PHP的magento开源项目来做,在尽量少代码修改的情况下让页面加载快些(期望日IP少于2,000,PV少于50,000,首页打开3s以内)。网站是运行在Digital ocean的VPS(1GB 内存,30GB SSD硬盘)上的,不能做负载均衡。
这个站的图片比较多,也比较大,但总体数据量在10GB以下。在chrome下监控了打开速度,发现首页文件等待时间达到了5s,而接收时间为几百毫秒。另外一些静态文件(JS,CSS很大,并且都在head内)也block住了其他页面元素的下载和页面渲染。所以需要对页面和服务器同时进行优化。
我的想法是从以下几个方面来做:
1.首先从架构上使用lanmp(偏向这个)或者lamp。
打算使用网上的一键安装包,不太清楚这几个之间最佳的版本组合是什么样的(都用最新版本?)? 是自己单独编译还是一键安装好?
2.服务端优化,主要使用缓存手段
1)Zend Optimizer优化PHP
2)APC、eaccelerator或者XCache对PHP缓存以及最新出来的Opcache。哪个比较好?
3)Varnish配合Nginx进行缓存静态资源缓存。相对于squid,哪个比较好?
4)memcached进行数据库缓存
1-4项同时使用不知道会不会有没有冲突?或者有没有更好的方案。因为不想对代码进行大改,所以服务端缓存最佳实践这块请重点给出意见。
3. 使用CDN加速静态资源
4. 优化静态资源,使用minify来合并压缩CSS,JS这些静态资源
5. 启用gzip
6. 对图片和JS等静态资源增加Expires头,这条应该算页面优化吧,放到后面来。
参考了一些资料后发现优化方法有很多,用的太多方法(特别是缓存手段)隐患越大,有没有优化的最佳策略或者方法论(而不仅仅从工具上)?
5、thinkphp百万pv网站性能怎么优化
提高网站相应速度首先要减少页面当中的JS文件,其次要保证页面的大小不超过60K为最好。这是在建站时的硬性要求。
也可以用百度、360这类云加速,提高自己网站的响应速度。
6、关于php性能优化,网上看到这样一句话:面向对象往往开销很大,每个方法和调用都会消耗很多内存。请问
别太相信专家来,他说的面向源对象指的是 使用mvc模式,这是会有一定的开销。但很大这个词用不上,大这个也用不上,应该是很少。不过也得看你代码的水平。你看一下好的框架。速度是杠杠的。为什么面向对象框架这么受欢迎。就是因为他好用。每样东西都有优缺点,但只要权衡轻重就行了。存在必然有其存在的道理。流行必然也是因为他好。。。
但换句话说,不是高手不用面向对象写出来的代码更差。而且没法维护。
7、如何设置BT宝塔面板并优化php服务器性能
设置宝塔面板需要安装组件,然后参考宝塔面板优化 php 服务器性能,按照里面的设置,一项项的操作完毕,就差不多了。
宝塔面板把优化php已经变成一件很简单的事情了。
8、php+mysql优化,百万至千万级快速分页mysql性能到底能有多高
php+Mysql 优化,百万至千万级快速分页
MySql 性能到底能有多高?用了php半年多,真正如此深入的去思考这个问题还是从前天开始。有过痛苦有过绝望,到现在充满信心!MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发。可是数据量到了10万,百万至千万,他的性能还能那么高吗?一点小小的失误,可能造成整个系统的改写,甚至更本系统无法正常运行!好了,不那么多废话了。用事实说话,看例子:
数据表 collect ( id, title ,info ,vtype) 就这4个字段,其中 title 用定长,info 用text, id 是逐渐,vtype是tinyint,vtype是索引。这是一个基本的新闻系统的简单模型。现在往里面填充数据,填充10万篇新闻。
最后collect 为 10万条记录,数据库表占用硬盘1.6G。OK ,看下面这条sql语句:
select id,title from collect limit 1000,10; 很快;基本上0.01秒就OK,再看下面的
select id,title from collect limit 90000,10; 从9万条开始分页,结果?
8-9秒完成,my god 哪出问题了????其实要优化这条数据,网上找得到答案。看下面一条语句:
select id from collect order by id limit 90000,10; 很快,0.04秒就OK。为什么?因为用了id主键做索引当然快。网上的改法是:
select id,title from collect where id>=(select id from collect order by id limit 90000,1) limit 10;
这就是用了id做索引的结果。可是问题复杂那么一点点,就完了。看下面的语句
select id from collect where vtype=1 order by id limit 90000,10; 很慢,用了8-9秒!
到了这里我相信很多人会和我一样,有崩溃感觉!vtype 做了索引了啊?怎么会慢呢?vtype做了索引是不错,你直接 select id from collect where vtype=1 limit 1000,10; 是很快的,基本上0.05秒,可是提高90倍,从9万开始,那就是0.05*90=4.5秒的速度了。和测试结果8-9秒到了一个数量级。从这里开始有人提出了分表的思路,这个和discuz 论坛是一样的思路。思路如下:
建一个索引表: t (id,title,vtype) 并设置成定长,然后做分页,分页出结果再到 collect 里面去找info 。 是否可行呢?实验下就知道了。
10万条记录到 t(id,title,vtype) 里,数据表大小20M左右。用
select id from t where vtype=1 order by id limit 90000,10; 很快了。基本上0.1-0.2秒可以跑完。为什么会这样呢?我猜想是因为collect 数据太多,所以分页要跑很长的路。limit 完全和数据表的大小有关的。其实这样做还是全表扫描,只是因为数据量小,只有10万才快。OK,来个疯狂的实验,加到100万条,测试性能。
加了10倍的数据,马上t表就到了200多M,而且是定长。还是刚才的查询语句,时间是0.1-0.2秒完成!分表性能没问题?错!因为我们的limit还是9万,所以快。给个大的,90万开始
select id from t where vtype=1 order by id limit 900000,10; 看看结果,时间是1-2秒!
why 分表了时间还是这么长,非常之郁闷!有人说定长会提高limit的性能,开始我也以为,因为一条记录的长度是固定的,mysql 应该可以算出90万的位置才对啊? 可是我们高估了mysql 的智能,他不是商务数据库,事实证明定长和非定长对limit影响不大?怪不得有人说 discuz到了100万条记录就会很慢,我相信这是真的,这个和数据库设计有关!
难道MySQL 无法突破100万的限制吗???到了100万的分页就真的到了极限???
答案是: NO !!!! 为什么突破不了100万是因为不会设计mysql造成的。下面介绍非分表法,来个疯狂的测试!一张表搞定100万记录,并且10G 数据库,如何快速分页!
好了,我们的测试又回到 collect表,开始测试结论是: 30万数据,用分表法可行,超过30万他的速度会慢道你无法忍受!当然如果用分表+我这种方法,那是绝对完美的。但是用了我这种方法后,不用分表也可以完美解决!
答案就是:复合索引!有一次设计mysql索引的时候,无意中发现索引名字可以任取,可以选择几个字段进来,这有什么用呢?开始的select id from collect order by id limit 90000,10; 这么快就是因为走了索引,可是如果加了where 就不走索引了。抱着试试看的想法加了 search(vtype,id) 这样的索引。然后测试
select id from collect where vtype=1 limit 90000,10; 非常快!0.04秒完成!
再测试: select id ,title from collect where vtype=1 limit 90000,10; 非常遗憾,8-9秒,没走search索引!
再测试:search(id,vtype),还是select id 这个语句,也非常遗憾,0.5秒。
综上:如果对于有where 条件,又想走索引用limit的,必须设计一个索引,将where 放第一位,limit用到的主键放第2位,而且只能select 主键!
完美解决了分页问题了。可以快速返回id就有希望优化limit , 按这样的逻辑,百万级的limit 应该在0.0x秒就可以分完。看来mysql 语句的优化和索引时非常重要的!
好了,回到原题,如何将上面的研究成功快速应用于开发呢?如果用复合查询,我的轻量级框架就没的用了。分页字符串还得自己写,那多麻烦?这里再看一个例子,思路就出来了:
select * from collect where id in (9000,12,50,7000); 竟然 0秒就可以查完!
mygod ,mysql 的索引竟然对于in语句同样有效!看来网上说in无法用索引是错误的!
有了这个结论,就可以很简单的应用于轻量级框架了:
代码如下:
$db=dblink();
$db->pagesize=20;
$sql="select id from collect where vtype=$vtype";
$db->execute($sql);
$strpage=$db->strpage(); //将分页字符串保存在临时变量,方便输出
while($rs=$db->fetch_array()){
$strid.=$rs['id'].',';
}
$strid=substr($strid,0,strlen($strid)-1); //构造出id字符串
$db->pagesize=0; //很关键,在不注销类的情况下,将分页清空,这样只需要用一次数据库连接,不需要再开;
$db->execute("select id,title,url,sTime,gTime,vtype,tag from collect where id in ($strid)");
< php while($rs=$db->fetch_array()): >
<tr>
<td$amp;>amp;$amp;nbsp;< php echo $rs['id']; $amp;>amp;$lt;/td>
<td$amp;>amp;$amp;nbsp;< php echo $rs['url']; $amp;>amp;$lt;/td>
<td$amp;>amp;$amp;nbsp;< php echo $rs['sTime']; $amp;>amp;$lt;/td>
<td$amp;>amp;$amp;nbsp;< php echo $rs['gTime']; $amp;>amp;$lt;/td>
<td$amp;>amp;$amp;nbsp;< php echo $rs['vtype']; $amp;>amp;$lt;/td>
<td$amp;>amp;$amp;nbsp;<a act=show&id=< php echo $rs['id']; $amp;>quot;$ target="_blank"$amp;>amp;$lt; php echo $rs['title']; $amp;>amp;$lt;/a$amp;>amp;$lt;/td>
<td$amp;>amp;$amp;nbsp;< php echo $rs['tag']; $amp;>amp;$lt;/td>
</tr>
< php endwhile; >
</table>
< php
echo $strpage;
通过简单的变换,其实思路很简单:1)通过优化索引,找出id,并拼成 "123,90000,12000" 这样的字符串。2)第2次查询找出结果。
小小的索引+一点点的改动就使mysql 可以支持百万甚至千万级的高效分页!
通过这里的例子,我反思了一点:对于大型系统,PHP千万不能用框架,尤其是那种连sql语句都看不到的框架!因为开始对于我的轻量级框架都差点崩溃!只适合小型应用的快速开发,对于ERP,OA,大型网站,数据层包括逻辑层的东西都不能用框架。如果程序员失去了对sql语句的把控,那项目的风险将会成几何级数增加!尤其是用mysql 的时候,mysql 一定需要专业的dba 才可以发挥他的最佳性能。一个索引所造成的性能差别可能是上千倍!
PS: 经过实际测试,到了100万的数据,160万数据,15G表,190M索引,就算走索引,limit都得0.49秒。所以分页最好别让别人看到10万条以后的数据,要不然会很慢!就算用索引。经过这样的优化,mysql到了百万级分页是个极限!但有这样的成绩已经很不错,如果你是用sqlserver肯定卡死!而 160万的数据用 id in (str) 很快,基本还是0秒。如果这样,千万级的数据,mysql应该也很容易应付。
9、php性能优化的几个方法
面对一个性能问题是,第一步永远是找到问题产生的原因,而不是去看技巧列表。搞明白产生瓶颈的原因,找到目标并且实施修复,然后再重新测试。查找瓶颈只是万里长征的第一步,这里有些常用技巧,希望对最重要的第一步找到瓶颈能有所帮助。
使用监控方法(比如监控宝),进行benchmark和监控,网络,特别是网络状况瞬息万变,做得好的话5分钟就可以找到瓶颈。
剖析代码。必须了解那部分代码耗时最多,在这些地方多多关注。
想找到瓶颈,请检查每个资源请求(比如,网络、CPU、内存、共享内存、文件系统、进程管理、网络连接等等……)
先对迭代结构和复杂的代码进行benchmark
在在真实负载下用真实数据进行真实测试,当然,如果可以最好用产品服务器。
缓存
(Caching)
有些人认为缓存是解决性能问题最有效的办法之一,试试这些:
使用OPCODE(操作码)缓存,这样脚本就不会在每次访问时重新编译一次。比如:启用Windows平台上的windows缓存扩展。可以缓存opcode,文件,相对路径,session数据和用户数据。
考虑在多服务器环境下使用分布式缓存
在调用imap_header()之前先调用imap_headers()
编译
vs. 解释(Compiling vs. Interpreting)
将PHP源码编译成机器码。动态解释执行同样的编译,但它是按行执行的。编译为opcode是折中选择,它可以将PHP源码翻译为opcode,之后opcode再转为机器码。以下为关于编译与解释的相关技巧:
上线之前将PHP代码编译为机器码。opcode缓存尽管并不是最好的选择,但依旧比解释型来得强。或者,考虑将PHP代码编译成一个C扩展。
PHP的opcode编译器(bcompiler)还不能在产品环境中使用
10、php循环处理大量数据,如何提高性能
优化循环 使用多线程处理