PHP编译安装
#wget http://museum.php.net/php5/php-5.2.6.tar.gz (下載php源碼)
http://cn.php.net/releases/ ?可以找到
#tar zxvf php-5.2.6.tar.gz
#cd php-5.2.6
#./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-apxs2=/usr/local/apache/bin/apxs
#make
#make install
說明:with-mysql就是你的mysql安裝路徑
===================================================
總是有人反復問我這樣一個菜鳥php在CentOS等Linux系統下的安裝問題,甚至同是一個人,幾個月內安裝PHP數次竟問我幾十個相關問題,但是我保證:他每一次問的問題都不重樣。這讓我不禁停下來思考“無數次”的原因是什么? 我初步總結兩點:引用
1.未對linux原理進行系統學習
2.Linux太靈活
由于安裝php的人目的不同,我們不能要求每個人都如此這般精通Linux再去安裝php,特別是有些php程序員僅僅是想搭建一個完整的Php環境,然后就要迅速轉入編程工作,自然對linux環境不甚熟悉。所以本文的目的就是想從菜鳥理解問題的角度(特別是面向windows下的Php程序員)闡述linux下安裝php環境遇到的種種問題的緣故和解決思路.(本文的安裝也是基于一個Linux發行版: CentOS5.2)
開始之前,普及一些必要的Linux安裝軟件的知識,一般來說:
1.不管任何linux系統,只要代碼開源, 都可以通過tar源碼包方式安裝軟件,即源碼編譯運行。
2.如果你基于某個Linux發行版工作,那么現代版的Linux套件都提供便捷的工具來安裝軟件。如CentOS使用yum,Ubuntu使用apg-get.
回到php安裝上來: php通常都是用來做web應用,所以安裝php也意味著安裝apache和mysql。
既然我們使用CentOS套件,不妨先體驗一把CentOS的yum工具如何便捷地安裝軟件.
假設此時CentOS主機已經裝好,能夠SSH登錄上去,那么開始安裝Apache,PHP, Mysql(認為以下有些只是點初學者能容易通過其他渠道掌握的省略),安裝不必順序進行:
1). 安裝Apache
sudo yum install httpd mod_ssl
2). 安裝php
sudo yum install php php-common php-gd php-mcrypt php-pear php-pecl-memcache php-mhash php-mysql php-xml
3). 安裝mysql
sudo yum install mysql-server
4). 啟動mysql,
sudo service mysqld start
5). 啟動apache
sudo service httpd start
在瀏覽器中訪問http://youhost/,看看apache歡迎頁是不是出來了.接下來寫一個php腳本,鏈接數據操作,放到apache主目錄下,看看能否訪問.
一般來說,很多人都是可以做到的,即便遇到一點問題也都可以通過google找到資料解決,讓人對Linux學習充滿信心.
那么,真正的問題在于: 你無法安于yum工具默認為你做的設置,yum傻瓜式幫你把軟件裝好,一旦你需要任何對軟件、特別是對服務器軟件的定制時,你發現你都必須面對Yum下面的復雜性!
案例1: 我發現默認裝好的php是5.1.6,但是我想升級到5.2.10,但是yum服務器沒有提供package怎么辦?
看看前面提到的源碼tar包方式,現在是面對的時刻了,去網站下載php源代碼,在本地編譯.
tar包安裝軟件基本分三步走:
Shell代碼
- 1.?configure ??
- 2.?make ??
- 3.?make?install??
注:這里的前提是apache, mysql已經安裝在你的機器上了.那么升級之前是否要卸載當前的php5.1.6呢? 當然要刪(不要手工刪除,yum安裝的就用yum刪除),執行yum remove php即可.
現在解壓縮php源碼到 php-5.2.10目錄,進入該目錄執行
Shell代碼
- ./configure?--prefix=/my/php ??
- make ??
- make?install??
這是一個最簡化的安裝步驟,如果不出意外,你的php所有相關的文件都被安裝在/my/php目錄下. 源碼安裝方式的有點在于,你能控制一個軟件安裝后所有的文件在一個相關目錄下,缺點是你必須手工地配置它和apache與mysql的關聯.
/my/php/bin/php 就是Php程序,在httpd.conf中配置其以CGI方式運行(google容易搜到不贅述).重新啟動apache, 運行一個Php腳本,現在應該已經可以執行了.
運行一個數據庫連接的php腳本,通過IE運行,結果如何? 很遺憾,他可能告訴你mysql_connect找不到. 想想這個結果蠻合理的,apache和php通過前面的設置綁定好了,但是好像從來沒設置過php和mysql的綁定啊?
其實,這里我們可以引申出一個基本概念: php如何使用第三方軟件!
本例是: php(mysql_connect()函數)使用mysql(第三方軟件).
觀察上圖,php能使用大量的第三方非php庫(典型性是C語言寫庫), 為了達到此目的,你必須具備兩個條件:
Shell代碼
- 條件I.??安裝第三方庫(軟件) ??
- 條件II.?安裝了該軟件的php擴展??
前面的情況是: mysql裝了,滿足條件I,但是條件II不滿足, 為了滿足條件二, 我們需要了解php安裝擴展的知識.
安裝php, 大的方面還可以分為兩種方式:
引用 方式1. 將擴展編譯到php
方式2. 將擴展單獨編譯成動態連接庫so文件
方式1的優點是運行速度快,但是為了一個擴展需要重新安裝整個php;方式2靈活,但是運行速度稍慢. windows平臺下的php程序員大多只熟悉方式2,因為方式2是windows下安裝Php擴展的唯一方式.
這里,我想教大家熟悉一方式1. 因為之前不是安裝php了嗎? 如果沒有刪除php-5.2.10目錄,重新進入該目錄, 那么此時重新編譯運行將采用增量方式,實際上比方式2還更方便些.仍然3步走:
Shell代碼
- ./configure?--prefix=/my/php?--with-mysql ??
- make ??
- make?install??
和第一次安裝php有什么差別? 是不是僅僅多了一個--with-mysql? 沒錯,php源碼包包括了大量的Php擴展,也包括mysql的php擴展,只要加一個--with-mysql指示符, 編譯的Php就支持mysql訪問了
不幸的是, 很多人加了--with-mysql參數后出項提示找不到頭文件(*.h)文件,這是為什么呢?..h文件屬于c語言知識范疇了, 不過,一個基本知識是: X軟件的php擴展的源代碼在編譯時必然可能依賴X軟件的某些東西,好比mysql的php擴展源代碼編譯時不僅僅要求你安裝mysql sever, 而一定要它的開發包相關文件(.h文件). 因此一般的思路就是: 下載mysql開發包并安裝. 不過不要擔心, 不到非必要,我們都盡可能使用yum工具來安裝所有能安裝的東西.通常有個命名管理,就是x軟件的開發包,往往相應的yum包名都是x-devel. 不例外地,安裝mysql開發包的命令則是: yum install mysql-devel.一路yes安裝完畢. 重新運行--with-mysql的configure, 現在應該順利重裝了php, 而且數據庫連接也應該正常工作了.
有人質疑: 我安裝mysql sdk,./configure命令一個--with-mysql就知道我安裝的目錄,還是有點神奇,難道他全硬盤搜索.h文件? 不是, 如果你用yum方式安裝sdk,那么LD_LIBRARY_PATH系統變量就指示了該sdk相關信息 ,如果你使用源碼(tar)安裝mysql sdk,你的--with-mysql參數不得不像這樣: --with-mysql=/your_mysql_sdk_dir/
案例2: (基于案例I)我發現5.2.10默認已經支持了很多擴展如果dom, iconv等,根據客戶要求,現需要安裝如下的擴展:
curl, gettext, bz2, mysql,? calendar,pspell, shmop, ftp, openssl, zlib, exif,gmp,sysvmsg,sockets,wddx, gd, mysqli, pdo_mysql, mcrypt, mime_magic, xsl
正像案例1描述安裝mysql擴展的過程一樣, 這些擴展全都可參照依法炮制.configure配置命令如下:
Shell代碼
- ./configure?--prefix=/usr/local/php?--with-curl?--with-gettext?--with-bz2?--with-mysql?-enable-shmop?--enable-calendar?--with-openssl?--with-pspell?--enable-ftp?--with-openssl?--with-zlib?--enable-exif?--with-gmp?--enable-sysvmsg?--enable-sockets?--enable-wddx?--with-xsl?--with-mcrypt?--with-mysqli?--with-mime_magic?--with-pdo-mysql?--with-gd?--with-apxs2=/usr/local/apache/bin/apxs?--without-sqlite?--enable-so??
我怎么知道這些參數的含義? 打開./configure腳本,參照官方php文檔學習這些參數的含義是正宗的方法.
特別注意--with-apxs2=/usr/local/apache/bin/apxs的用法,此參數假設了apache已經預先安裝帶有apxs,這樣apache的php模塊文件會自動添加到httpd.conf文件中,如果是通過yum方式安裝的apxs(如:yum -y install httpd-devel),則--with-apxs2參數不要加=后面的路徑。也請參考另篇文章http://koda.iteye.com/blog/233412
安裝過程中一定存在可能X軟件還沒安裝,導致X軟件的php擴展不可以通過configure檢查.下面列出部分軟件依賴性:
Linux代碼
- #?安裝apache,?mysql-server ??
- yum?-y?install?httpd?mod_ssl? ??
- yum?-y?install?mysql-server ??
- ??
- #和PHP相關的依賴 ??
- yum?-y?install?mysql-devel? ??
- yum?-y?install?perl?httpd-devel?apr-devel ??
- yum?-y?install?bzip2-devel? ??
- yum?-y?install?curl-devel? ??
- yum?-y?install?gmp-devel ??
- yum?-y?install?pspell-devel ??
- yum?-y?install?libmcrypt-devel ??
- yum?-y?install?libxslt-devel ??
- yum?-y?install?libjpeg-devel ??
- yum?-y?install?libpng-devel? ??
- yum?-y?install?libxml2-devel ??
- yum?-y?install?freetype-devel ??
- ??
- #?一些包,和部分工具軟件 ??
- yum?-y?install?openssl-devel ??
- yum?-y?install?libgssapi-devel ??
- yum?-y?install?krb5-devel ??
- yum?-y?install?make ??
- yum?-y?install?libtool-ltdl-devel ??
- yum?-y?install?sendmail?mailx?? ??
- yum?-y?install?subversion-devel??
假設yum包不包含該軟件怎么辦? 采用終極方法:tar包安裝,參照另文描述.
安裝之后,php.ini默認不存在。如果需要設置php.ini選項,通過phpinfo()函數查看php.ini默認存放路徑,將php源碼路徑下的php.ini-recommended復制到其目錄下更名為php.ini
./configure時發現如下三個32/64bit不兼容錯誤
Linux代碼
- libz.so ??
- libcom_err.so ??
- libidn.so??
案例3: (基于案例I)我看yum默認安裝的php都是以apache模塊方式安裝的,我能否也這樣做?
可以,apache的php模塊so文件是php源代碼包編譯出來的./configure加一個參數:
--with-apxs2=/usr/sbin/apxs
這是什么? --with-apxs2所指向的 /usr/sbin/apxs是apache安裝的一個Perl腳本,它知道所有apache軟件的信息, 這樣編譯出來的apache的Php模塊文件(名字可能是libphp5.so)將被復制到合適的目錄,并且修改httpd.conf裝載該文件.
如果你的apache是源碼方式安裝的,那意味著apache軟件所有相關文件都在某個目錄下,如果/usr/apache,那么你也可以不用--with-apxs2而直接使用--with-apache=/usr/apache.
F.A.Q
Q1: make install出現警告
Warning: Cannot use a scalar value as an array in phar://install-pear-nozlib.phar/PEAR/ChannelFile.php on line 1400
不影響系統運行。但是為什么呢?
Q2: 我的主機上有多個ini文件,怎樣知道那個php.ini才是我當前有效的ini文件?
A: 運行phpinfo()的php腳本,它會告訴你
Q3: 我想做一些php的設置,但是我不想改php.ini,怎么辦?
A: php做./configure時,加參數 --with-config-file-scan-dir=/etc/php.d ,那么安裝好的php運行時會自動檢查/etc/php.d/下所有.ini文件。你可以把你的配置信息寫到這里。
Q4: 啟動apachce出現錯誤:libphp5.so: cannot restore segment prot after relock: Permission Denied
A: 臨時禁用SELinux.執行命令setenforce 0. 永久生效可以執行setup命令,更改防火墻設置。
Q5: 啟動apache出現錯誤:
Starting httpd: httpd: Syntax error on line 206 of /etc/httpd/conf/httpd.conf: Cannot load /usr/lib/httpd/modules/libphp5.so into server: /usr/lib/httpd/modules/libphp5.so: undefined symbol: sqlite3SrcListShiftJoinType
A: php做./configure是時使用參數--without-sqlite。當然這是回避問題,我還沒具體研究這個問題的確切原因:)
Q5:按照你的./configure在32位機器上運行好好的,到了64位機器就不工作了,提示mysql什么的找不到
A: ./configure增加參數 -–libdir=/usr/lib64 –-with-libdir=lib64
下面是我在64bit主機上安裝php的配置參數
Shell代碼
- ./configure?--prefix=/usr/php?--with-apxs2=/usr/sbin/apxs?--with-config-file-path=/etc/?--with-config-file-scan-dir=/etc/php.d?--without-sqlite?--enable-mbstring?--with-curl?--with-gettext?--with-bz2?--with-mysql?-enable-shmop?--enable-calendar?--with-openssl?--with-pspell?--enable-ftp?--with-openssl?--with-zlib?--enable-exif?--with-gmp?--enable-sysvmsg?--enable-sockets?--enable-wddx?--with-xsl?--with-mcrypt?--with-mysqli?--with-mime_magic?--with-pdo-mysql?--libdir=/usr/lib64?--with-libdir=lib64?--with-gd?--with-jpeg-dir=/usr/lib64?--with-png-dir=/usr/lib64?--with-freetype-dir=/usr/lib64???
執行./configure之前,如果php已經make過,最好make clean以保證configure指示的參數能夠正確被編譯.
總結
- 上一篇: 新盗墓笔记礼包码怎么使用?
- 下一篇: 八卦的女筒子们,谁来帮我选几件衣服,送我