2009/12/06

在 Mac OS X 10.6.2 上 Compile PHP 5.3.1

最近有想把公司的用了六年的 PowerPC Xserve 換成新的 Mac mini with Snow Leopard 或新的 Intel-based Xserve,但畢竟舊的機器還在跑 Mac OS X 10.4 Tiger,而我在上面裝的是 Marc Liyanage 的 PHP Apache Module,這個 PHP 版本跟 Apple 比在雪豹裡附的 PHP 多了很多東西,其中包括下列我需要的功能:

  • 可以連接 M$ SQL Server,這對於大部份的企業應用很重要
  • 可連接 Oracle Server,目前雖沒用到,但難保哪天不會用到
  • 可製作含有有 TrueType 字型的圖形,這在某些應用,如 Captcha 的防堵機器人留言模組是重要的功能

由於 Marc 先生到目前為止還沒有出 10.6 版的 PHP Module Package,所以為了這些需求,看來我得自己 compile 一個版本來用。在網路上找了很多資料,終於花了一天時間初步完成。以下是我 Compile 的粗略步驟:

1. 先到下列地方下載所有需要的模組

2. 除了 PHP 5.3.1,開始一個一個 compile

在開始 Compile 之前,請先確認:

  • 你有裝了最新的 XCode,沒有的話先去下載(需要是 Apple Developer Connection 的會員,可以免費成為會員)。
  • 你有用過 "終端機"(Terminal)應用程式的經驗。
  • 有啓用 root 使用者權限。尚未啓用的話,可以參考這篇文章請注意,root 權限是至高無上的,當你開啓並登入為 root 時,你必須知道妳在幹嘛,要不然會很容易把系統搞掛。

有上述條件後,先建立一個檔案夾,再把這再步驟 #1 所下載的所有檔案,搬到那個檔案夾中。以我的例子來說,就是搬到 ~/Documents/unix/ 裡。

接下來大部份就是在終端機用 tar 解壓,然後下 ./configure && make && sudo make install 命令。詳細的步驟命令,可以參考 Installing AMP (Apache, MySQL, PHP) on Mac OS X 10.6 Snow Leopard 還有 Compiling PHP with OCI8/Oracle on Mac OS X Snow Leopard,但這兩篇的 compile PHP 的部份就是僅供參考了,因為這裡面的 PHP 5.3.1 的 ./configure 跟我的不一樣。

這邊要特別注意的是支援 M$ SQL Server 的 FreeTDS compile 方式,在解壓了 FreeTDS 後,在 configure 時應該是要下下面的指令:

./configure --enable-msdblib
make
sudo make install

這樣方能讓稍候的 PHP 5.3.1 compile 正確執行。

3. Oracle 的問題

根據 Compiling PHP with OCI8/Oracle on Mac OS X Snow Leopard,我們必須先去 Oracle 下載 Instant Client for Mac OS X 還有它的 SDK 檔案,把 Instant Client 的檔案移到 /usr/local/instantclient/ 中,而 SDK 檔案移到 /usr/local/instantclient/sdk 中,另外再下下面的終端機指令:

cd /usr/local/instantclient
sudo ln -s libclntsh.dylib.10.1 libclntsh.dylib
sudo ln -s libclntsh.dylib libclntsh.so
export NLS_LANG="American_America.UTF8"
export DYLD_LIBRARY_PATH="/usr/local/instantclient"

這邊我就不多解釋,請看該文章的 "Oracle instant client" 部份。

4. Compile PHP 5.3.1

如果步驟 #2, #3 的部份都 OK,那接下來就可以 compile PHP 5.3.1 本體了。請先把下載下來的 PHP 用 tar 解壓,之後會有個 "php-5.3.1" 的檔案夾。在我們 ./configure 前,我們得解決 iconv compile 會出現的問題,所以請用 BBEdit 或是你熟悉的 shell text editor 打開 "php-5.3.1" 下的 "ext/iconv/ionv.c" 檔案,然後把第 185 行開始的:

