php中优化建义与优化代码
1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
2、$row[’id’] 的速度是$row[id]的7倍。
3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。
4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。
5、注销那些不用的变量尤其是大数组,以便释放内存。
6、尽量避免使用__get,__set,__autoload。
7、require_once()代价昂贵。
8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。
9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于 time()。
10、函数代替正则表达式完成相同功能。
11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。
12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。
13、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。
14、用@屏蔽错误消息的做法非常低效,极其低效。
15、打开apache的mod_deflate模块,可以提高网页的浏览速度。
16、数据库连接当使用完毕时应关掉,不要用长连接。
17、错误消息代价昂贵。
18、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。
19、递增一个全局变量要比递增一个局部变量慢2倍。
20、递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。
21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。
22、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。
23、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。
24、派生类中的方法运行起来要快于在基类中定义的同样的方法。
25、调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。
26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。
27、除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。
28、尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。
29、当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。
(举例如下)
if (strlen($foo) < 5) { echo “Foo is too short”$$ }
(与下面的技巧做比较)
if (!isset($foo{5})) { echo “Foo is too short”$$ }
调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。
34、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java 代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。
35、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。
36、并非要用类实现所有的数据结构,数组也很有用。
37、不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?
38、当你需要时,你总能把代码分解成方法。
39、尽量采用大量的PHP内置函数。
40、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。
41、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。
42、mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。
43、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用 file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;
44、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;
45、优化 Select SQL 语句,在可能的情况下尽量少的进行 Insert、Update 操作(在 update 上,我被恶批过);
46、尽可能的使用PHP内部函数(但是我却为了找个 PHP 里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);
47、循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?)
48、多维数组尽量不要循环嵌套赋值
49、在可以用PHP内部字符串操作函数的情况下,不要用正则表达式
50、foreach 效率更高,尽量用 foreach 代替 while 和 for 循环
51、用单引号替代双引号引用字符串
52、用i+=1代替i=i+1。符合c/c++的习惯,效率还高
53、对 global 变量,应该用完就 unset( )掉
代码优化实例
在函数中,传递数组时
使用 return 比使用 global 要高效
比如
function userloginfo($usertemp){
$detail=explode("|",$usertemp);
return $detail;
}
$login=userloginfo($userdb);
比
function userloginfo($usertemp){
global $detail;
$detail=explode("|",$usertemp);
}
userloginfo($userdb);
要高效
2,(这个代码用于得到程序目录对应的网址,推荐使用)
$urlarray=explode(@#/@#,$HTTP_SERVER_VARS[@#REQUEST_URI@#]);
$urlcount=count($urlarray);unset($urlarray[$urlcount-1]);
$ofstarurl=@#http://@#.$HTTP_SERVER_VARS[@#HTTP_HOST@#].implode(@#/@#,$urlarray);
这段代码比
$pre_urlarray=explode(@#/@#,$HTTP_SERVER_VARS[@#HTTP_REFERER@#]);
$pre_url=array_pop($pre_urlarray);
要高效
3,在循环中判断时,数值判断使用恒等要比等于高效
$a=2;$b=2;
比如
if($a==$b)$c=$a;
比
if($a===$b)$c=$a;
高效
4,mysql 查询时尽量使用where in 少用 limit
limit查多记录的前几条, 速度很快, 但是查询最面几条就会慢
使用in .在查询连续性记录,非常快, 非连续性记录第一次运行会稍微慢一点,但是之后将比较快!
5,NT服务器数据操作稳定性不及unix/linux
6,输出前使用尽量使用 ob_start(); 可以加快输出速度,适用NT或nuli/linux,对unlix类服务器 如果使用 ob_start(@#ob_gzhandler@#);输出效率将更高
7,判断的时候尽量使用if($a==他的值) 否定的时候尽量使用if(empty($a)),因为这样程序运行更快速
8,使用不等时 != 与 <> 效率相当
9,个人经验得 使用 $a="11111111111111"; 的效率和 $a=@#11111111111111@#; 相当.并不象书本说的相差很大
10,使用规范的SQL语句, 会有利于MySQL的解析
11,使用
代码如下 | 复制代码 |
if($online){ COOKIE将马上生效 if($online) |
COOKIE需要再刷新一次才能生效
12,使用
代码如下 | 复制代码 |
$handle=fopen($filename,wb); 比 file($filename); |
无论在速度还是稳定上都要优秀
13,截断字符串优化函数(可避免?字符出现)
代码如下 | 复制代码 |
function substrs($content,$length) {
|
14,程序中屏蔽大小写
代码如下 | 复制代码 |
for ($asc=65;$asc<=90;$asc++) { //strtolower() 此函数在一些服务器会产生乱码! if (strrpos($regname,chr($asc))!==false) { $error="为了避免用户名混乱,用户名中禁止使用大写字母,请使用小写字母"; $reg_check=0; } } |
15,不使用 file();和不使用 fget();(不稳定或速度慢) 取一数组函数
代码如下 | 复制代码 |
function openfile($filename,$method="rb") { $handle=@fopen($filename,$method); @flock($handle,LOCK_SH); @$filedata=fread($handle,filesize($filename)); @fclose($handle); $filedata=str_replace(" "," <ofstar:>",$filedata); $filedb=explode("<ofstar:>",$filedata); //array_pop($filedb); $count=count($filedb); if($filedb[$count-1]==@#){unset($filedb[$count-1]);} return $filedb; } |
//这个函数虽然代码比较多,不过在速度和稳定性上优势很大!
实现如上数组分离代码
这样后,访问tempArray的块数据就非常方便了
代码如下 | 复制代码 |
foreach($tempArray as $row){ array1[$row['ID']] = $row['Key']; array2[$row['Key']][] = $row; } 访问 |
和处理代码
代码如下 | 复制代码 |
foreach($array1 as $ID => $Key){ $this->doSomeThing($ID); //访问tempArray的块数组$array2[$Key] $this->doSomeThing2($array2[$Key]); } |
自定义函数
函数(function),可以看着是为实现某个功能的独立的程序语句集合。我们将某个功能写成一个函数后,就可以在需要的地方方便的使用它。合理的使用函数,可以让我们的PHP程序更加简洁易读,更加科学。
语法
代码如下 | 复制代码 |
function function_name(arg1,arg2,……) |
创建 PHP 函数
函数是一种可以在任何被需要的时候执行的代码块。
创建 PHP 函数:
所有的函数都使用关键词 "function()" 来开始
命名函数 - 函数的名称应该提示出它的功能。函数名称以字母或下划线开头。
添加 "{" - 开口的花括号之后的部分是函数的代码。
插入函数代码
添加一个 "}" - 函数通过关闭花括号来结束。
函数的参数
参数的功能是传递信息到函数。
例子
现在,我们要在 PHP 脚本中使用这个函数了:
代码如下 | 复制代码 |
<html> <?php echo "Hello world!<br />"; </body> Hello world! |
例子:
代码如下 | 复制代码 |
<?php <?php |
一、双引号与单引号
变量可以在双引号中执行,但用 define 的常量在两种单、双引号中都是不可执行的:
代码如下 | 复制代码 |
$var = 'sofish'; define('NAME', 'sofish'); |
在 JS 中引号内不可以渲染任何变量。
二、变量的定义
使用 $ 符,而不是 var 关键字;有真正的常量,用 define 函数,一经定义,一可改变。
代码如下 | 复制代码 |
// JS 中我们用 var name = 'sofish'; // JS 中我们用 var NAME = sofish; 而且是可以改变的 // 在这里会报错,因为 NAME 已经被定义,而 JS 可以随时改变 |
三、数组
排序:
可以使用 shuffle(),在 JS 中我们通常使用 Math.random 来设定在某个范围内,访问数组的下标;如果用数字来排序,小数点会被忽略,所以如果想准确地用数字排序,把数字变成字符串,比如 1.2 应写成 '1.2'。
可以字符串当 key:
代码如下 | 复制代码 |
$arr = array('name' => 'sofish', 'age' => '25', 'gender' => 'male'); |
自动增加索引值:
下面这两个数据是相同的:
代码如下 | 复制代码 |
$arr = array('1' => 'sofish', '25', 'male') $arr = array('1' => 'sofish', '2' => '25', '3' => 'male') |
四、连字符
在 PHP 中使用 .,在 JS 中使用 +。
五、换行符
在双引号中使用 "n",'n' 是不会转成换行符的。如果你习惯使用单引号,那么可以使用 PHP_EOL:
代码如下 | 复制代码 |
echo 'im sofish,' . PHP_EOL; |
// 想象一下下面这一段,在 stackoverflow 最受欢迎的回答
// 个人不喜欢混用两种引号,不好看,但未必不好。lol?!
echo 'im sofish' . "n" . '25 ...'在 JS 中,两种引号内写 n 都是可行的。
六、if 语句
在 PHP 中另一个分支用 elseif 而在 JS 中使用 else if,中间有一个空格之差。
UPDATE: 2012.02.29 5:28 pm:Andor: "其实 if 分支的另一个分支用 elseif 和 else if 都是可以的"。
七、函数
在 PHP 中不可以使用 (function(){})() 这样的函数来直接运行一个匿名函数,但是可以创建一个参数有默认值的函数,如:
代码如下 | 复制代码 |
function fn($name, $greet = 'good moring '){ |
// 当不传值时显示默认值,结果 >> 'good morning sofish'
代码如下 | 复制代码 |
fn('sofish', 'good morning '); |
// 当传入值的时候替换默认值,结果 >> 'good afternoon sofish'
fn('sofish', 'good afternoon ');作用域,我还是比较喜欢 JS 中的闭包,在 PHP 中,我们来看一下下面的代码:
代码如下 | 复制代码 |
$a = 'hello'; $b = function(){ echo $a . ' sofish.'; }; $b(); |
我们的预期结果是,’hello sofish.’。不过,我里有2个 $b,结果往往另我们意外。在 PHP 中,变量不能在自定义函数内使用,函数内部也不能使用外部已定义的变量(WTF),除非使用 global 关键字。上面的函数修改如下,则可使用:
代码如下 | 复制代码 |
$a = 'hello'; $b = function(){ global $a; echo $a . ' sofish.'; }; $b(); |
我们通常说,要慎用全局变量。在这里就更需要了。
八、list() 函数
很有趣的函数,可以利用数组中的值给一组变量赋值。我们平时在 JS 中是这样使用一个数组的:
// 返回一个数组,然后,用 `[]` 下标来调用
代码如下 | 复制代码 |
var cursorPos = (function(){ // render ... return [posX, posY]; })(); |
在 PHP 中可以使用 list() 根据数组的内容给一组变量赋值,这样我们就可以用变量来变量名来访问我们要用的值,而不是使用下标:
// 用括号内的变量来访问函数 `cursorPos` 返回的值
list($posX, $posY) = cursorPos();另外,值得一提的另一个有趣函数 ———— isset(),判断一个值非 NULL。还有诸如 is_array / is_string 这样的函数,都是在 JS 中没有提供的。像类型判断,算是 JS 中的高组内容了,只有比较熟悉和有积累的程序员都知道怎么做比较合理。
rand() 函数返回随机整数。
语法
rand(min,max)参数 描述
min,max 可选。规定随机数产生的范围。
如果没有提供可选参数 min 和 max,rand() 返回 0 到 RAND_MAX 之间的伪随机整数。例如,想要 5 到 15(包括 5 和 15)之间的随机数,用 rand(5, 15)。
在PHP中,要生成一个随机数,可以经过如下三个步骤:
代码如下 | 复制代码 |
//第一步:初始化种子 $seedarray =microtime(); $seedstr =split(" ",$seedarray,5); $seed =$seedstr[0]*1000000; |
//第二步:使用种子初始化随机数发生器
代码如下 | 复制代码 |
srand($seed); |
//第三步:生成指定范围内的随机数
代码如下 | 复制代码 |
$random =rand(0,1000); |
其中,前面两步都不需要进行修改,就是最后一步,(0,1000)表示在0到1000中产生一个随机数(包括0在内),这个范围可以修改成你自己需要的范围。
还有一种生成随机数的更加简化的代码:
代码如下 | 复制代码 |
srand((double)microtime()*1000000); |
其中,microtime()返回了两个值:当前毫秒数和时间戳。由于我们只是要提取随机数,因而利用毫秒数即可。(double)microtime()的意思就是只返回当前的毫秒值。microtime()是以秒为单位的毫秒数,因而值都是小数,乘以1000000将其换算为整数。第二句代码表示在0到1000中生成一个随机数。
提示和注释
注释:在某些平台下(例如 Windows)RAND_MAX 只有 32768。如果需要的范围大于 32768,那么指定 min 和 max 参数就可以生成大于 RAND_MAX 的数了,或者考虑用 mt_rand() 来替代它。
注释:自 PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 函数给随机数发生器播种,现在已自动完成。
注释:在 3.0.7 之前的版本中,max 的含义是 range 。要在这些版本中得到和上例相同 5 到 15 的随机数,简短的例子是 rand (5, 11)。
下面来介绍一下date_default_timezone_set设置中国时区方法,函数简单好用有需要的朋友可参考一下。date_default_timezone_set — 设定用于一个脚本中所有日期时间函数的默认时区。
语法
bool date_default_timezone_set ( string $timezone_identifier )
参数 描述
timezone 必需。时区标识符,比如 "UTC" 或 "Europe/Paris"。
说明
注释:自 PHP 5.1.0 起(此版本日期时间函数被重写了),如果时区不合法则每个对日期时间函数的调用都会产生一条 E_NOTICE 级别的错误信息,如果使用系统设定或 TZ 环境变量则还会产生 E_STRICT 级别的信息。
设置中国时区
代码如下 | 复制代码 |
date_default_timezone_set('Asia/Shanghai');//'Asia/Shanghai' 亚洲/上海 date_default_timezone_set('Asia/Chongqing');//其中Asia/Chongqing'为“亚洲/重庆” date_default_timezone_set('PRC');//其中PRC为“中华人民共和国” |
注:以上3种方法,任意一个都可以满足我们需求。
相关文章
- 有一种方法,可以不打开网站而直接查看到这个网站的源代码.. 这样可以有效地防止误入恶意网站... 在浏览器地址栏输入: view-source:http://...2016-09-20
- <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
- 本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
- 本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
- 本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
- php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
- php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p> </p> <p> </p> <form name="form1...2016-11-25
- 公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
- 本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
- 其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
- 一、日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() +...2015-11-08
- 关于mysql效率优化一般通过以下两种方式定位执行效率较低的sql语句。通过慢查询日志定位那些执行效率较低的 SQL 语句,用 --log-slow-queries[=file_name] 选项启动时, mysqld 会 写一个包含所有执行时间超过 long_quer...2015-11-08
- 微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布。必须到你通过程序测试提交订单、发货通知等数据到微信的系统中,才能申请发布。然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到...2014-05-31
- 过了这么久,discuz论坛的问题还是困扰着很多网友,其实从各论坛里看到的问题总结出来,很关键的一点都是因为没有将数据表引擎转成InnoDB导致的,discuz在并发稍微高一点的环境下就表现的非常糟糕,产生大量的锁等待,这时候如果...2015-11-24
- java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20
- 本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
- 小编分享了一段简单的php中文转拼音的实现代码,代码简单易懂,适合初学php的同学参考学习。 代码如下 复制代码 <?phpfunction Pinyin($_String...2017-07-06
- MySQL是一个功能强大的开源数据库。随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限。这里是101条调节和优化 MySQL安装的技巧。一些技巧是针对特定的安装环境的,但这些思路是通用的。我已经把...2013-09-11
php导出csv格式数据并将数字转换成文本的思路以及代码分享
php导出csv格式数据实现:先定义一个字符串 存储内容,例如 $exportdata = '规则111,规则222,审222,规222,服2222,规则1,规则2,规则3,匹配字符,设置时间,有效期'."/n";然后对需要保存csv的数组进行foreach循环,例如复制代...2014-06-07- 这篇文章主要介绍了Angular性能优化之第三方组件和懒加载技术,对性能优化感兴趣的同学,可以参考下...2021-05-11