php kuozhan
1、php環(huán)境的搭建
我們一般使用源碼包編譯安裝,而不是binary包安裝。因?yàn)?span style="font-family:Arial;font-size:14px;line-height:26px;">使用PHP的二進(jìn)制分發(fā)包安裝有些冒險(xiǎn),這些版本傾向于忽略./configure的兩個(gè)重要選項(xiàng),它們?cè)?/span>開發(fā)過程中很便利: 第一個(gè)--enable-debug。這個(gè)選項(xiàng)將把附加的符號(hào)信息編譯進(jìn)PHP的執(zhí)行文件,以便如果發(fā)生段錯(cuò)誤,你能從中得到一個(gè)內(nèi)核轉(zhuǎn)儲(chǔ)文件,使用gdb追蹤并發(fā)現(xiàn)什么地方以及為什么會(huì)發(fā)生段錯(cuò)誤。 另 一個(gè)選項(xiàng)依賴于你的PHP版本。在PHP 4.3中該選項(xiàng)名為--enable-experimental-zts,在PHP 5及以后的版本中為--enable-maintainer-zts。這個(gè)選項(xiàng)使PHP以為自己執(zhí)行于多線程環(huán)境,并且使你能捕獲通常的程序錯(cuò)誤,然而它 們?cè)诜嵌嗑€程環(huán)境中是無害的,卻使你的擴(kuò)展不可安全用于多線程環(huán)境。一旦你已經(jīng)使用這些額外的選項(xiàng)編譯了PHP并安裝于你的開發(fā)服務(wù)器(或者工作站)中,你就可以把你的第一個(gè)擴(kuò)展加入其中了。 ?? yum install php-devel? ? ? Zend 引擎提供了一個(gè)內(nèi)存管理器,有在擴(kuò)展中跟蹤內(nèi)存泄漏的能力并提供詳盡的調(diào)試信息。跟蹤在默認(rèn)情況下是被禁用的,同時(shí)也是線程安全的。要打開的話,應(yīng)將?--enable-debug?和?--enable-maintainer-zts?選項(xiàng)與其他常用選項(xiàng)一起傳給?configure。要獲得從源代碼構(gòu)建 PHP 的說明,請(qǐng)看位于?安裝前需要考慮的事項(xiàng)?的說明。
典型的?configure?命令行可能看起來象這樣:
$ ./configure --prefix=/usr/local/php --enable-debug --enable-maintainer-zts --enable-cgi --enable-cli --with-mysql=/path/to/mysql ? ? 1)一般可以把php安裝在/usr/local/php目錄下。 ? ? 2)php的二進(jìn)制可執(zhí)行文件都在/usr/local/php/bin目錄,包括php自帶工具phpize. ? ? ? ?phpize實(shí)際上是個(gè)shell腳本,可以用vi phpize來查看其內(nèi)容. 注意:使用phpize需要安裝autoconf 宏。 因?yàn)閏onfig.m4?文件使用 GNU?autoconf?語法編寫。簡(jiǎn)而言之,就是用強(qiáng)大的宏語言增強(qiáng)的 shell 腳本。注釋用字符串?dnl?分隔,字符串則放在左右方括號(hào)中間(例如,[?和?])。字符串可按需要多次嵌套引用。完整的語法參考可參見位于http://www.gnu.org/software/autoconf/manual/ 安裝autoconf 宏最簡(jiǎn)單的方法:apt-get install autoconf2、ext_skel腳本
PHP 擴(kuò)展由幾個(gè)文件組成,這些文件對(duì)所有擴(kuò)展來說都是通用的。不同擴(kuò)展之間,這些文件的很多細(xì)節(jié)是相似的,只是要費(fèi)力去復(fù)制每個(gè)文件的內(nèi)容。幸運(yùn)的是,有腳本可以做所有的初始化工作,名為?ext_skel,自 PHP 4.0 起與其一起分發(fā)。
不帶參數(shù)運(yùn)行?ext_skel?在 PHP 5.3.2 中會(huì)產(chǎn)生以下輸出:
?
?剩下的?--extname?會(huì)將擴(kuò)展的名稱傳給?ext_skel。"name" 是一個(gè)全為小寫字母的標(biāo)識(shí)符,僅包含字母和下劃線,在 PHP 發(fā)行包的?ext/?文件夾下是唯一的。
?--proto選項(xiàng)允許開發(fā)人員指定一個(gè)頭文件,由此創(chuàng)建一系列 PHP 函數(shù),表面上看就是要開發(fā)基于一個(gè)函數(shù)庫的擴(kuò)展,但對(duì)大多數(shù)頭現(xiàn)代的文件來說很少能起作用。如果用?zlib.h?頭文件來做測(cè)試,就會(huì)導(dǎo)致在?ext_skel?的輸出文件中存在大量的空的和無意義的原型文件。--xml?和?--full-xml?選項(xiàng)當(dāng)前完全不起作用。--skel?選項(xiàng)可用于指定用一套修改過的框架文件來工作,這是本節(jié)范圍之外的話題了。
3、擴(kuò)展組成文件
不管是通過手工,通過 ext_skel?,還是通過另外的擴(kuò)展生成器,所有的擴(kuò)展都會(huì)有以下個(gè)文件: 1) ? config.m4:phpize用來準(zhǔn)備構(gòu)建系統(tǒng)哪些擴(kuò)展的配置文件configure?選項(xiàng) ,是UNIX 構(gòu)建系統(tǒng)配置。對(duì)應(yīng)的win系統(tǒng)是config.w32: ??????????? http://www.php.net/manual/zh/internals2.buildsys.configunix.php 2)?php_hello_module.h ?:包含引用的頭文件當(dāng)將擴(kuò)展作為靜態(tài)模塊構(gòu)建并放入PHP 二進(jìn)制包時(shí),構(gòu)建系統(tǒng)要求用?php_?加擴(kuò)展的名稱命名的 頭文件包含一個(gè)對(duì)擴(kuò)展模塊結(jié)構(gòu)的指針定義。就象其他頭文件,此文件經(jīng)常包含附加的宏、原型和全局量。當(dāng)然你可以把頭文件內(nèi)容放在源文件hello_module.c頂部。分開只是讓代碼組織更清晰,而且是個(gè)很好的習(xí)慣。 3) hello_module.c : 包含模塊函數(shù)的源碼文件? 擴(kuò)展應(yīng)包含任意數(shù)量的頭文件、源文件、單元測(cè)試和其他支持文件,此四個(gè)文件僅夠組成最小的擴(kuò)展。hello_module擴(kuò)展的文件列表如下所示:4、與 UNIX 構(gòu)建系統(tǒng)交互: config.m4
? ? ? ? config.m4文件負(fù)責(zé)在配置時(shí)解析configure的命令行選項(xiàng)。這就是說它將檢查所需的外部文件并且要做一些類似配置與安裝的任務(wù)。config.m4?文件告訴 UNIX 構(gòu)建系統(tǒng)哪些擴(kuò)展?configure?選項(xiàng)是支持的,你需要哪些擴(kuò)展庫,以及哪些源文件要編譯成它的一部分。對(duì)所有經(jīng)常使用的 autoconf 宏,包括 PHP 特定的及 autoconf 內(nèi)建的,
config.m4 文件舉例注意:凡是帶有dnl前綴的都是注釋,注釋是不被解析的。
4.1 PHP_ARG_*: 賦予用戶可選項(xiàng)
?在以上的? config.m4?例子中,兩條注釋后,最先見到的 3 行代碼,使用了?PHP_ARG_WITH()?和?PHP_ARG_ENABLE()。這些給?configure?提供了可選項(xiàng),和在運(yùn)行?./configure --help?時(shí)顯示的幫助文本。就象名稱所暗示的,其兩者的不同點(diǎn)在于是創(chuàng)建?--with-*?選項(xiàng)還是?--enable-*?選項(xiàng)。每個(gè)擴(kuò)展應(yīng)提供至少一個(gè)以上的選項(xiàng)以及擴(kuò)展名稱,以便用戶可選擇是否將擴(kuò)展構(gòu)建至 PHP 中。按慣例,PHP_ARG_WITH()?用于取得參數(shù)的選項(xiàng),例如擴(kuò)展所需庫或程序的位置;而?PHP_ARG_ENABLE()?用于代表簡(jiǎn)單標(biāo)志的選項(xiàng)。不管你使用哪一個(gè)指令,你都應(yīng)該注釋掉另外一個(gè)。也就是說,如果你使用了–enable-my_module,那就應(yīng)該去掉–with-my_module。反之亦然。
configue使用例子:./configure ? --enable-hello_module 則將 dnl PHP_ARG_ENABLE(hello_module, whether to enablehello_module support, dnl Make sure that the comment is aligned: dnl [ --enable-hello_module Enablehello_module support]) 修改成 PHP_ARG_ENABLE(hello_module, whether to enablehello_module support, [ --enable-hello_module Enablehello_module support])4.2 處理用戶選擇
? ? ? ?config.m4
?可給用戶提供一些做什么的選擇,現(xiàn)在就是做出選擇的時(shí)候了。在上例中,三個(gè)選項(xiàng)在未指定時(shí)顯然默認(rèn)為 "no"。習(xí)慣上,最好用此值作為用于啟用擴(kuò)展的選項(xiàng)的默認(rèn)值,為了擴(kuò)展與 PHP 分開構(gòu)建則用?phpize?覆蓋此值,而要構(gòu)建在 PHP 中時(shí)則不應(yīng)被默認(rèn)值將擴(kuò)展空間弄亂。處理這三個(gè)選項(xiàng)的代碼要復(fù)雜得多。處理 --with-example[=FILE] 選項(xiàng)
? ? ?首先檢測(cè)是否設(shè)置了?--with-example[=FILE]?選項(xiàng)。如此選項(xiàng)未被指定,或使用否定的格式(--without-example?),或賦值為 "no" 時(shí),它會(huì)控制整個(gè)擴(kuò)展的含有物其他任何事情都不會(huì)發(fā)生。在上面的例子中所指定的值為?/some/library/path/example-config,所以第一個(gè) test 成功了。
接下來,代碼調(diào)用?AC_MSG_CHECKING(),這是一個(gè)?autoconf?宏,輸出一行標(biāo)準(zhǔn)的如 "checking for ..." 的信息,并檢測(cè)用戶假定的?example-config?是否是一個(gè)明確的路徑。在這個(gè)例子中,PHP_EXAMPLE?所取到的值為?/some/library/path/example-config,現(xiàn)已復(fù)制到 EXAMPLE_PATH 變量中了。只有用戶指定了?--with-example?,才會(huì)執(zhí)行代碼?$php_shtool path $EXAMPLE_CONFIG,嘗試使用用戶當(dāng)前的?PATH?環(huán)境變量推測(cè)?example-config?的位置。無論如何,下一步都是檢測(cè)所選的EXAMPLE_PATH?是否是正常文件,是否可執(zhí)行,及是否執(zhí)行成功。如成功,則調(diào)用?AC_MSG_RESULT(),結(jié)束由?AC_MSG_CHECKING()?開始的輸出行。否則,調(diào)用?AC_MSG_ERROR(),打印所給的信息并立即中斷執(zhí)行?configure。
代碼現(xiàn)在執(zhí)行幾次?example-config?以確定一些站點(diǎn)特定的配置信息。下一步調(diào)用的是?PHP_CHECK_LIBRARY(),這是 PHP 構(gòu)建系統(tǒng)提供的一個(gè)宏,包裝了?autoconf?的?AC_CHECK_LIB()?函數(shù)。PHP_CHECK_LIBRARY()?嘗試編譯、鏈接和執(zhí)行程序,在第一個(gè)參數(shù)指定的庫中調(diào)用由第二個(gè)參數(shù)指定的符號(hào),使用第五個(gè)參數(shù)給出的字符串作為額外的鏈接選項(xiàng)。如果嘗試成功了,則運(yùn)行第三個(gè)參數(shù)所給出的腳本。此腳本從?example-config?所提供的原始的選項(xiàng)字符串中取出頭文件路徑、庫文件路徑和庫名稱,告訴 PHP 構(gòu)建系統(tǒng)。如果嘗試失敗,腳本則運(yùn)行第四個(gè)參數(shù)中的腳本。此時(shí)調(diào)用?AC_MSG_ERROR()?來中斷程序執(zhí)行。
處理 --enable-example-debug 選項(xiàng)
? ? ? 處理?--enable-example-debug?很簡(jiǎn)單。只簡(jiǎn)單地檢測(cè)其真實(shí)值。如果檢測(cè)成功,則調(diào)用?AC_DEFINE()?使 C 語言宏指令?USE_EXAMPLE_DEBUG?可用于擴(kuò)展的源代碼。第三個(gè)參數(shù)是給?config.h?的注釋字符串,通常可放心的留空。
處理 --with-example-extra=DIR 選項(xiàng)
? ? ? 對(duì)于此例子來說,由?--with-example-extra=DIR?選項(xiàng)所請(qǐng)求的假定的“額外”功能操作不會(huì)與假定的?example-config?程序共享,也沒有默認(rèn)的搜索路徑。因此,用戶需要在所需的庫之前提供設(shè)置程序。有點(diǎn)不象現(xiàn)實(shí)中的擴(kuò)展,在這里的設(shè)置僅僅起說明性的作用。
代碼開始用已熟知的方式來檢測(cè)?PHP_EXAMPLE_EXTRA?的真實(shí)值。如果所提供的為否定形式,則不會(huì)進(jìn)行其他處理,用戶也不會(huì)請(qǐng)求額外的功能。如果所提供的為未提供參數(shù)的肯定形式,則調(diào)用?AC_MSG_ERROR()?中止處理。下一步則再次調(diào)用PHP_CHECK_LIBRARY()。這一次,因?yàn)闆]有提供預(yù)定義編譯選項(xiàng),PHP_ADD_INCLUDE()?和?PHP_ADD_LIBRARY_WITH_PATH()?用于構(gòu)建額外功能所需的頭文件路徑、庫文件路徑和庫標(biāo)志。也調(diào)用?AC_DEFINE()?來指示所請(qǐng)求的額外功能代碼是可用的,設(shè)置變量來告訴以后的代碼,有額外的源代碼要構(gòu)建。如果檢測(cè)失敗,則調(diào)用所熟悉的?AC_MSG_ERROR()。另一種不同的處理失敗的方式是更換為調(diào)用?AC_MSG_WARNING(),例如:
4.3?PHP_NEW_EXTENSION宏
? ? ? ? 默認(rèn)情況下,通過ext_skel創(chuàng)建的config.m4都能接受指令,并且會(huì)自動(dòng)啟用該擴(kuò)展。啟用該擴(kuò)展是通過PHP_EXTENSION這個(gè)宏進(jìn)行 的。如果你要改變一下默認(rèn)的情況,想讓用戶明確的使用 –enable-my_module或 –with-my_module指令來把擴(kuò)展包含在PHP二進(jìn)制文件當(dāng)中,那么將 “if test "$PHP_MY_MODULE" != "no"”改為“if test "$PHP_MY_MODULE" == "yes"”即可。
if test "$PHP_MY_MODULE" == "yes"; thendnl
? ? ? ? ? PHP_EXTENSION(hello_module, $ext_shared)
fi?
這樣就會(huì)導(dǎo)致在每次重新配置和編譯PHP時(shí)都要求用戶使用 –enable-my_module指令。??
PHP_NEW_EXTENSION()
?就是宏告訴構(gòu)建系統(tǒng)去構(gòu)建擴(kuò)展本身和被其用到的文件。PHP_NEW_EXTENSION()參數(shù):
? ? ?第一個(gè)參數(shù)是擴(kuò)展的名稱,和包含它的目錄同名。
? ? ?第二個(gè)參數(shù)是做為擴(kuò)展的一部分的所有源文件的列表
。參見?PHP_ADD_BUILD_DIR()?以獲取將在子目錄中源文件添加到構(gòu)建過程的相關(guān)信息。? ? ?第三個(gè)參數(shù)總是?$ext_shared, 當(dāng)為了?--with-example[=FILE]?而調(diào)用?PHP_ARG_WITH()時(shí),由?configure?決定參數(shù)的值。
? ? ?第四個(gè)參數(shù)指定一個(gè)“SAPI 類”,僅用于專門需要 CGI 或 CLI SAPI 的擴(kuò)展。其他情況下應(yīng)留空。
? ? ?第五個(gè)參數(shù)指定了構(gòu)建時(shí)要加入?CFLAGS?的標(biāo)志列表。
? ? ?第六個(gè)參數(shù)是一個(gè)布爾值,為 "yes" 時(shí)會(huì)強(qiáng)迫整個(gè)擴(kuò)展使用?$CXX?代替?$CC?來構(gòu)建。第三個(gè)以后的所有參數(shù)都是可選的。最后,調(diào)用?PHP_SUBST()?來啟用擴(kuò)展的共享構(gòu)建。
? 例如我們要構(gòu)建擴(kuò)展是hello_module5、擴(kuò)展模塊代碼的
模塊結(jié)構(gòu)
所有的PHP模塊通常都包含以下幾個(gè)部分:
·????????包含頭文件(引入所需要的宏、API定義等);
·????????聲明導(dǎo)出函數(shù)(用于Zend函數(shù)塊的聲明);
·????????聲明Zend函數(shù)塊;
·????????聲明Zend模塊;
·????????實(shí)現(xiàn)get_module()函數(shù);
·????????實(shí)現(xiàn)導(dǎo)出函數(shù)。
詳解請(qǐng)看:
PHP擴(kuò)展代碼結(jié)構(gòu)詳解
6、創(chuàng)建擴(kuò)展的詳細(xì)步驟
我們創(chuàng)建擴(kuò)展最好放在php的源碼包的ext目錄下。如/opt/php-5.3.2/ext/下 1) ext_skel來建立一個(gè)php擴(kuò)展的一個(gè)框架 root@ubuntu:/#?cd /opt/php-5.3.2/ext/ root@ubuntu:opt/php-5.3.2/ext/]# ./ext_skel --extname=hello_module 執(zhí)行了這個(gè)步驟以后看到這樣的結(jié)果:?
?root@ubuntu:/opt/php-5.3.2/ext/hello_module# ls
config.m4 ?config.w32 ?CREDITS ?EXPERIMENTAL ?hello_module.c ?hello_module.php ?php_hello_module.h ?tests
然后我們要修改文件順序是 configue.m4 hello_module.c php_hello_module.h 2)編輯config.m4文件,我們使用enable-hello_module選項(xiàng): dnl PHP_ARG_ENABLE(hello_module, whether to enablehello_module support, dnl Make sure that the comment is aligned: dnl [ --enable-hello_module Enable hello_module support]) 修改成 PHP_ARG_ENABLE(hello_module, whether to enable hello_module support,[ ?--enable-hello_module ? ? ? ? ? Enable hello_module support]) 3)vi?hello_module.c 主要是給模塊添加函數(shù): ?/* Every user visible function must have an entry in my_module_functions[].*/ function_entry hello_module_functions[] = { PHP_FE(hello_world, NULL) /* 添加著一行代碼 */ PHP_FE(confirm_my_module_compiled, NULL) /* For testing, remove later. */ {NULL, NULL, NULL} /* Must be the last line in my_module_functions[] */ }; 在文件的最后添加下列代碼 ?定義函數(shù): PHP_FUNCTION(hello_world) { zend_printf("hello sdomain!"); }
4)修改php_hello_module.h 在PHP_FUNCTION(confirm_my_module_compiled ); /* For testing, remove later. */ 這行的下面添加一行: PHP_FUNCTION(hello_world); /* 函數(shù)的聲明 */ 5) 執(zhí)行phpiz并編譯 ?root@ubuntu:/opt/php-5.3.2/ext/hello_module#?/usr/local/php/bin/phpize ?執(zhí)行以后會(huì)看到下面的 ? ? ? ? ?Configuring for:
? ? ? ? ?PHP Api Version: ? ? ? ? 20090626
? ? ? ? ?Zend Module Api No: ? ? ?20090626
? ? ? ? ?Zend Extension Api No: ? 220090626 然后執(zhí)行: root@ubuntu:/opt/php-5.3.2/ext/hello_module#./configure ?--enable-hello_module --with-php-config=/usr/local/php/bin/php-config root@ubuntu:/opt/php-5.3.2/ext/hello_module#?make 這個(gè)時(shí)候會(huì)在當(dāng)前的目錄下生成一個(gè)目錄叫modules先存放著hello_module.so文件 cp modules/hello_module.so ? ? /usr/local/php/ext/ 然后再把hello_module.so文件拷到php.ini里面的extension_dir所指定的位置 6)開啟擴(kuò)展 php.ini文件中打開這個(gè)擴(kuò)展 extension=hello_module.so 重新起動(dòng)apache 用phpinfo來察看一下ok了
轉(zhuǎn)載于:https://blog.51cto.com/zhaojunjie/1028541
總結(jié)
以上是生活随笔為你收集整理的php kuozhan的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AIX 系统的启动和关机
- 下一篇: JQuery图表插件之Flot