#ifdef HAVE_LIBICONV
#define iconv libiconv
#endif

改成:

#ifdef HAVE_LIBICONV
#define iconv iconv
#endif

然後存起來。接下來我們要在終端機下:

./configure --prefix=/usr/local/php5 --with-apxs2=/usr/sbin/apxs --with-config-file-scan-dir=/usr/local/php5/php.d --with-iconv --with-openssl=/usr --with-zlib=/usr --with-gd --with-zlib-dir=/usr --with-ldap --with-xmlrpc --with-iconv-dir=/usr --with-snmp=/usr --enable-exif --enable-wddx --enable-soap --enable-sqlite-utf8 --enable-ftp --enable-sockets --enable-mbstring --enable-calendar --enable-bcmath --with-bz2=/usr --enable-cgi --enable-zip --with-curl --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-oci8=instantclient,/usr/local/instantclient --with-pdo-oci=instantclient,/usr/local/instantclient,10.2.0.4 --with-kerberos=/usr --with-jpeg-dir=/usr/local --with-png-dir=/usr/local --enable-gd-native-ttf --with-freetype-dir=/usr/local --with-t1lib=/usr/local --with-gettext --with-mcrypt --with-mhash --with-mssql --enable-mbregex --with-xsl

之後應該要跑一段時間,如果中間有錯誤,那可能是先前的步驟沒有做完整,請再回去重新檢視一遍。順利的話,可以再下 make 指令進行實際的編譯。編譯可能需要點時間,請耐心等候。

如果 make 無誤,那請下下面指令:

sudo -s
export NLS_LANG="American_America.UTF8"
export DYLD_LIBRARY_PATH="/usr/local/instantclient"
make install
exit

5. Apache 的設定

由於 Oracle Instant Client 在 compile 時有一個缺失,我們必須讓 Apache 在執行時能正確找到 Oracle 的 dylib,必須設定在 /usr/sbin/envvars。請先打開 /usr/sbin/envvars 這個檔,然後補上:

DYLD_LIBRARY_PATH="/usr/lib:/usr/local/instantclient:$DYLD_LIBRARY_PATH"
export DYLD_LIBRARY_PATH

這樣就差不多了。最後再回到終端機,下下面的命令:

sudo apachectl restart

就應該可以用了。如果不能用,通常是掛在 Oracle,這時請打開 /System/Library/LaunchDaemons/org.apache.httpd.plist 這個檔,在第 7 行加入:

<key>EnvironmentVariables</key>
<dict>
<key>DYLD_LIBRARY_PATH</key>
<string>/usr/local/instantclient</string>
</dict>

所以改完之後,整個檔應該會類似:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<true/>
<key>EnvironmentVariables</key>
<dict>
<key>DYLD_LIBRARY_PATH</key>
<string>/usr/local/instantclient</string>
</dict>
<key>Label</key>
<string>org.apache.httpd</string>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/httpd</string>
<string>-D</string>
<string>FOREGROUND</string>
</array>
<key>OnDemand</key>
<false/>
<key>SHAuthorizationRight</key>
<string>system.preferences</string>
</dict>
</plist>

將該檔存好後,再用 sudo apachectl restart 就可以了。

以上只是我自己寫給自己看得,怕哪天又要做這事有個參考之用,所以不是寫的很仔細,大家有需要的就將就看看吧。

4 則留言:

匿名 提到...

請問一下
10.6 Server 版的PHP是比較完整版的?
還是像10.6非Server版這種殘障閹割的PHP?

NK / Forever ZARD 提到...

我沒有 mac os x 10.6 server, 不過之前用過 10.4 server, 就是閹割版的

Jovi 提到...

我就想找這個解決方案、沒想到在這裡找到了啊,好久沒來逛逛,一來就有收穫了啊,感恩啊^_^

NK / Forever ZARD 提到...

Jovi 好久不見啊~