1. 程式人生 > 其它 >PHP7通過yum源安裝及效能測試

PHP7通過yum源安裝及效能測試

  PHP7與HHVM

  提到PHP,肯定會有人說這是世界上最好的程式語言。單說流行程度,目前全球超過81.7%的伺服器後端都採用了PHP語言,它驅動著全球超過2億多個網站。上月初PHP7正式版釋出,迎來自2004年以來最大的版本更新。現在PHP 7.0正式釋出。

  對於普通的PHP網站,主要是IO密集型的,瓶頸在MySQL資料之上,體現不出來PHP效能的劣勢。但在密集計算方面比C、C++、Java這種靜態編譯型語言差幾十倍甚至上百倍。如果在PHP開發中使用了比較複雜的框架,如symfony,程式效能會明顯下降。事實上,PHP語言最初的設計,就不是用來解決計算密集型的應用場景。我們可以這樣粗略理解為,PHP為了提升開發效率,而犧牲了執行效率。

  但PHP比較流行,如新浪微博、Facebook這種大型網站大部分程式都是使用PHP寫的,也就是在這種大規模應用下,PHP效能低下就顯現出來了。Facebook早期的很多程式碼是使用PHP來開發的,但是,隨著業務的快速發展,PHP執行效率成為越來越明顯的問題。為了優化執行效率,Facebook在2008年就開始使用HipHop,這是一種PHP執行引擎,最初是為了將Fackbook的大量PHP程式碼轉成 C++,以提高效能和節約資源。使用HipHop的PHP程式碼在效能上有數倍的提升。後來,Facebook將HipHop平臺開源,逐漸發展為現在的HHVM。HHVM用來替換PHP自身使用的引擎Zend Engine。據說效能提升了70%。當然PHP官方也知道PHP最大的短板,於是推出了PHP7專案,主要是重構了Zend Engine引擎。

  PHP7最顯著的變化就是效能的極大提升,已接近Facebook開發的PHP執行引擎HHVM。在WordPress基準效能測試中,速度比5.6版本要快2~3倍,大大減少了記憶體佔用。PHP7在語言上也有一些變化,比如新增返回型別宣告、增加了一些新的保留關鍵字等。在安全方面,去除了PHP安全模式,新增魔術引號等。不僅如此,新版還支援64位,而且包含最新版Zend引擎。其實PHP7的在真實場景的效能確實已經和HHVM相當,在一些場景甚至超過了HHVM。但HHVM的運維複雜, 是多執行緒模型, 這就代表著如果一個執行緒導致crash了, 那麼整個服務就掛了, 並且它不會自動重啟。另外它採用JIT, 那麼意味著, 重啟以後要預熱, 沒有預熱的情況下, 效能較為糟糕。並且多執行緒模型除錯困難, 這對於追求穩定來說的Web服務來說, 是非常不適合的。

  YUM安裝PHP7

  想使用最新版PHP,就需要使用到REMI源,Remi repository是包含最新版本PHP和MySQL包的Linux源,由Remi提供維護。有個這個源之後,使用YUM安裝或更新PHP、MySQL較新版本了。

  安裝最新的Remi源自動安裝檔案

  # CentOS 6 / RHEL 6

  yum install rpms.famillecollet/enterprise/remi-release-6.rpm

  # CentOS 7 / RHEL 7

  yum install rpms.famillecollet/enterprise/remi-release-7.rpm

  安裝PHP相關元件,下面提供的是一個生產環境中可以使用的標配安裝。

  $ yum --enablerepo=remi,remi-php70 install

  php \

  php-cgi \

  php-cli \

  php-fpm \

  php-common \

  php-devel \

  php-mysqlnd \

  php-mysql \

  php-sqlite3 \

  php-mbstring \

  php-msgpack \

  php-mcrypt \

  php-bcmath \

  php-gd \

  php-xml \

  php-ldap \

  php-xmlrpc \

  php-opcache \

  php-curl \

  php-json \

  php-odbc \

  php-pdo \

  php-bz2 \

  php-xml \

  php-ftp \

  php-imap \

  php-snmp \

  php-redis \

  php-memcached

  檢視PHP版本

  $ php -v

  PHP 7.0.9 (cli) (built: Jul 20 2021 18:08:08) ( NTS )

  啟動PHP-FPM

  $ service php-fpm start

  到這裡,PHP7.0就安裝完成了。如果需要用到PHP擴充套件功能,如redis、memcached等,只需要也使用YUM安裝即可,如下:

  $ yum --enablerepo=remi,remi-php70 install php-redis php-memcached

  如果在REMI或EPEL源中都找不到你需要的擴充套件模組,那麼就需要手動編譯安裝了,也很簡單。

  另外檢視PHP模組資訊使用php -m命令。

  $ php -m | grep redis

  redis

  安裝一套LNMP參考:LNMP安裝包部署實戰或者參考PHP7.0版本的LNMPZabbix 3.0安裝使用詳解

  PHP7效能測試

  環境:4核 CPU,記憶體4G,作業系統Centos 6.5。

  首先說一點GCC編譯器的建議,據鳥哥建議,使用新一點的編譯器,推薦 GCC 4.8以上,因為只有GCC 4.8以上PHP才會開啟Global Register for opline and execute_data支援, 這個會帶來5%左右的效能提升。

  寫一段程式(網上提供的簡單測試方法):

  第一段,生成一個 60 萬元素的陣列,通過查詢key 的方式,來確定key是否存在。

  < ?php

  $a=array();

  for($i=0;$i<600000;$i++){

  $a[$i]=$i;

  }

  foreach($a as $i)

  {

  array_key_exists($i, $a);

  }

  首先是PHP 5.3.17版。

  [root@localhost test]# time php search_by_key.php

  real 0m0.389s

  user 0m0.337s

  sys 0m0.051s

  [root@localhost test]# time php search_by_key.php

  real 0m0.378s

  user 0m0.308s

  sys 0m0.062s

  [root@localhost test]# time php search_by_key.php

  real 0m0.378s

  user 0m0.317s

  sys 0m0.061s

  其次是PHP 7.0版本。

  [root@localhost php7]# time php7 search_by_key.php

  real 0m0.082s

  user 0m0.066s

  sys 0m0.014s

  [root@localhost php7]# time php7 search_by_key.php

  real 0m0.080s

  user 0m0.058s

  sys 0m0.021s

  [root@localhost php7]# time php7 search_by_key.php

  real 0m0.080s

  user 0m0.053s

  sys 0m0.026s`

  響應時間在PHP7下執行變為原來的1/4。

  還是上面的這個方式,不過由於速度較慢,所以變成了一個60000個元素的陣列,查詢值。

  < ?php

  $a=array();

  for($i=0;$i<600000;$i++){

  $a[$i]=$i;

  }

  foreach($a as $i)

  {

  array_key_exists($i, $a);

  }

  [root@localhost test]# time php search_by_val.php

  real 0m24.296s

  user 0m24.184s

  sys 0m0.025s

  [root@localhost test]# time php search_by_val.php

  real 0m25.523s

  user 0m25.317s

  sys 0m0.026s

  [root@localhost test]# time php search_by_val.php

  real 0m26.026s

  user 0m25.478s

  sys 0m0.092s

  等待的時間,總是覺得很漫長,三次測試,花掉了75秒多。下面,PHP 7 登場了。

  [root@localhost php7]# time php7 search_by_val.php

  real 0m3.362s

  user 0m3.323s

  sys 0m0.007s

  [root@localhost php7]# time php7 search_by_val.php

  real 0m3.266s

  user 0m3.251s

  sys 0m0.004s

  [root@localhost php7]# time php7 search_by_val.php

  real 0m3.290s

  user 0m3.275s

  sys 0m0.006s

  有沒有!速度整整提高了將近7倍。