首頁  >  文章  >  後端開發  >  [php擴充開發與嵌入式]第4章-安裝建置環境

[php擴充開發與嵌入式]第4章-安裝建置環境

黄舟
黄舟原創
2017-02-09 11:27:471030瀏覽

安裝建置環境

現在你可能至少已經有一個已安裝的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核心開發團隊所使用的開發版. 如果你只是要開發擴展和嵌入式程序, 相比使用官方發布包和獲取快照,這不會有什麼明顯的好處. 但是如果你計劃發布你的擴展或其他應用在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触发崩溃, 你现在可以看到下面的输出:

#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章-安装构建环境的内容,更多相关内容请关注PHP中文网(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn