PHP编码的几个最佳实践

潘工 发布于 2015/08/30 22:26
阅读 574
收藏 12
PHP

1.用逗号连接echo字符串

$name='orange';
$address='BeiJing';
echo 'Hi,'.$name.'! Welcome to '.$address;//慢
echo 'Hi,',$name,'! Welcome to ',$address;//快,建议方式

原因可以查看两者的opcode,用逗号的方式和用点号方式的opcode如下

1

2.使用require还是require_once

老问题了,Lerdof N年前就提出来了,建议用require,因为require_once发起少量的stat调用,我们可以通过ab来测试一下效率
#a.php文件

require_once('ClassA.php');
require_once('ClassB.php');
require_once('ClassC.php');
echo 'end';

测试ab -c 10 -n 10000 http://localhost/orange/a.php 同时10个请求共请求10000次,结果如下:

1

#b.php文件

require('ClassA.php');
require('ClassB.php');
require('ClassC.php');
echo 'end';

同样测试测试ab -c 10 -n 10000 http://localhost/orange/b.php 同时10个请求共请求10000次,结果如下:

1

增加了近20的并发量!

3.提前计算循环长度
如下代码

$items=array(0,1,2,3,4,5,6,7,8,9);
for($i=0;$i<count($items);$i++) { $temp=$items[$i]*$items[$i]; }

循环是如何执行的?
* $i初始化0,调用count($items)检测,平方;
* $i等于1,调用count($items)检测,平方;
* $i等于2,调用count($items)检测,平方;
* ...........................
count($items)执行了count($items)遍!所以我们提前计算循环长度,实验对比
#a.php文件

$start=microtime(true);
$items=array_fill(0,100000,'orange');
for($i=0;$i<count($items);$i++) { $temp=$items[$i].$items[$i]; } echo microtime(true)-$start;

执行结果:

1

#b.php文件

$start=microtime(true);
$items=array_fill(0,100000,'orange');
$count=count($items);
for($i=0;$i<$count;$i++) { $temp=$items[$i].$items[$i]; } echo microtime(true)-$start;

执行结果:

1

4.使用foreach、for、while循环数组

老问题了,不解释,在此就上一张表,看表后,你自己选择吧!
10万元素数组PHP循环执行平均时间

foreach    0.0078毫秒
while   0.0099毫秒
for   0.0105毫秒

5.勿要追求极致的面向对象
面向对象虽然有各种好处,但效率损失是个硬伤。
#a.php文件

/**
*  属性private,get/set齐全
*/
class Student{
    private $name;
    private $age;
    public function setAge($age){
        $this->age = $age;
    }
    public function getAge(){
        return $this->age;
    }
    public function setName($name){
        $this->name = $name;
    }
    public function getName(){
        return $this->name;
    }
}

$student=new Student();
$start=microtime(true);
for($i=0;$i<100000;$i++){ $student->setAge($i);
}
echo microtime(true)-$start;

执行时间

1

#b.php文件

/**
*  属性public,直接赋值属性
*/
class Student{
    public  $name;
    public  $age;
}
$student=new Student();
$start=microtime(true);
for($i=0;$i<100000;$i++){ $student->age=$i;
}
echo microtime(true)-$start;

1

效率提升至3000%..............................

文章来源:http://www.seo0395.com/archives-146

潘军伟博客长期分享一些自己在技术成长道路上的遇到的难题以及解决方案!

加载中
0
Tuesday
Tuesday

这些都不是问题,

下一代3D NAND 架构 SSD即将上市, 另外明年的DDR 4 内存全面化. 速度会快5倍,

web架构, 慢的永远不是php, 而是io, mysql

eechen
eechen
楼主提到的方法能在同样硬件条件下提升PHP代码的性能,何乐而不为?
__JM_Joy__
__JM_Joy__
有道理
0
Hunter丶
Hunter丶
这些都不是问题, 下一代3D NAND 架构 SSD即将上市, 另外明年的DDR 4 内存全面化. 速度会快5倍, web架构, 慢的永远不是php, 而是io, mysql
0
OSC老司机
OSC老司机
最后一个,学习了。
返回顶部
顶部