[php擴充和嵌入式] -安裝構建環境_PHP教程

來源:互聯網
上載者:User
安裝構建環境


現在你可能至少已經有一個已安裝的php, 並且已經使用它做基於web的應用開發了. 你可能已經從php.Net下載了win32構建並運行在iis或windows版的apache上, 或者使用你的*nix(Linux, bsd, 或其他遵循POSIX的發行)發行版的包管理系統安裝了第三方建立的二進位.

構建php

除非你是下載源碼包自己編譯, 否則你肯定會錯過一些知識點.

*nix工具

C開發人員工具集中必不可少的第一個工具是C的編譯器. 你的發行版中可能會預設包含一個, 如果幸運, 它就是gcc(GNU編譯器集合). 你可以通過執行gcc version或cc version檢查是否安裝了編譯器, 如果已經安裝, 它會響應已安裝的編譯器版本資訊.

如果你還沒有安裝編譯器, 可以按照你使用的發行版官方指定的方式下載並安裝gcc. 通常這就意味著要下載一個.rpm或.deb檔案, 並執行一個命令去安裝它. 這依賴於你使用的發行版版本, 你可以簡單的使用下面命令去嘗試安裝: urpmi gcc, apt-get install gcc, pkg-add -r gcc, emerge gcc.

除了編譯器, 你還需要下面的程式和工具: make, autoconf, automake, libtool. 這些工具同樣可以用你所使用的發行版的包管理系統去安裝, 和安裝gcc時一樣, 或者直接從gnu.org下載源碼包自己編譯.

推薦的版本是: libtool 1.4.3, autoconf 2.13, automake 1.4或1.5. 使用這些軟體的更新的版本可能也能很好的工作, 但這些版本是經過長期使用驗證的.

如果你計劃使用CVS檢出最新的php開發版代碼, 還需要bison和flex去構造語言解譯器. 和其他包一樣, 這兩個包可以使用你的發行版包管理系統安裝, 或者從gnu.org下載源碼自己編譯.

如果你選擇了CVS, 你還需要安裝cvs用戶端. 同樣, 它也可能已經在你的發行版上安裝, 或者你自己去下載編譯. 和其他包不一樣的是這個包你需要在cvshome.org下載.

Win32工具

譯者不熟悉windows環境, 因此略過.

擷取php原始碼

下載php的時候, 你有集中選擇. 首先, 如果你的發行版支援, 你可以使用apt-get source php5這樣的命令去下載. 這種方式的有點在於你使用的發行版可能存在某些問題需要對php原始碼進行修改, 從這裡下載, 可以肯定這些問題已經被打補丁使得你的構建存在更少的問題.缺點在於大多數的發行版都會比php官方的發布延遲數周.

另外一個選擇是喜好設定, 在www.php.net下載php-x.y.z.tar.gz(x.y.z是當前發布版本).這些php發布版是經過全世界無數的php使用者測試的, 並且是最新的.

你還可以從snaps.php.net下載快照包. 這個網站上, php版本庫中所有原始碼的最新版本會每隔幾小時打包一次.php核心開發人員的某些提交可能會導致它暫時不可用, 但是如果你在官方發布之前需要最新的php 6.0的特性, 這是最容易得到的地方.

最後, 你可以使用cvs直接擷取到php核心Team Dev所使用的開發版. 如果你只是要開發擴充和嵌入式程式, 相比使用官方發布包和擷取快照,這不會有什麼明顯的好處. 但是如果你計劃發布你的擴充或其他應用到CVS庫, 熟悉檢出過程還是很有用的.

譯註: php目前已經使用Git來管理程式碼程式庫, 關於cvs檢出不再贅述, 請訪問https://github.com/php/php-src擷取最新源碼. 如果你想為php貢獻代碼, 可以查看該項目首頁的介紹.

配置用於開發的php

第一章中我們討論了, 無論你計劃開發擴充還是潛入php的其他應用, 在構建開發人員友好的php時有兩個特殊的./configure開關你需要使用, 這兩個開關應該和你構建php時使用的其他開關一起使用.

enable-debug

在php和zend源碼樹的某些關鍵函數上開啟調試. 首先它啟用了每個請求結束後的記憶體泄露報告.

回顧第三章"記憶體管理", ZendMM會隱式的釋放每個請求分配的, 但在指令碼結束之前沒有被釋放的記憶體. 通過在新開發的代碼上運行一系列的迴歸測試用例, 泄露點可以很容易的暴露出來, 這樣就可以在發布之間修補. 我們來看看下面的程式碼片段:

void show_value(int n) {     char *message = emalloc(1024);        sprintf(message, "The value of n is %d\n", n);     php_printf("%s", message); }

