PHP项目优化主要三个方面
一、PHP语言级性能优化
二、PHP周边问题的性能优化
三、PHP底层
PHP语言级性能优化
1)少写代码,多用PHP自身能力。尽量使用PHP原生函数和常量,类如果要实现的功能有原生PHP函数,则不要自己用PHP实现
2)尽量使用性能更高的内置函数比如isset和array_key_exists都可以使用,则使用isset
3)产生额外开销的错误抑制符@
4)合理使用内存(PHP有内存回收机制保底,但也请小心使用内存,建议:利用unset() 及时释放不使用的内存)
5)尽量少的使用正则表达式(建议,利用字符串处理函数,实现相同逻辑)
6)循环内的计算式将会被重复计算。经常犯的错误是把一个SQL 操作放置到一个循环中,这就导致频繁的访问数据库,更重要的是,这会直接导致脚本的性能低下。以下的例子,你能够把一个循环操作重置为一个单一的SQL语句。
例:
<span style="color:#333333;"><?php
//建议
$str = 'hello world';
$strlen = strlen($str);
for($i = 0 ; $i<$strlen;$i++){
}
?></span>
?>
<span style="color:#333333;">foreach ($userList as $user) {
$query = 'INSERT INTO users (first_name,last_name) VALUES("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
mysql_query($query);
}
过程:
1
INSERT INTO users (first_name,last_name) VALUES("John", "Doe")</span>
<span style="color:#333333;">替换成:</span>
<span style="color:#333333;"><pre name="code" class="html">$userData = array();
foreach ($userList as $user) {
$userData[] = '("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
}
$query = 'INSERT INTO users (first_name,last_name) VALUES' . implode(',', $userData);
mysql_query($query);
过程:
1
INSERT INTO users (first_name,last_name) VALUES("John", "Doe"),("Jane", "Doe")...</span>
7)没有原因不要copy变量。有时初级phper,为了使代码更加“干净”,常常把已经定义的变量重新赋值给另一个变量。这实际上就导致了双重内存的消耗(当改变变量的时候),这就导致脚本的性能下降。比如一个用户把一个512KB的变量在额外插入给另一个变量,那么就会导致1MB的内存被消耗掉。
<span style="color:#333333;">$description = strip_tags($_POST['description']);
echo $description;
</span>
替换为:
<span style="color:#333333;"><span style="font-size:14px;">echo strip_tags($_POST['description']);</span></span>
周边:
1)Linux 运行环境
文件存储(硬盘,ssd)
数据库(MySQL 索引使用,NoSQL+MySQL的配合使用,MySQL主从等)
缓存(memcache redis)
2)减少文件类操作
常见PHP场景的开销次序:
读写磁盘、读写数据库、读写内存、读写网络数据
读写内存<< 读写数据库<读写磁盘<读写网络数据(基于文件系统)
3)优化网络请求
例: 对方接口的不确定因素,网络稳定性
设置超时时间
a)连接超时 (不能超过 200ms) b)读超时(800ms) c)写超时(500ms)
2) 将串行请求并行化
a)使用curl_multi_*() b)使用swoole扩展
4)压缩PHP接口输出
5)PHP缓存重复计算内容
6)Smarty 调优和重叠时间窗口思想
7)使用xhprof分析项目源码,找出瓶颈进行优化
工具:XHPorf(源自Fackbook的PHP性能分析工具)
ab - 压力测试
vld - opcode 代码分析
PHP底层
1)使用opcode扩展 缓存PHP的opcode代码,减少PHP的编译过程
2)CPU密集或者复杂功能使用PHP的pecl扩展(swoole等优秀扩展的使用)3)HHVM,百度再用,不过还是让我们坐等PHPNG的问世,有PHPNG,HHVM就不是必须的选择了