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