摘要:上這兩天有個(gè)好玩兒的問題,大概就是有人想知道如何學(xué)習(xí)源碼,可是這種事情不是應(yīng)該自己去發(fā)掘的嗎上面是玩笑話,現(xiàn)在我也說說如何學(xué)習(xí)解釋器的源碼。在源碼根中已經(jīng)準(zhǔn)備了兩份配置文件的模板和。
PHP Mailing Lists 上這兩天有個(gè)好玩兒的問題:Introduction to the PHP source code,大概就是有人想知道如何學(xué)習(xí) PHP 源碼,可是這種事情不是應(yīng)該自己去發(fā)掘的嗎?
上面是玩笑話,現(xiàn)在我也說說如何學(xué)習(xí) PHP 解釋器的源碼。
首選你要知道的是 PHP 解釋器源碼的 github 地址:https://github.com/php/php-src ,話說回來(lái)還有人不知道嗎?這里有幾乎所有 PHP 的代碼提交記錄、pull requests 和一些 issue 等。
創(chuàng)建編譯腳本或者發(fā)布包從 Branch 中選擇一個(gè)版本 tag,和每次 PHP 發(fā)布出來(lái)的版本就是一致的。也許你會(huì)發(fā)現(xiàn)你想編譯的的時(shí)候缺找不到 configure 文件,但是有 configure.in 文件。這時(shí)候需要先執(zhí)行的是 buildconf(如果是在 Windows 下面可以執(zhí)行 buildconf.bat,不過我從來(lái)沒有嘗試過在 Windows 下面編譯 PHP,所以具體的步驟我就不清楚了)。buildconf 本身是個(gè)簡(jiǎn)單的 shell 腳本,你可以用記事本打開看看它(最終的執(zhí)行文件在 build 目錄里,這個(gè)目錄里有一些與編譯有關(guān)的文件)。
這里面涉及到一個(gè)系列的編譯工具:Autotools。如果你有興趣,可以簡(jiǎn)單的了解一下,沒有興趣的話也不用多考慮,因?yàn)檫@些工具絕大多數(shù) Linux 系統(tǒng)上都是已經(jīng)存在的。
如果你想將 Github 上的 PHP 源碼做成一個(gè)可發(fā)布的源碼包,你可以看看 makedist 這個(gè)文件,它也是一個(gè) shell 腳本(實(shí)際上源碼里幾乎所有跟編譯相關(guān)的腳本都是 shell 腳本)。但是如果想直接執(zhí)行者這個(gè)腳本,你可能會(huì)收到缺少以下組件的提示:re2c 和 Bison。仔細(xì)看 makedist 的文件,里面有調(diào)用 genfiles 這個(gè)腳本的語(yǔ)句,上面兩個(gè)工具就是在 genfiles 的腳本里被調(diào)用的。
re2c 和 Bison 分別是 PHP 用到的詞法解析器和語(yǔ)法分析器。在 genfiles 這個(gè)文件中可以看到它們的調(diào)用其實(shí)是在 Makefile.frag 中寫著,分別通過 zend_language_scanner.l 和 zend_language_parser.y 生成相應(yīng)的 C 語(yǔ)言文件(這個(gè)應(yīng)該很多地方都有提到過)。
編譯解釋器并初始化到了編譯環(huán)節(jié),編譯之前需要先通過 configure 文件生成 Makefile 然后執(zhí)行 make,所以 gcc 自然是必不可少的。configure 文件本身也是一個(gè) shell 腳本,你也可以簡(jiǎn)單閱讀一下它的內(nèi)容。不過既然它是由 autoconf 從 configure.in 中生成的,也許直接查看 configure.in 會(huì)更輕松一些。
到這里總結(jié)一下就是:拋開一些核心擴(kuò)展額依賴(比如 xml,ssl 等),編譯 PHP 的先決條件是機(jī)器上有 Autotools 的工具(automake,autoconf 等),需要安裝 re2c 和 Bison,當(dāng)然還有編譯工具(gcc)。
也許大家都知道,使用 configure 生成 Makefile 的時(shí)候可以通過 --prefix 參數(shù)指定目錄,同時(shí)也可以選擇編譯哪些核心模塊。至于哪些模塊會(huì)被默認(rèn)集成而哪些不會(huì),這些本身是寫在每個(gè)擴(kuò)展的 config.m4 (也有幾個(gè)是被命名為 config0.m4 或 config9.m4)文件里的的,全都通過一些 --enable、--disable、--with 和 --without 的選項(xiàng)來(lái)控制。
編譯的也與你采用的 Web 服務(wù)器有關(guān),這涉及到你需要使用哪個(gè) sapi,如果是 Apache,也許需要指定 --with-apxs2 的參數(shù),如果是 Nginx,php-fpm 在默認(rèn)條件下是會(huì)被編譯的,但可以指定 php-fpm 的執(zhí)行組和用戶,不過這個(gè)是可以在編譯完成后在配置中修改的。
編譯完成之后還有一些事情需要考慮,最基本的問題是 PHP 的配置文件的問題,還有一個(gè)是如果使用的是 php-fpm,如何更便捷的控制它的啟動(dòng)、停止以及重啟等。
在 PHP 源碼根中已經(jīng)準(zhǔn)備了兩份配置文件的模板:php.ini-development 和 php.ini-production。顯然是分別用于開發(fā)環(huán)境和生產(chǎn)環(huán)境的,將其中一個(gè)復(fù)制到配置文件目錄并重命名為 php.ini 即可(如果你不知道配置文件的目錄在哪里,可以使用 php --ini 命令查看)。然后也可以根據(jù)你的需要修改它。
至于 php-fpm 的控制腳本,源碼中本身也是有提供的,在 sapi/fpm 目錄下。這個(gè)目錄下的幾個(gè)文件中有 php-fpm 配置文件的模板,也有稍微修改即可放到服務(wù)器 /etc/init.d 目錄下用于控制 php-fpm 的 start、stop、restart 和 reload 動(dòng)作的腳本,現(xiàn)在的版本中也提供了用于 systemd 的 service 文件。
擴(kuò)展編譯如果 PHP 編譯完成之后,發(fā)現(xiàn)還需要一些沒有編譯進(jìn)去的核心擴(kuò)展或者第三方擴(kuò)展,你可以多帶帶編譯它們。
擴(kuò)展編譯的整個(gè)過程一共四句命令:
phpize
./configure
make
make install
phpize?命令是用來(lái)準(zhǔn)備 PHP 擴(kuò)展庫(kù)的編譯環(huán)境的。在執(zhí)行 phpize 的時(shí)候,如果有多個(gè)版本的 PHP,用哪個(gè)就要選哪個(gè)。這個(gè)命令和編譯后的 php 的二進(jìn)制文件在同一個(gè)目錄中,也是一個(gè) shell 腳本。
執(zhí)行 configure 的時(shí)候,如果當(dāng)前 $PATH 中找不到 php-config 或者有多個(gè)版本的 PHP 時(shí),也需要通過 --with-php-config 的指令來(lái)指定 php-config 的目錄。php-config 是一個(gè)用于獲取所安裝的 PHP 配置的信息,它也一樣是和 php 的二進(jìn)制文件在同一個(gè)目錄的 shell 腳本。
phpize 和 php-config 的源碼生成文件都是在 scripts 目錄下。
所有工作完成之后,就可以愉快的使用你自己定制的 PHP 了。
原文地址:http://0x1.im
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/22282.html
摘要:第一階段基礎(chǔ)階段基礎(chǔ)程序員重點(diǎn)把搞熟練核心是安裝配置基本操作目標(biāo)能夠完成基本的系統(tǒng)安裝,簡(jiǎn)單配置維護(hù)能夠做基本的簡(jiǎn)單系統(tǒng)的開發(fā)能夠在中型系統(tǒng)中支持某個(gè)功能模塊的開發(fā)。本項(xiàng)不做重點(diǎn)學(xué)習(xí),除非對(duì)前端有興趣。 第一階段:基礎(chǔ)階段(基礎(chǔ)PHP程序員) 重點(diǎn):把LNMP搞熟練(核心是安裝配置基本操作) 目標(biāo):能夠完成基本的LNMP系統(tǒng)安裝,簡(jiǎn)單配置維護(hù);能夠做基本的簡(jiǎn)單系統(tǒng)的PHP開發(fā);能夠在P...
摘要:獨(dú)立的擴(kuò)展可以獨(dú)立于源碼之外進(jìn)行分發(fā)。定義一個(gè)新擴(kuò)展我們給示例擴(kuò)展命名為。對(duì)于一個(gè)獨(dú)立擴(kuò)展來(lái)說,你只需要做一些宏調(diào)用即可。通過以上的步驟,你已經(jīng)有了一個(gè)獨(dú)立的擴(kuò)展了。 本文翻譯自 PHP 源碼中的 README.SELF-CONTAINED-EXTENSIONS。文中標(biāo)記了 注 的內(nèi)容均為自己添加。內(nèi)容有點(diǎn)老,也挺啰嗦,沒講什么深入的內(nèi)容,但是可以作為入門學(xué)習(xí)參考。 獨(dú)立的 PHP 擴(kuò)...
摘要:函數(shù)使用格式判斷變量是否為空。對(duì)于,如果變量被如的函數(shù)設(shè)為,則函數(shù)會(huì)返回。,到分支,,返回?cái)?shù)組元素的數(shù)量,為空,因此為,,,因此返回。 近日被問到PHP中empty和isset函數(shù)時(shí)怎么判斷變量的,剛開始我是一臉懵逼的,因?yàn)槲易约阂仓皇且恢虢猓瑸榱伺湔嬲脑恚s緊翻開源碼研究研究。經(jīng)過分析可發(fā)現(xiàn)兩個(gè)函數(shù)調(diào)用的都是同一個(gè)函數(shù),因此本文將對(duì)兩個(gè)函數(shù)一起分析。 我在github有對(duì)P...
說明:本篇主要學(xué)習(xí)數(shù)據(jù)庫(kù)連接階段和編譯SQL語(yǔ)句部分相關(guān)源碼。實(shí)際上,上篇已經(jīng)聊到Query Builder通過連接工廠類ConnectionFactory構(gòu)造出了MySqlConnection實(shí)例(假設(shè)驅(qū)動(dòng)driver是mysql),在該MySqlConnection中主要有三件利器:IlluminateDatabaseMysqlConnector;IlluminateDatabaseQuery...
閱讀 1943·2021-11-24 09:39
閱讀 3309·2021-09-22 14:58
閱讀 1174·2019-08-30 15:54
閱讀 3326·2019-08-29 11:33
閱讀 1796·2019-08-26 13:54
閱讀 1608·2019-08-26 13:35
閱讀 2475·2019-08-23 18:14
閱讀 772·2019-08-23 17:04