總結的方向:在linux下php挂接mysql.so擴充的方法
問題背景:平常我們都是先安裝mysql,然後才能去安裝php。假如先安裝php,後安裝mysql,由于php需要連接配接mysql,因而在php引擎中需要配置使用mysql.so擴充。這時需要手動編譯生成mysql.so擴充。
目前問題:在上面情況下,使用phpize能否實作挂接mysql.so擴充?
實踐結論:使用phpize工具能夠生成mysql.so,但是必須加上"--with-mysql=mysql用戶端的路徑"。也就是mysql.so子產品必須用到mysql用戶端才行。
可以這樣了解,mysql.so内部會調用mysql用戶端,以便實作連接配接mysql資料庫伺服器。
我們常常用到的mysql_connect()可能就是調用了mysql用戶端才能完成連接配接資料庫的操作。
一、為什麼書中一般是常常是這樣的順序安裝:先安裝mysql,然後再安裝php,很少看到先安裝php,後安裝mysql?
這樣做。是基于下面原因:
安裝好mysql後。mysql.so這個子產品才能生成。記得一個細節:在安裝php的時候,需要提供mysql的路徑。由php幫助編譯生成mysql.so子產品。mysql.so這個子產品是在安裝好php的時候生成的。生成這個子產品需要用到一個東西:
mysql用戶端。如果先安裝php,後安裝mysql。那麼無法按照原來的方式(由php幫助生成mysql.so子產品)挂接mysql.so。通過實踐,發現使用phpize工具生成mysql.so可以解決這個問題。
二、實踐生成mysql.so的過程
大體思路:需要用到php的源碼包才行。通過源碼包中提供的phpize檔案(一個專門挂接php擴充的工具)
2011.3.6測試成功
使用指令: phpize --with-mysql=/usr/local/mysql/(mysql的安裝路徑)
第一步:進入php源碼中的"ext/mysql"目錄下
指令:cd
第二步:在目前目錄下運作phpize
指令:/usr/local/php524/bin/phpize
phpize的規則:去哪個目錄下運作phpize檔案,那麼就會在該目錄下生成一個configure檔案。
第三步:運作剛才生成的configure檔案
指令: ./configure --with-php-config=/usr/local/php524/bin/php-config --with-mysql=/usr/local/mysql/
這裡最關鍵的是通過--with-mysql參數告訴mysql用戶端的位置。這樣才能生成mysql.so。
實驗的時候,沒有加這個參數,結果錯誤:
./configure --with-php-config=/usr/local/php524/bin/php-config
第四步:編譯生成.so檔案。最終要的東西
make
make install
結束/////////////////////////////////////////////////////////
第五步:配置php引擎加載該擴充
省略
補充一下:就是去php.ini檔案中修改一下配置,加載mysql.so這個擴充(這個擴充檔案要放到php指定的擴充目錄下面去)
第六步:測試php引擎是否成功加載該擴充
編寫檔案phpinfo.php,内容是:
<?php
ehco phpinfo();
?>
運作後,可以看到有如下資訊顯示:
mysql
MySQL Support enabled
Active Persistent Links 0
Active Links 0
Client API version 5.1.55
MYSQL_MODULE_TYPE no value
MYSQL_SOCKET /tmp/mysql.sock
MYSQL_INCLUDE no value
MYSQL_LIBS no value
通過這樣的方式可以确認,php引擎已經成功加載了mysql.so擴充。
第七步:已經生成的mysql.so。編寫php代碼測試是否能連接配接mysql
第六步成功後,已經知道php引擎已經成功加載了mysql.so擴充。還要确認生成的擴充是否能正常使用。為什麼?因為編譯失敗還是成功都能生成.so的擴充。一般是這樣的:.so擴充裡面其實封裝的就是一些函數,供我們調用
。假如有些函數沒有生成,最後也會得到.so的擴充。也許它的.so子產品内部是不完整的,都說不定。之前做一個支付接口的時候就是這樣的問題。.so子產品裡面是用c++語言封裝的函數。子產品雖然已生成。但是并不能正常運作
。函數出現了異常,看不到任何錯誤。後來形成一個觀念:不能以為,編譯生成了.so檔案,就認為是成功的
測試.so是否能用變得非常必要。現在測試一下生成的mysql.so是否能用。
編寫如下php代碼:
$conn = mysql_connect("localhost","root","");
mysql_select_db("mysql",$conn);
$results = mysql_query("select * from user");
$row = mysql_fetch_array($results);
var_dump($row);
得到結果(部分):
array
0 => string 'localhost' (length=9)
'Host' => string 'localhost' (length=9)
1 => string 'root' (length=4)
'User' => string 'root' (length=4)
2 => string '' (length=0)
'Password' => string '' (length=0)
3 => string 'Y' (length=1)
'Select_priv' => string 'Y' (length=1)
4 => string 'Y' (length=1)
'Insert_priv' => string 'Y' (length=1)
5 => string 'Y' (length=1)
'Update_priv' => string 'Y' (length=1)
說明,編譯生成後的mysql.so擴充能夠正常使用了。
啟發:如果開始安裝mysql和php的順序不對,後面就會增加了很多麻煩。是以,在實際情況中,有點經驗的都會"會先安裝php,再安裝mysql",這樣避免了挂接的問題。是以,實際中需要這樣做很少。
假如這樣一種情況就有用了:php與mysql都已經安裝了。後面根據需要,想安裝oracle等其他資料庫,php已經安裝了。編譯生成一個其他資料庫的擴充,思路也是一樣的