本文目錄一覽:
PHP7 為什麼變快了?
PHP7比PHP5在性能上有很大的提升
那麼PHP7做了那些優化?
變量存儲優化
數組存儲優化
hash計算:PHP底層對於字符串、數組、類屬性、類方法、函數,訪問時都要先通過hashtable查找到對應的指針,再執行對應的操作
hashtable存儲優化
函數調用
除了上面優化點之外,PHP7還有其他更多的細節性能優化。
PHP7卓越性能背後的原理有哪些
一 zval使用棧內存
在Zend引擎和擴展中,經常要創建一個PHP的變量,底層就是一個zval指針。之前的版本都是通過MAKE_STD_ZVAL動態的從堆上分配一個zval內存。而PHP7可以直接使用棧內存。PHP代碼中創建的變量也進行了優化,PHP7直接在棧內存上預分配zval。這樣節約了大量內存分配和內存管理的操作。
PHP5
zval *val; MAKE_STD_ZVAL(val);
PHP7
zval val;
二 zend_string存儲hash值,array查詢不再需要重複計算hash
PHP7為字符串單獨創建了新類型叫做zend_string,除了char *指針和長度之外,增加了一個hash字段,用於保存字符串的hash值。PHP中array是核心數據結構,PHP程序中往往都有大量的$array[$key]操作,雖然hashtable查找的時間複雜度是O(1),但$key要轉為hash值是要經過計算的。不僅僅是array操作,實際上PHP底層對於類屬性、類方法、函數,訪問時都要先通過hashtable查找到對應的指針,再執行對應的操作。PHP7之前Zend引擎會有大量的CPU時間用於計算hash值。
實際上PHP程序運行起來之後,大部分情況下$key的值都是不變的。PHP7乾脆將這個hash值保存起來,下次直接使用,這樣就節省了大量的hash計算操作,PHP的hashtable與C數組的性能一致。
三 hashtable桶內直接存數據
PHP5的hashtable每個元素都是一個 Bucket *,而PHP7直接存Bucket,減少了內存申請次數,提升了Cache命中率和內存訪問速度。
四 zend_parse_parameters改為宏實現
PHP的C擴展函數與PHP中的變量進行參數輸入時,要使用zend_parse_parameters()函數,這個函數根據一個字符串參數找到對應PHP的zval指針,然後進行賦值。 這個函數實際上有一定的性能消耗。PHP7直接使用宏替換了zend_parse_parameters函數,C擴展中不再需要使用zend_parse_parameters進行逐個參數的查找,宏展開後自動會實現參數賦值。僅此一項就提升了5%的性能。
五 新增加4種OPCODE
很多PHP程序中會大量使用call_user_function, is_int/string/array, strlen , defined 函數。PHP5 都是以擴展函數的方式提供,PHP7中這4類函數改成ZendVM的OPCODE指令,執行更快。
六 其他更多優化
除了上面5個主要優化點之外,PHP7還有其他更多的細節性能優化。如基礎類型int、float、bool等改為直接進行值拷貝,排序算法改進,PCRE with JIT,execute_data和opline使用全局寄存器等等。PHP7對性能的優化會繼續進行下去。
php7與php5的區別
php5與php7之間的區別:
1、性能提升:PHP7比PHP5.0性能提升了兩倍。
2、以前的許多致命錯誤,現在改成拋出異常。
3、PHP 7.0比PHP5.0移除了一些老的不在支持的SAPI(服務器端應用編程端口)和擴展。
4、PHP 7.0比PHP5.0新增了空接合操作符。
5、PHP 7.0比PHP5.0新增加了結合比較運算符。
6、PHP 7.0比PHP5.0新增加了函數的返回類型聲明。
7、PHP 7.0比PHP5.0新增加了標量類型聲明。
8、PHP 7.0比PHP5.0新增加匿名類。
9、錯誤處理和64位支持
鳥哥:讓php7達到最高性能的幾個tips
1. Opcache
記得啟用Zend Opcache, 因為PHP7即使不啟用Opcache速度也比PHP-5.6啟用了Opcache快, 所以之前測試時期就發生了有人一直沒有啟用Opcache的事情. 啟用Opcache非常簡單, 在php.ini配置文件中加入:
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1″
2. 使用新的編譯器
使用新一點的編譯器, 推薦GCC 4.8以上, 因為只有GCC 4.8以上PHP才會開啟Global Register for opline and execute_data支持, 這個會帶來5%左右的性能提升(Wordpres的QPS角度衡量)
其實GCC 4.8以前的版本也支持, 但是我們發現它支持的有Bug, 所以必須是4.8以上的版本才會開啟這個特性.
3. HugePage
前面文章介紹過
4. Opcache file cache
開啟Opcache File Cache(實驗性), 通過開啟這個, 我們可以讓Opcache把opcode緩存緩存到外部文件中, 對於一些腳本, 會有很明顯的性能提升.
在php.ini中加入:
opcache.file_cache=/tmp
這樣PHP就會在/tmp目錄下Cache一些Opcode的二進制導出文件, 可以跨PHP生命周期存在.
5. PGO
如果你的PHP是專門為一個項目服務, 比如只是為你的Wordpress, 或者drupal, 或者其他什麼, 那麼你就可以嘗試通過PGO, 來提升PHP, 專門為你的這個項目提高性能.
具體的, 以wordpress 4.1為優化場景.. 首先在編譯PHP的時候首先:
$ make prof-gen
然後用你的項目訓練PHP, 比如對於Wordpress:
$ sapi/cgi/php-cgi -T 100 /home/zk/local/www/htdocs/ wordpress/index.php /dev/null
也就是讓php-cgi跑100遍wordpress的首頁, 從而生成一些在這個過程中的profile信息.
最後:
$ make prof-clean$ make prof-use make install
這個時候你編譯得到的PHP7就是為你的項目量身打造的最高性能的編譯版本.
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/196506.html