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 出版商/培训组织。买不起或者买不到的话,网上可以下到很多经典的盗版。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ios UIScrollView 基础属性

转 UIScrollView 原理 在滚动过程当中&#xff0c;其实是在修改原点坐标。当手指触摸后, scroll view会暂时拦截触摸事件,使用一个计时器。假如在计时器到点后没有发生手指移动事件&#xff0c;那么 scroll view 发送 tracking events 到被点击的 subview。假如在计时器到点前发…

LeetCode 1962. 移除石子使总数最小(优先队列)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 piles &#xff0c;数组 下标从 0 开始 &#xff0c;其中 piles[i] 表示第 i 堆石子中的石子数量。 另给你一个整数 k &#xff0c;请你执行下述操作 恰好 k 次&#xff1a; 选出任一石子堆 piles[i] &#xff0c;并从中 移除…

ubuntu自定义安装里怎么选_中央空调到底应该怎么选?小户型也能安装中央空调?行家说实话了...

▲ 点击蓝字“建通舒适家”&#xff0c;你想知道的空调问题&#xff0c;答案全在这里啦&#xff01;中央空调到底应该怎么选&#xff1f;小户型也能安装中央空调&#xff1f;行家说实话了现在业主装修大多都是对中央控空调一知半解&#xff0c;出现很多种的情况就是&#xff1a…

php辅助框架,【PHP开发框架】Laravel框架中辅助函数:optional ()函数的介绍

laravel框架中的辅助函数有很多&#xff0c;那么&#xff0c;在 Laravel 新版本中又有什么非常好用的辅助函数呢&#xff1f;接下来的这篇文章中&#xff0c;ki4网将给大家介绍一个非常有用的辅助方法&#xff1a;optional()函数&#xff0c;这个函数的用处到底是什么呢&#x…

python 清除字符串中的 emoji 表情

https://pypi.org/project/emoji/ pip install emoji字符串中间有 emoji 表情&#xff0c;替换掉。 text "&#x1f430;贝贝有点甜&#x1f430;" res emoji.demojize(text) # :rabbit_face:贝贝有点甜:rabbit_face:# 正则表达式替换为 r"想换的字符串&quo…

Linux CentOS7/RHEL7关闭ctrl+alt+delete功能键

这是本人测试的经过&#xff0c;纯粹记录来看看&#xff0c;最终解决方法在最后面&#xff0c;中间讲的是遇到的一些坑&#xff0c;可以略过不看&#xff01;&#xff01; 本人操作经验&#xff0c;转载请表明出处&#xff1a;http://www.cnblogs.com/huangjc/p/4536620.html L…

三角形css_纯 CSS 实现绘制各种三角形(各种角度)

一、前言三角形实现原理&#xff1a;宽度width为0&#xff1b;height为0&#xff1b;&#xff08;1&#xff09;有一条横竖边&#xff08;上下左右&#xff09;的设置为border-方向&#xff1a;长度 solid red&#xff0c;这个画的就是底部的直线。其他边使用border-方向&#…

java 排秩,lamd(java lambda表达式)

lamb n.羔羊&#xff0c; 小羊羔羊肉[皮](对孩子等的爱称)好宝宝&#xff0c; 小乖乖年幼、天真无邪的人&#xff1b; 羔羊般柔弱[温顺]的人[俚]容易上当的人(尤指在证券交易方面)[the Lamb ]【宗.lamd是什么意思land n. 国土&#xff1b;陆地&#xff1b;地面lamb n. 羔羊&…

LeetCode 1826. 有缺陷的传感器(枚举)

文章目录1. 题目2. 解题1. 题目 实验室里正在进行一项实验。为了确保数据的准确性&#xff0c;同时使用 两个 传感器来采集数据。 您将获得2个数组 sensor1 and sensor2&#xff0c;其中 sensor1[i] 和 sensor2[i] 分别是两个传感器对第 i 个数据点采集到的数据。 但是&#…

今天携程出事了:让我们来学习下http的响应码

就在今天&#xff0c;2015年5月28日&#xff0c;中国最大的旅游机票预订网站--携程网粗大事了。据传携程网的数据库被人物理删除了&#xff0c;而容灾备份的数据又无法正常使用&#xff0c;服务器全面遭受瘫痪。每小时给携程带来的损失约100万美元。巴拉巴拉&#xff0c;作为中…

