摘要:本文記錄了在CentOS 6.3上,把PHP從5.4.8升級到5.5.13的過程。
1. 概述
在我做的一個項目中,最近我對生產(chǎn)服務(wù)器上的一系列系統(tǒng)軟件進行了升級,包括Git、Nginx、MySQL和PHP。這篇文章講的是升級PHP的過程,其他軟件的升級,可見下面列出的文章。
在我加入這個項目之前,服務(wù)器上的PHP已經(jīng)安裝設(shè)置好了,我只是正常使用而已?,F(xiàn)在過去1年了,所有的開發(fā)工作都告一段落,有時間升級服務(wù)器上的 軟件了。升級這種事情是應(yīng)當(dāng)經(jīng)常做的,倒不是為了追最新版本,而是當(dāng)正式版本發(fā)放出來的時候,應(yīng)該及時更新, 以便獲得最新的更正、補丁,避免服務(wù)器上的漏洞,減少安全隱患。
升級是在今年6月13-14日進行的,到今天才有空做個記錄,便于日后參考。
2. 計劃
計劃就是預(yù)案,就是事先的準(zhǔn)備(包括心理上的)、更明細(xì)的步驟、對各種情況及對意外的對策,當(dāng)然,我們不可能面面俱到,預(yù)測一切,不然就成神了,所以要隨時準(zhǔn)備脫稿演出,think out of the box。
2.1 了解情況
計劃要有針對性,所以要先”踩點兒“。
通過在系統(tǒng)上,用find之類的命令,或者通過網(wǎng)頁用phpinfo()函數(shù)來顯示關(guān)于PHP的信息,可以找到PHP安裝在/usr/local /php目錄下。這說明PHP是從源代碼編譯安裝的,因為yum和rpm是不會安裝到/usr/local/php這個路徑的。在QQ群友的提示下,找到 PHP 5.4.8的源代碼位于/usr/local/src/php-5.4.8目錄中,進一步確認(rèn)PHP是從源代碼編譯安裝的。
查看PHP版本:
# /usr/local/php/bin/php -v PHP 5.4.8 (cli) (built: Nov 13 2012 00:08:08) Copyright (c) 1997-2012 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Tehnologies
再查看PHP-FPM的運行情況。那兩天看文檔,我才知道有PHP-FPM(FastCGI Process Manager)這么個東西,在5.4之后已經(jīng)包括在PHP之中了,詳見參考資料[]13][14]。
查看PHP-FPM使用的端口:
# netstat -ntpul | grep php-fpm tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 2881/php-fpm
查看PHP-FPM的進程:
# ps aux | grep php-fpm USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 2881 0.0 0.2 204172 2064 ? Ss 2013 38:09 php-fpm: master process (/usr/local/php/etc/php-fpm.conf) www 18982 0.0 1.4 212796 14816 ? S 19:12 0:03 php-fpm: pool www www 18983 0.0 1.4 211996 14572 ? S 19:13 0:03 php-fpm: pool www www 18984 0.0 1.4 212276 14876 ? S 19:13 0:03 php-fpm: pool www root 19144 0.0 0.0 103236 864 pts/0 S+ 23:29 0:00 grep php-fpm
查看PHP-FPM的版本:
# /usr/local/php/sbin/php-fpm -v PHP 5.4.8 (fpm-fcgi) (built: Nov 13 2012 00:15:58) Copyright (c) 1997-2012 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
查看上次系統(tǒng)啟動的時間,這是怕安裝的東西沒重啟而沒有生效:
# who -b system boot 2013-01-04 01:07 # last reboot reboot system boot 2.6.32-279.14.1. Fri Jan 4 01:07 - 20:36 (526+19:29) reboot system boot 2.6.32-220.13.1. Mon Nov 12 17:53 - 20:36 (579+02:42) reboot system boot 2.6.32-220.13.1. Thu May 10 17:12 - 17:13 (00:01) reboot system boot 2.6.32-220.13.1. Wed May 9 15:31 - 15:36 (00:04) reboot system boot 2.6.32-220.13.1. Wed May 9 15:03 - 15:29 (00:26) reboot system boot 2.6.32-220.13.1. Wed May 9 10:09 - 12:26 (02:16) reboot system boot 2.6.32-220.13.1. Thu May 3 17:23 - 17:25 (00:02) reboot system boot 2.6.32-220.13.1. Fri May 4 01:17 - 17:22 (-7:-54) reboot system boot 2.6.32-220.13.1. Fri Apr 20 21:33 - 17:22 (12+19:48) reboot system boot 2.6.32-220.13.1. Sat Apr 21 03:39 - 17:22 (12+13:42) reboot system boot 2.6.32-220.13.1. Fri Apr 20 18:02 - 17:22 (12+23:19) reboot system boot 2.6.32-220.13.1. Thu Apr 19 19:51 - 17:59 (22:07)
其實這種擔(dān)心是多余的,因為Linux和Windows不一樣,基本上新安裝的東西,都有命令行可以重啟,只要你知道相應(yīng)的命令行,不需要重啟整個系統(tǒng)。
小結(jié),現(xiàn)有的PHP 5.4.8安裝在/usr/local/php目錄下,是編譯安裝的,源代碼位于/usr/local/src/php-5.4.8目錄中。編譯安裝的好 處是,可以自己定制,增減PHP擴展等等。建議,如無必要,不要使用編譯安裝,因為這樣的安裝,操作麻煩,對操作者的要求比較高,又無法利用yum和 rpm這樣的工具,不便于升級、卸載。
這也是為什么我用yum update php命令無法直接升級PHP的原因,因為yum或者rpm根本不知道用源代碼編譯安裝的PHP。下面是我嘗試的結(jié)果:
# yum update php Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.163.com * epel: mirrors.hust.edu.cn * extras: mirrors.163.com * remi: mirrors.hustunique.com * remi-php55: mirrors.hustunique.com * updates: mirrors.163.com Setting up Update Process Package(s) php available, but not installed. No Packages marked for Update
可見,yum沒有找到已經(jīng)安裝的php包,所以沒什么可以升級的。孤獨的編譯安裝,沒人待見,看來要在角落里終老一生了。
2.2 確定計劃
經(jīng)過在幾個CakePHP、PHP相關(guān)的QQ群里,向其他朋友的請教和討論,(此處略去15000字),其實這是和上面的”踩點兒“互相摻雜在一起 進行的。在這里要特別感謝CakePHP群中的Christian和嚴(yán)謹(jǐn)?shù)腜HP HHVM MySQL群中的Linux 管理員(Freax)兩位朋友。最終在朋友們的幫助下形成了下面的計劃要點:
- 保留原有編譯安裝的PHP 5.4.8,沒必要去動它,不用就是了
- 用yum安裝PHP 5.5.13,配置PHP-FPM 5.5.13使用另一個端口(比如9001)
- 修改Nginx的配置,使用在新端口上的PHP-FPM 5.5.13
-
如何重啟PHP-FPM?
答:php-fpm在5.4以后默認(rèn)是二進制文件了,不再用service php-fpm start這種啟動了??梢栽?etc/rc.local (link to /etc/rc.d/rc.local) 加上這條命令
前期的調(diào)研、計劃,花了差不多2天時間,而之后的安裝、配置,也就用了3-4個小時。
3. 安裝、配置PHP 5.5.13
根據(jù)這兩天讀的文檔,確定使用remi安裝庫,使用yum來安裝PHP 5.5.13。
3.1 添加remi安裝庫
下面的操作依據(jù)參考資料[4]:
# wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm # wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm # rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm
3.2 用yum安裝PHP 5.5.13
從之前PHP 5.4.8下phpinfo()的輸出,知道了舊的PHP 5.4.8上安裝的PHP擴展,這樣確定了下面需要安裝的包(命令yum install之后的參數(shù)):
# yum install php php-fpm php-gd php-mysqlnd php-mcrypt php-mbstring php-pdo Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: libjpeg-turbo x86_64 1.2.1-3.el6_5 updates 174 k replacing libjpeg.x86_64 6b-46.el6 libjpeg-turbo-devel x86_64 1.2.1-3.el6_5 updates 96 k replacing libjpeg-devel.x86_64 6b-46.el6 php x86_64 5.5.13-3.el6.remi remi-php55 2.6 M php-fpm x86_64 5.5.13-3.el6.remi remi-php55 1.3 M php-gd x86_64 5.5.13-3.el6.remi remi-php55 69 k php-mbstring x86_64 5.5.13-3.el6.remi remi-php55 958 k php-mcrypt x86_64 5.5.13-3.el6.remi remi-php55 40 k php-mysqlnd x86_64 5.5.13-3.el6.remi remi-php55 261 k php-pdo x86_64 5.5.13-3.el6.remi remi-php55 109 k Installing for dependencies: apr-util-ldap x86_64 1.3.9-3.el6_0.1 base 15 k fontconfig x86_64 2.8.0-3.el6 base 186 k gd-last x86_64 2.1.0-2.el6.remi remi 129 k httpd x86_64 2.2.15-30.el6.centos updates 821 k httpd-tools x86_64 2.2.15-30.el6.centos updates 73 k libX11 x86_64 1.5.0-4.el6 base 584 k libX11-common noarch 1.5.0-4.el6 base 192 k libXau x86_64 1.0.6-4.el6 base 24 k libXpm x86_64 3.5.10-2.el6 base 51 k libmcrypt x86_64 2.5.8-9.el6 epel 96 k libtiff x86_64 3.9.4-10.el6_5 updates 343 k libxcb x86_64 1.8.1-1.el6 base 110 k libxslt x86_64 1.1.26-2.el6_3.1 base 452 k mailcap noarch 2.1.31-2.el6 base 27 k php-cli x86_64 5.5.13-3.el6.remi remi-php55 2.5 M php-common x86_64 5.5.13-3.el6.remi remi-php55 1.0 M php-pear noarch 1:1.9.4-28.el6.remi remi 373 k php-pecl-jsonc x86_64 1.3.5-1.el6.remi.5.5 remi-php55 46 k php-pecl-zip x86_64 1.12.4-1.el6.remi.5.5 remi-php55 269 k php-process x86_64 5.5.13-3.el6.remi remi-php55 54 k php-xml x86_64 5.5.13-3.el6.remi remi-php55 206 k t1lib x86_64 5.1.2-6.el6_2.1 base 160 k Transaction Summary ================================================================================ Install 31 Package(s)
yum自動計算出需要的依賴安裝包,總共有31個安裝包需要下載、安裝。
下面詢問是否繼續(xù)下載,回答y,并按回車即可繼續(xù):
Total download size: 13 M Is this ok [y/N]: y Downloading Packages: (1/31): apr-util-ldap-1.3.9-3.el6_0.1.x86_64.rpm | 15 kB 00:00 (2/31): fontconfig-2.8.0-3.el6.x86_64.rpm | 186 kB 00:00 (3/31): gd-last-2.1.0-2.el6.remi.x86_64.rpm | 129 kB 00:00 (4/31): httpd-2.2.15-30.el6.centos.x86_64.rpm | 821 kB 00:00 (5/31): httpd-tools-2.2.15-30.el6.centos.x86_64.rpm | 73 kB 00:00 (6/31): libX11-1.5.0-4.el6.x86_64.rpm | 584 kB 00:00 (7/31): libX11-common-1.5.0-4.el6.noarch.rpm | 192 kB 00:00 (8/31): libXau-1.0.6-4.el6.x86_64.rpm | 24 kB 00:00 (9/31): libXpm-3.5.10-2.el6.x86_64.rpm | 51 kB 00:00 (10/31): libjpeg-turbo-1.2.1-3.el6_5.x86_64.rpm | 174 kB 00:00 (11/31): libjpeg-turbo-devel-1.2.1-3.el6_5.x86_64.rpm | 96 kB 00:00 (12/31): libmcrypt-2.5.8-9.el6.x86_64.rpm | 96 kB 00:00 (13/31): libtiff-3.9.4-10.el6_5.x86_64.rpm | 343 kB 00:00 (14/31): libxcb-1.8.1-1.el6.x86_64.rpm | 110 kB 00:00 (15/31): libxslt-1.1.26-2.el6_3.1.x86_64.rpm | 452 kB 00:00 (16/31): mailcap-2.1.31-2.el6.noarch.rpm | 27 kB 00:00 (17/31): php-5.5.13-3.el6.remi.x86_64.rpm | 2.6 MB 00:00 (18/31): php-cli-5.5.13-3.el6.remi.x86_64.rpm | 2.5 MB 00:00 (19/31): php-common-5.5.13-3.el6.remi.x86_64.rpm | 1.0 MB 00:00 (20/31): php-fpm-5.5.13-3.el6.remi.x86_64.rpm | 1.3 MB 00:00 (21/31): php-gd-5.5.13-3.el6.remi.x86_64.rpm | 69 kB 00:00 (22/31): php-mbstring-5.5.13-3.el6.remi.x86_64.rpm | 958 kB 00:00 (23/31): php-mcrypt-5.5.13-3.el6.remi.x86_64.rpm | 40 kB 00:00 (24/31): php-mysqlnd-5.5.13-3.el6.remi.x86_64.rpm | 261 kB 00:00 (25/31): php-pdo-5.5.13-3.el6.remi.x86_64.rpm | 109 kB 00:00 (26/31): php-pear-1.9.4-28.el6.remi.noarch.rpm | 373 kB 00:00 (27/31): php-pecl-jsonc-1.3.5-1.el6.remi.5.5.x86_64.rpm | 46 kB 00:00 (28/31): php-pecl-zip-1.12.4-1.el6.remi.5.5.x86_64.rpm | 269 kB 00:00 (29/31): php-process-5.5.13-3.el6.remi.x86_64.rpm | 54 kB 00:00 (30/31): php-xml-5.5.13-3.el6.remi.x86_64.rpm | 206 kB 00:00 (31/31): t1lib-5.1.2-6.el6_2.1.x86_64.rpm | 160 kB 00:00 -------------------------------------------------------------------------------- Total 3.6 MB/s | 13 MB 00:03
之后還有一些Is this ok [y/N]:的問題,一律回答y。經(jīng)過一輪問答和安裝,最后完成時的小結(jié)為:
Installed: libjpeg-turbo.x86_64 0:1.2.1-3.el6_5 libjpeg-turbo-devel.x86_64 0:1.2.1-3.el6_5 php.x86_64 0:5.5.13-3.el6.remi php-fpm.x86_64 0:5.5.13-3.el6.remi php-gd.x86_64 0:5.5.13-3.el6.remi php-mbstring.x86_64 0:5.5.13-3.el6.remi php-mcrypt.x86_64 0:5.5.13-3.el6.remi php-mysqlnd.x86_64 0:5.5.13-3.el6.remi php-pdo.x86_64 0:5.5.13-3.el6.remi Dependency Installed: apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1 fontconfig.x86_64 0:2.8.0-3.el6 gd-last.x86_64 0:2.1.0-2.el6.remi httpd.x86_64 0:2.2.15-30.el6.centos httpd-tools.x86_64 0:2.2.15-30.el6.centos libX11.x86_64 0:1.5.0-4.el6 libX11-common.noarch 0:1.5.0-4.el6 libXau.x86_64 0:1.0.6-4.el6 libXpm.x86_64 0:3.5.10-2.el6 libmcrypt.x86_64 0:2.5.8-9.el6 libtiff.x86_64 0:3.9.4-10.el6_5 libxcb.x86_64 0:1.8.1-1.el6 libxslt.x86_64 0:1.1.26-2.el6_3.1 mailcap.noarch 0:2.1.31-2.el6 php-cli.x86_64 0:5.5.13-3.el6.remi php-common.x86_64 0:5.5.13-3.el6.remi php-pear.noarch 1:1.9.4-28.el6.remi php-pecl-jsonc.x86_64 0:1.3.5-1.el6.remi.5.5 php-pecl-zip.x86_64 0:1.12.4-1.el6.remi.5.5 php-process.x86_64 0:5.5.13-3.el6.remi php-xml.x86_64 0:5.5.13-3.el6.remi t1lib.x86_64 0:5.1.2-6.el6_2.1 Replaced: libjpeg.x86_64 0:6b-46.el6 libjpeg-devel.x86_64 0:6b-46.el6 Complete!
3.3 配置PHP-FPM的啟動
因為使用yum安裝,安裝過程已經(jīng)拷貝好了PHP-FPM的服務(wù)daemon,只需確保PHP-FPM服務(wù)能在系統(tǒng)重啟時自動啟動就行了:
# chkconfig php-fpm on
查看PHP-FPM服務(wù)的自啟動狀態(tài):
# chkconfig --list php-fpm php-fpm 0:off 1:off 2:on 3:on 4:on 5:on 6:off
正確。
3.4 停止PHP-FPM 5.4.8
查看PHP-FPM 5.4.8的進程:
# ps aux | grep php-fpm root 2881 0.0 0.1 204172 1972 ? Ss 2013 38:13 php-fpm: master process (/usr/local/php/etc/php-fpm.conf) www 19378 0.0 1.4 212764 14736 ? S 10:30 0:14 php-fpm: pool www www 19379 0.0 1.5 213352 15888 ? S 10:32 0:13 php-fpm: pool www www 19657 0.0 1.3 212076 13964 ? S 18:45 0:02 php-fpm: pool www root 20083 0.0 0.0 103236 864 pts/0 S+ 22:40 0:00 grep php-fpm
可見,當(dāng)前PHP-FPM 5.54.8進程的進程號(pid)是2881,注意其使用的配置文件/usr/local/php/etc/php-fpm.conf位于編譯安裝PHP的目錄,證實了這是PHP-FPM 5.54.8進程。其余進程為其子進程,而grep php-fpm是查看進程這個命令的進程。
中斷PHP-FPM 5.54.8進程:
# kill -TERM 2881
再次查看PHP-FPM的進程:
# ps aux | grep php-fpm root 20087 0.0 0.0 103236 864 pts/0 S+ 22:43 0:00 grep php-fpm
已經(jīng)沒有PHP-FPM的進程了,唯一剩下的grep php-fpm是查看進程這個命令的進程。
3.5 啟動PHP-FPM 5.5.13
PHP-FPM的配置,我遵照的是參考資料[10],這是一個分級結(jié)構(gòu)的配置文件,多個配置文件各司其職,便于更換配置,啟用、停止配置的各模塊也更容易。
啟動php-fpm服務(wù):
# service php-fpm start
Starting php-fpm: [ OK ]
順利啟動。
再查看其進程:
# ps aux | grep php-fpm root 20099 0.0 0.5 313272 5832 ? Ss 22:44 0:00 php-fpm: master process (/etc/php-fpm.conf) apache 20100 0.4 1.1 317112 11876 ? S 22:44 0:00 php-fpm: pool www apache 20101 0.3 1.5 319936 15316 ? S 22:44 0:00 php-fpm: pool www apache 20102 0.4 1.6 322244 16892 ? S 22:44 0:00 php-fpm: pool www apache 20103 0.4 1.5 320964 15636 ? S 22:44 0:00 php-fpm: pool www apache 20104 0.3 1.3 319648 14256 ? S 22:44 0:00 php-fpm: pool www apache 20106 0.3 1.3 319140 13696 ? S 22:45 0:00 php-fpm: pool www apache 20107 0.1 0.7 313776 8140 ? S 22:46 0:00 php-fpm: pool www root 20109 0.0 0.0 103236 864 pts/0 S+ 22:47 0:00 grep php-fpm
可見其進程號為20099,其余進程為其子進程,而grep php-fpm是查看進程這個命令的進程。
3.6 問題:數(shù)據(jù)庫的圖像文件沒有顯示
原因:PHP-FPM子進程的所有者:組是apache,而不是www。而Nginx是運行在www用戶下,故應(yīng)當(dāng)改為www。
編輯/etc/php-fpm.d/www.conf:
[www] ;user = apache user = www ;group = apache group = www
再重啟php-fpm服務(wù):
# service php-fpm stop Stopping php-fpm: [ OK ] # service php-fpm start Starting php-fpm: [ OK ]
查看php-fpm進程:
# ps aux | grep php-fpm root 20208 0.0 0.5 313272 5832 ? Ss 23:13 0:00 php-fpm: master process (/etc/php-fpm.conf) www 20209 0.4 1.0 316056 10388 ? S 23:13 0:00 php-fpm: pool www www 20210 0.3 0.9 315020 9280 ? S 23:13 0:00 php-fpm: pool www www 20211 0.4 1.0 316580 10764 ? S 23:13 0:00 php-fpm: pool www www 20212 0.4 1.0 316056 10388 ? S 23:13 0:00 php-fpm: pool www www 20213 0.0 0.4 313272 4872 ? S 23:13 0:00 php-fpm: pool www www 20215 0.0 0.4 313272 4876 ? S 23:13 0:00 php-fpm: pool www root 20217 0.0 0.0 103236 860 pts/0 S+ 23:14 0:00 grep php-fpm
可以看到PHP-FPM進程的進程號是20208,其子進程都以www用戶身份運行,而grep php-fpm是查看進程這個命令的進程。
3.7 問題:登錄總是失敗,并重新返回到登錄頁面
錯誤日志為:
2014-06-14 23:14:36 Warning: Warning (2): Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in [Unknown, line 0]
原因:PHP session目錄的所有者:組是apache:apache,而不是www:www,與實際進程運行的用戶身份不符。
更改PHP session目錄的所有者:組為www:www:
# chown -R www:www /var/lib/php/session
A. 參考資料
-
Upgrading PHP on CentOS 6.5 (Final)
http://stackoverflow.com/questions/21502656/upgrading-php-on-centos-6-5-final -
Upgrading PHP 5.3.3 to 5.4.4 in CentOS 6.4
http://superuser.com/questions/615401/upgrading-php-5-3-3-to-5-4-4-in-centos-6-4 -
How to Upgrade PHP to 5.4.10 on CentOS 6.3
http://serverfault.com/questions/466394/how-to-upgrade-php-to-5-4-10-on-centos-6-3 -
Repository Configuration - Les RPM de Remi
http://blog.famillecollet.com/pages/Config-en -
Basic Yum Commands and how to use them
http://yum.baseurl.org/wiki/YumCommands -
How do I upgrade to the latest PHP version in CentOS with yum?
http://serverfault.com/questions/456968/how-do-i-upgrade-to-the-latest-php-version-in-centos-with-yum
盡管這是從PHP 5.3升級到5.4,不過這是使用Remi安裝庫。 -
Setting Up PHP behind Nginx with FastCGI
http://www.sitepoint.com/setting-up-php-behind-nginx-with-fastcgi/ -
Running multiple PHP versions is so easy with FastCGI
http://www.ondrejsimek.com/blog/running-multiple-php-versions-is-so-easy-with-fastcgi/ -
Build PHP 5.4 on CentOS 6.2
http://benramsey.com/blog/2012/03/build-php-54-on-centos-62/
這是關(guān)于如何從源代碼編譯、構(gòu)建、安裝PHP 5.4的。 -
A better way to run PHP-FPM
http://mattiasgeniar.be/2014/04/09/a-better-way-to-run-php-fpm/ -
Install Nginx, PHP 5.5 and FastCGI on CentOS 6
http://geekpeek.net/install-nginx-php55-fastcgi/ -
Nginx and PHP-FPM Configuration and Optimizing Tips and Tricks
http://www.if-not-true-then-false.com/2011/nginx-and-php-fpm-configuration-and-optimizing-tips-and-tricks/ -
Home - PHP-FPM
http://php-fpm.org/ -
PHP: FastCGI Process Manager (FPM) - Manual
http://php.net/manual/en/install.fpm.php