PHP パフォーマンスの最適化 - PHP 言語レベルのパフォーマンスの最適化 -
この問題については、まず PHP のパフォーマンスに影響を与える理由を知る必要があります。つまり、
1 どのような状況で PHP のパフォーマンスの問題が発生しますか?
1php構文の不正使用(PHP自体に付属する機能で対応可能な一部業務を含む)
2 php 言語で苦手なことを行う
3 php 言語と連携したサーバーは苦手です (もちろん、localhost の場合はローカル設定が貧弱なので、変更することをお勧めします(笑))
4ps p自体の欠点(PHP自体は出来ない)
5私たちにも分からない問題 (囧)
2 php パフォーマンスの問題の概要: php パフォーマンスの問題の解決方向
最も難しいものから最も難しいものまで:
1 Php 言語レベルのパフォーマンスの最適化
2 Php 周囲の問題 (mysql nginx|apache など) のパフォーマンスの最適化
3 Php 上級言語分析と最適化 ( ps) は主に、基礎となる c コードを指します)
以下は、PHP 言語レベルのパフォーマンスの最適化に関する説明の例です。 のタイトルで説明されている内容についてテストを実行します。 bad.php、goods.php
という 2 つのファイルを記述する必要があります。テストしたいのは、2 つの配列をマージする操作です (テストツール apache ab test)
bad.php
アイデア:
まず配列 1 をターゲット配列に 1 つずつ追加します。
その後、配列 2 を走査し、配列 2 の要素が配列 1 に出現するかどうかを比較します。そうでない場合はターゲット配列に挿入します。それ以外の場合は
<span style="font-size:14px;"><?php//准备两个内容随机的数组$arr1 = $arr2 = $arr_merged = array();//接下来随机给两个数组赋值for ( $i=0; $i<rand(1000,2000); $i++) { $arr1[] = rand();}for ( $i=0; $i<rand(1000,2000); $i++) { $arr2[] = rand();}//开始循环比较foreach ( $arr1 as $v ) { $arr_merged[] = $v;}foreach ( $arr2 as $v ) { if(!in_array($v, $arr_merged)){ $arr_merged[] = $v; }}var_dump($arr_merged);</span>
goods.php
アイデア:
2 つの配列をランダムに生成し、それらをスクランブルします
を順序付けた後、array_merge を使用して をマージします
<span style="font-size:14px;"><?php//准备两个内容随机的数组$arr1 = $arr2 = range(1000, 2000);$arr_merged = array();//接下来随机给两个数组赋值shuffle($arr1);shuffle($arr2);$arr_merged = array_merge($arr1, $arr2);var_dump($arr_merged);</span>
3 使用 ab 测试两个php脚本的速度:(ps:惊人的时刻开始了)
bad.php
goods.php
对于这两个测试,我们明显的看出这的差的不是一点半点啊,在执行bad.php 的时候我明显的感觉电脑的风扇翁的一下,你懂得!
bad.php 每秒响应174个请求, 每个请求处理572ms
goods.php 每秒响应4050个请求, 每个请求处理24ms
ps: 如果还要小伙伴在使用bad的写法,赶快改掉它,小心不要你的领导知道哦!
4 究其原因对于这个结果我也很吃惊,但是事实就在眼前,没办法啊,那么到底为什么会有这样的效果呢,咱们继续一探究竟:
*.php(php代码) -----Scanner(zend引擎逐行扫描变为zend可以识别的语法)----> exprs
-----parser(解析为opcode)-----> opcodes ------exec(执行最后输出)-------> output
可以知道 一个php文件执行zend需要先扫描,然后解析为opcode 在执行输出,问题就出在这里,当我们使用php自身的函数的时候其实他就属于zend 引擎,所以zend 解析起来就比较顺手,速度那叫个快(goods.php), 但是当执行bad.php 的时候就会比较慢,因为读别人写的代码肯定没有读自己写的代码快大家说对吧,所以还是使用原创,不要自己造轮子比较好啊!
多说一点,这也就是为什么现在好些Php扩展(比如 apc)都来缓存opcode 因为这样就少了扫描与解析的环节,那肯定是快了!
5 总结
优化点:少写代码,多用php自身提供的能力
性能问题:
自己写的代码冗余较多,可读性不好,并且性能低
为什么性能低?
php代码需要编译解析为底层语言, 这一过程每次请求都会 处理一遍,开销大。
好方法:
多使用php内置变量,常量, 函数(spl 可以带给您好像好用的功能)