java 删除txt,如何从.txt文件中删除2个值

if "A" in columns and int(columns[5]) < int(columns[3]):print(columns)print (columns[3]) - (columns[5])我在这做错了什么&#xff1f;不记得我最近开始编码 .这是完整的代码&#xff1a;import csvFILE_NAME "paintingJobs.txt" #I use this so…

LeetCode 1708. 长度为 K 的最大子数组

文章目录1. 题目2. 解题1. 题目 在数组 A 和数组 B 中&#xff0c;对于第一个满足 A[i] ! B[i] 的索引 i &#xff0c;当 A[i] > B[i] 时&#xff0c;数组 A 大于数组 B。 例如&#xff0c;对于索引从 0 开始的数组&#xff1a; [1,3,2,4] > [1,2,2,4] &#xff0c;因…

CSS3(animation, trasfrom)总结

CSS3(animation, trasfrom)总结 1. Animation 样式写法: 格式: -浏览器内核-keyframes 样式名 {} 标准写法(chrome safari不支持 keyframes [样式名] { 0% {left: 10px ; top : 20px;} 50% {left: 20px ; top : 30px;} 100% {left: 10px ; top : 20px;} }; Firefox -mz-keyfra…

LeetCode 1554. 只有一个不同字符的字符串(枚举)

文章目录1. 题目2. 解题1. 题目 给定一个字符串列表 dict &#xff0c;其中所有字符串的长度都相同。 当存在两个字符串在相同索引处只有一个字符不同时&#xff0c;返回 True &#xff0c;否则返回 False 。 进阶&#xff1a;你可以以 O(n*m) 的复杂度解决问题吗&#xff1…

matlab多径信道模型,多径时变信道模型的仿真与性能分析课程设计(样例3)

《多径时变信道模型的仿真与性能分析课程设计.doc》由会员分享&#xff0c;可免费在线阅读全文&#xff0c;更多与《多径时变信道模型的仿真与性能分析课程设计》相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索。1、形与输入信号波形越接近。因为信道幅频特性不理…

slice 转byte go_一文告诉你神奇的Go内建函数源码在哪里

Go内建函数源码&#xff0c;我好像在哪里见过你。 - 佚名1. 何为Go内建函数众所周知&#xff0c;Go是最简单的主流编程语言之一&#xff0c;截至Go 1.15版本&#xff0c;Go语言的关键字的规模依旧保持在25个&#xff1a;很多刚入门的gopher可能会问&#xff1a;像bool、byte、e…

modelsim 的高效使用

大概的思路&#xff1a; 1、往modelsim 添加仿真库。 2、将Verilog 文件&#xff0c;testbench文件提出。建好文件夹。比如uart仿真&#xff1a; uart_sim文件夹下&#xff1a;rtl文件夹&#xff0c;test_bench文件夹。test_bench文件夹下sim文件夹。 3、打开modelsim&#xff…

LeetCode 1586. 二叉搜索树迭代器 II(数组+栈)

文章目录1. 题目2. 解题1. 题目 实现二叉搜索树&#xff08;BST&#xff09;的中序遍历迭代器 BSTIterator 类&#xff1a; BSTIterator(TreeNode root) 初始化 BSTIterator 类的实例。 二叉搜索树的根节点 root 作为构造函数的参数传入。 内部指针使用一个不存在于树中且小于…

双光耦开关电源电路图_开关电源光耦的工作原理及典型接法

在一般的隔离电源中&#xff0c;光耦隔离反馈是一种简单、低成本的方式。但对于光耦反馈的各种连接方式及其区别&#xff0c;目前尚未见到比较深入的研究。而且在很多场合下&#xff0c;由于对光耦的工作原理理解不够深入&#xff0c;光耦接法混乱&#xff0c;往往导致电路不能…

LeetCode 1570. 两个稀疏向量的点积(哈希)

文章目录1. 题目2. 解题1. 题目 给定两个稀疏向量&#xff0c;计算它们的点积&#xff08;数量积&#xff09;。 实现类 SparseVector&#xff1a; SparseVector(nums) 以向量 nums 初始化对象。dotProduct(vec) 计算此向量与 vec 的点积。 稀疏向量 是指绝大多数分量为 0 …