如果這段愚蠢的代碼在php請求執行過程中被執行, 它將泄露1024位元組的記憶體. 一般情況下ZendMM會在指令碼執行結束後釋放它.

在enable-debug開啟時, 就會為開發人員提供定位問題的錯誤訊息:

/cvs/php5/ext/sample/sample.c(33) :  Freeing 0x084504B8 (1024 bytes), script=- === Total 1 memory leaks detected ===

這個短小但完整的訊息告訴你ZendMM在你弄髒了記憶體後它進行了清理, 並給出了泄露的記憶體塊是在哪裡分配的. 使用這個資訊, 很容易定位問題, 開啟檔案, 找到對應的行, 在函數結束前適當的位置增加efree(message).

當然, 記憶體泄露並不是你會碰到的唯一難以追查的問題. 有時候, 問題是潛在的, 很少顯現. 比如你通宵達旦的工作, 修改了很多的代碼和源檔案, 當所有事情做完後, 你自信的執行了make, 測試了一個簡單的指令碼, 接著就看到了下面的輸出:

$ sapi/cli/php -r 'myext_samplefunc();'

Segmentation Fault

這隻是表象, 那問題出在哪裡呢? 查看你的myext_samplefunc()實現, 並沒有顯示出什麼明顯的線索, 使用gdb運行僅顯示出一串未知的符號.

同樣, enable-debug會幫到你. 通過在./configure時增加這個開關, 結果的php二進位將包含所有gdb以及其他core檔案檢查程式所需的偵錯符號, 這樣可以顯示出問題出在哪裡.

使用這個選項重新構建, 通過gdb觸發崩潰, 你現在可以看到下面的輸出:

1

2

3

#0 0x1234567 php_myext_find_delimiter(str=0x1234567 "foo@#(FHVN)@\x98\xE0...",

strlen=3, tsrm_ls=0x1234567)

p = strchr(str, ',');

目標就變得清晰了. str字串並不是NULL終止的, 後面的垃圾可以證明這一點, 而非二進位安全的函數使用了它. strchr()實現嘗試從頭到尾的掃描傳入的str, 但由於沒有終止NULL位元組, 它到達了不屬於它的記憶體, 這就導致了段錯誤. 我們可以使用memchr()和strlen參數來修複這個問題防止崩潰.

enable-mantainer-zts

這個選項強制php構建啟用安全執行緒資源管理(TSRM)/Zend安全執行緒(ZTS)層. 這個開關會增加處理時的複雜度, 但是對於開發人員而言, 你會發現這是一件好事情. 關於ZTS的詳細介紹以及為什麼在開發時要開啟這個選項, 請參考第一章.

enable-embed

如果你要開發一個嵌入php的其他應用, 就需要另外一個非常重要的開關. 這個開關開啟後就會構建出一個類似開啟了with-apxs後構建出的mod_php5.so動態連結程式庫: libphp5.so, 它可以用於將php嵌入到其他應用中.

在Unix上編譯

現在你已經有了所有需要的工具, 下載了php源碼包, 認識了所有需要的./configure開關, 是時候真正的編譯php了.

這裡假設你下載的是php-5.1.0.tar.gz, 放在了你的主目錄, 你將使用下面的命令序列解包源碼包, 並切換到解壓出的源碼目錄:

[/home/sarag]$ tar -zxf php-5.1.0.tar.gz [/home/sarag]$ cd php-5.1.0

如果你使用的不是gnu的tar, 命令可能需要略作修改:

[/home/sarag]$ gzip -d php-5.1.0.tar.gz | tar -xf -

現在, 用所需的開關和其他你想要開啟或禁用的選項, 執行./configure命令:

[/home/sarag/php-5.1.0]$ ./configure enable-debug \ enable-maintainer-zts disable-cgi enable-cli \ disable-pear disable-xml disable-sqlite \ without-mysql enable-embed

在一段時間的處理後, 在你的螢幕上輸出了很多的資訊, 最終完成了./configure階段. 接下來你就可以開始編譯了:

[/home/sarag]$ make all install

現在, 站起來喝杯咖啡吧. 編譯的時間在效能高的機器上可能需要幾分鐘, 在舊的486上甚至可能需要半個小時. 構建處理完成後, 你就擁有了一個正確配置, 功能完整, 可用於開發的php.

在Win32上編譯

譯者不熟悉windows環境, 因此略過.

小結

現在php已經以正確的選項安裝了, 你已經準備好開發一個真實的, 有功能的擴充了. 後面的章節, 就開始剖析php擴充. 即便你只計劃將php嵌入到你的應用中, 而不對語言做任何擴充, 你也應該閱讀這些章節, 因為它詳細解釋了php的運行機制.

以上就是 [翻譯][php擴充開發和嵌入式]第4章-安裝構建環境的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.