php怎样加速,php 提速
php 提速2007-08-13 10:06这篇杂文翻译整理自网络各路文档资料(见最末的参考资料),尤其是 Ilia Alshanetsky (佩服之至) 在多个 PHP 会议上的演讲,主要是各类提高 PHP 性能的技巧。为求精准,很多部分都有详细的效率数据,以及对应的版本等等。偷懒,数据就不一一给出了,直接给结论,如果需要看原文档,请到文末「参考资料」部分。
静态调用的成员一定要定义成 static (PHP5 ONLY)
贴士:PHP 5 引入了静态成员的概念,作用和 PHP 4 的函数内部静态变量一致,但前者是作为类的成员来使用。静态变量和 Ruby 的类变量(class variable)差不多,所有类的实例共享同一个静态变量。
// PHP CODE Highliting for CU by dZ902
$foo = new foo;
// instance way
$foo->bar();
// static way
foo::bar();?>
静态地调用非 static 成员,效率会比静态地调用 static 成员慢 50-60%。主要是因为前者会产生 E_STRICT 警告,内部也需要做转换。
使用类常量 (PHP5 ONLY)
贴士:PHP 5 新功能,类似于 C++ 的 const。
使用类常量的好处是:
- 编译时解析,没有额外开销- 杂凑表更小,所以内部查找更快- 类常量仅存在于特定「命名空间」,所以杂凑名更短- 代码更干净,使除错更方便
(暂时)不要使用 require/include_once
require/include_once 每次被调用的时候都会打开目标文件!
- 如果用绝对路径的话,PHP 5.2/6.0 不存在这个问题- 新版的 APC 缓存系统已经解决这个问题
文件 I/O 增加 => 效率降低
如果需要,可以自行检查文件是否已被 require/include。
不要调用毫无意义的函数
有对应的常量的时候,不要使用函数。
// PHP CODE Highliting for CU by dZ902
<?phpphp_uname ('s') == PHP_OS;php_version() == PHP_VERSION;php_sapi_name() == PHP_SAPI;?>虽然使用不多,但是效率提升大概在 3500% 左右。
最快的 Win32 检查
// PHP CODE Highliting for CU by dZ902
- 不用函数- Win98/NT/2000/XP/Vista/Longhorn/Shorthorn/Whistler...通用- 一直可用
时间问题 (PHP>5.1.0 ONLY)
你如何在你的软件中得知现在的时间?简单,「time() time() again, you ask me...」。
不过总归会调用函数,慢。
现在好了,用 $_SERVER['REQUEST_TIME'],不用调用函数,又省了。
加速 PCRE
- 对于不用保存的结果,不用 (),一律用 (?
这样 PHP 不用为符合的内容分配内存,省。效率提升 15% 左右。
能不用正则,就不用正则,在分析的时候仔细阅读手册「字符串函数」部分。有没有你漏掉的好用的函数?
例如:
strpbrk()strncasecmp()strpos()/strrpos()/stripos()/strripos()
加速 strtr
如果需要转换的全是单个字符的时候,用字符串而不是数组来做 strtr:
QUOTE:// PHP CODE Highliting for CU by dZ902
<?php $addr = strtr($addr, "abcd", "efgh"); // good$addr = strtr($addr, array('a' => 'e', // ... )); // bad?>
效率提升:10 倍。
不要做无谓的替换
即使没有替换,str_replace 也会为其参数分配内存。很慢!解决办法:
- 用 strpos 先查找(非常快),看是否需要替换,如果需要,再替换
效率:
- 如果需要替换:效率几乎相等,差别在 0.1% 左右。- 如果不需要替换:用 strpos 快 200%。
邪恶的 @ 操作符
不要滥用 @ 操作符。虽然 @ 看上去很简单,但是实际上后台有很多操作。用 @ 比起不用 @,效率差距:3 倍。
特别不要在循环中使用 @,在 5 次循环的测试中,即使是先用 error_reporting(0) 关掉错误,在循环完成后再打开,都比用 @ 快。
善用 strncmp
当需要对比「前 n 个字符」是否一样的时候,用 strncmp/strncasecmp,而不是 substr/strtolower,更不是 PCRE,更千万别提 ereg。strncmp/strncasecmp 效率最高(虽然高得不多)。
慎用 substr_compare (PHP5 ONLY)
按照上面的道理,substr_compare 应该比先 substr 再比较快咯。答案是否定的,除非:
- 无视大小写的比较- 比较较大的字符串
不要用常量代替字符串
为什么:
- 需要查询杂凑表两次- 需要把常量名转换为小写(进行第二次查询的时候)- 生成 E_NOTICE 警告- 会建立临时字符串
效率差别:700%。
不要把 count/strlen/sizeof 放到 for 循环的条件语句中
贴士:我的个人做法
// PHP CODE Highliting for CU by dZ902
效率提升相对于:
- count 50%- strlen 75%
短的代码不一定快
// PHP CODE Highliting for CU by dZ902
// longerif ($a == $b) { $str .= $a;}$str .= $b;
// short$str .= ($a == $b ? $a : $b);?>
你觉得哪个快?
效率比较:
- longest: 4.27- longer: 4.43- short: 4.76
不可思议?再来一个:// PHP CODE Highliting for CU by dZ902
<?php // original$d = dir('.');while (($entry = $d->read()) !== false) { if ($entry == '.' || $entry == '..') { continue; }}
// versusglob('./*');
// versus (include . and ..)scandir('.');?>
哪个快?
效率比较:
- original: 3.37- glob: 6.28- scandir: 3.42- original without OO: 3.14- SPL (PHP5): 3.95
画外音:从此也可以看出来 PHP5 的面向对象效率提高了很多,效率已经和纯函数差得不太多了。
提高 PHP 文件访问效率
需要包含其他 PHP 文件的时候,使用完整路径,或者容易转换的相对路径。
// PHP CODE Highliting for CU by dZ902
include 'file.php'; // bad approach
incldue './file.php'; // good
include '/path/to/file.php'; // ideal
?>
物尽其用
PHP 有很多扩展和函数可用,在实现一个功能的之前,应该看看 PHP 是否有了这个功能?是否有更简单的实现?
// PHP CODE Highliting for CU by dZ902
// vs. much simpler
file_get_contents('./somepic.gif');?>
关于引用的技巧
引用可以:
- 简化对复杂结构数据的访问- 优化内存使用
// PHP CODE Highliting for CU by dZ902
// slow 2 extra hash lookups per accessfor ($i = 0; $i < 5; ++$i) $a['b']['c'][$i] = $i;
// much faster reference based approach$ref =& $a['b']['c'];for ($i = 0; $i < 5; ++$i) $ref[$i] = $i;?>
// PHP CODE Highliting for CU by dZ902
// memory intensive approachfunction a($str){ return $str.'something';}
// more efficient solutionfunction a(&$str){ $str .= 'something';}?>
==============================================参考资料
Ilia 的个人网站,Blog,他参与的开发以及出版的一些稿物链接等等。
eZ components 官方网站,eZ comp 是针对 PHP5 的开源通用库,以效率为己任,Ilia 也参与了开发。
php|architect,不错的 php 出版商/培训组织。买不起或者买不到的话,网上可以下到很多经典的盗版。
php怎样加速,php 提速相关推荐
- 10 M/s, 一粒云海外加速节点提速
疫情的长续持久对跨国企业沟通协作产生了大量不便, 跨国文件传输速度缓慢一直困扰各个企业的跨国协作效率.针对这个问题,很多企业需要通过购买国际线率,或者购买国外传输主机等需要花费较高的费用,较多的时间来 ...
- 如何给xp系统提速 怎样提高xp下载速度
XP系统已经推出20年了,现在仍有不少用户在使用.但是随着使用时间越来越长,电脑积累的垃圾文件越来越多,导致运行速度变慢,电脑卡顿严重.有什么办法可以给XP系统提速吗?下面就来看看. WinXP给电脑 ...
- 免拆诊断 | 2018 款大众蔚领车加速无力
中鑫之宝鹤壁店 赵玉宾 故障现象: 一辆2018款大众蔚领车,搭载EA211发动机,累计行驶里程约为4万km.车主反映,车辆在行驶过程中发动机故障灯点亮,加速无力. 故障诊断: 接车后试车,车主反映的 ...
- 一文览尽LiDAR点云目标检测方法
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 转载于 :计算机视觉之路,作者:山涧一壶酒 / 导读 / 自动驾驶中的激光雷达点云如何做特征表达,将基 ...
- 一文览尽基于激光雷达点云(lidar)的目标检测方法
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文来源:计算机视觉之路,作者:山涧一壶酒,编辑:智车科技 / 导读 / 上周文章:自动驾驶中的激光雷 ...
- 卡内基·梅隆大学新提出AdaScale:自适应缩放实现视频对象实时检测算法
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 对机器人和自动驾驶汽车等很多应用而言,视频目标检测都是很重要的.但在使用 CNN 执行这一任务时,速度与准确度往往不 ...
- 2020年中国新基建人工智能产业链全景图深度分析汇总(附完整企业名单)
来源:北京物联网智能技术应用协会 "新基建"是与传统基建相对应,结合新一轮科技革命和产业变革特征,面向国家战略需求,为经济社会的创新.协调.绿色.开放.共享发展提供底层支撑的具有乘 ...
- 从苏宁易购2020双十一战报窥探各品牌座次排行
19分钟GMV破50亿, Super会员8分钟新增10万: 开售1小时,线上订单同比增长72%: 19小时,5万场直播订单量增长7倍: 超级云仓12时发货已超去年全天-- 这是今年双十一,苏宁易购的战 ...
- iMeta视频教程 | StrainPanDA分析宏基因组共存菌株的组成和基因成分谱
点击蓝字 关注我们 StrainPanDA宏基因组分析软件 超详细教程 StrainPanDA主要针对宏基因组纵向数据,能同时实现共存菌株的组成和基因成分谱的获取,方便用户快速建立功能和组成之间的关联 ...
最新文章
- EXHCHANGE2003总结-2: 备份与还原
- 处方上电脑 北大口腔医嘱一清二楚
- 5G改变企业发展业务的方式-Vecloud微云
- Windows下Unity5x的下载
- App-V5.0服务器部署
- 教你学会七种维护服务器安全最佳技巧
- Android 切换卡(TabWidget)
- 特斯拉、华为等竞争升级,国产芯片实现突破,自动驾驶过去这一年
- 网络间谍组织 SideCopy 攻击印度政府和军队组织
- srt乱码字幕中文显示解决办法
- 深圳试行“智能行人过街系统”,行人违规将被“拉出来示众”
- vs2013 安装VSIX 插件
- Japan games Android,Learn Japanese with Games
- 【电脑一点通】如何快速切换Windows应用窗口
- reboot Linux 命令使用,linux中的reboot命令的详细解释
- 无涯教程: Laravel 8 - 队列介绍
- MAC主机eclipse连接parallels内win7虚拟机oracle
- LDF转Excel;LDF转位定义;Excel转LDF;Excel转位定义;MatrixCreat(四)之工具使用
- 2010.4.24更新 windows 7 x86/x64 应用全面导航(菜鸟老鸟全兼容)
- Android动态图文混排,Android控件TextView实现静态图与动态GIF图文混排