## 下載php源代碼
* 官網下載:https://secure.php.net/downloads.php
* 或GITHUB:git clone http://github.com/php/php-src
---
## 配置選項講解:`./configure --help | less`
使用`--enable-NAME`和`--disable-NAME`開關編譯哪些擴展和SAPI .
如果擴展或SAPI具有外部依賴關系,則需要使用`--with-NAME`和`--without-NAME`.
如果NAME所需的庫 不在默認位置(例如,因為您自己編譯),則可以使用`--with-NAME = DIR`指定其位置.
如果選項是`--enable-NAME`或`--with-NAME`說明該選項默認是關閉的.如果是`--disable-NAME`或`--without-NAME`說明該選項默認是開啟的.
[引用鏈接](https://segmentfault.com/q/1010000009174725)
* enable 是啟用 PHP 源碼包自帶,但是默認不啟用的擴展,比如 ftp 和 exif 擴展。with 是指定擴展依賴的資源庫的位置,如果是默認位置,就可以留空。
* php 的擴展分為靜態編譯和動態編譯兩種,靜態編譯就是隨著PHP的源碼一起編譯安裝,也就是 --enable 和 --with 啟用的擴展。動態編譯就是在一個已經可以使用的 PHP 環境下,使用 phpize 命令來給 php 增加擴展的方式,這種方式就是生成的 so 文件。所以想要把擴展編譯進 php 內核,就需要和 php 一起編譯安裝。
* php源碼包ext目錄下的就是官方默認支持的擴展,還有一部分就是 pecl 庫里的擴展,pecl 的一部分擴展也是官方支持的,另一部分是第三方開發者支持的。
* 把擴展跟隨php一起編譯安裝,也就是 configure 命令
##### ~~例如:~~
./configure --prefix=/usr/local/php
--enable-opcache \
--with-mysqli \
--with-pdo-mysql=mysqlnd \
--enable-mysqlnd \
--enable-inline-optimization \
--enable-sockets \
--enable-zip \
--enable-calendar \
--enable-bcmath \
--enable-soap \
--enable-fpm \
--with-zlib \
--with-iconv \
--with-gd \
--with-xmlrpc \
--enable-mbstring \
--without-sqlite3 \
--without-pdo-sqlite \
--with-curl \
--enable-ftp \
--with-mcrypt \
--enable-pcntl \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--disable-ipv6 \
--disable-debug \
--with-openssl \
--disable-maintainer-zts \
##### 比如 configure 命令行可能看起來象這樣:
$ ./configure --prefix=/where/to/install/php --enable-debug --enable-maintainer-zts --enable-cgi --enable-cli --with-mysql=/path/to/mysql
## 我們要進行的配置和編譯命令:
./configure --disable-all --enable-cli --enable-debug
(--enable-debug啟用調試模式,具有多重效果:
編譯將使用 -g運行以生成包括行號、變量的類型和作用域、函數名字、函數參數和函數的作用域等源文件特性的調試信息.
另外使用-O0,會讓gcc編譯時不對代碼優化.
此外,調試模式定義了 ZEND_DEBUG宏,它將啟動引擎中的各種調試助手.除其他事項外,還將報告內存泄漏以及某些數據結構的不正確使用.)
make -jN
(N為CPU數量,作用:make --help查看)
## 導入eclipse并配置
1: 右擊左側欄目空白處,點擊New -> Project -> c/c++ -> makefile project with existing code ->,再選擇PHP源代碼目錄,同時選擇GNU autotools toolchain -> finish
2: 點擊菜單欄RUN->run configurations 在彈出窗口雙擊c/c++ application添加一個配置,在右側標簽點擊search project 然后選擇php并確定.點擊arguments標簽并添加如下參數.
-r "echo 'run-test-ok';"
3:點擊apply -> close.
4:運行測試,調試測試,切換透視圖
## eclipse快捷鍵
Ctrl+左鍵 或 F3 :跳到光標所在標識符的定義代碼.
Alt+左右方向鍵 :返回上一個/下一個閱讀位置.
Ctrl+H : 打開查找窗口.
Ctrl+Shift+G :在工作空間中查找引用了光標所在標識符的位置.可以說是與F3相反的快捷鍵
Ctrl+O :查看文件概要信息.
------------------
調試快捷鍵
F5進入當前方法,如果當前執行語句是函數調用,則會進入函數里面.
F6單步執行程序,運行下一行代碼
F7退出當前方法,返回到調用層
F8繼續運行直到下一個斷點
ctrl+b:重新編譯
ctrl+f11:重新運行
## PHP內核源碼目錄結構
php-744.1.4
├── build //源碼編譯相關文件
└── ext //官方擴展目錄,包括了絕大多數PHP的函數的定義和實現
└── main //PHP核心基本文件,這里和Zend引擎不一樣,Zend引擎主要實現語言最核心的語言運行環境.
└── pear //“PHP 擴展與應用倉庫”,包含PEAR的核心文件.
└── sapi //包含了各種服務器抽象層的代碼,例如apache的mod_php,cgi,fastcgi以及fpm等等接口.
└── tests //PHP的測試腳本集合,包含PHP各項功能的測試文件
└── TSRM //PHP的線程安全是構建在TSRM庫之上的,PHP實現中常見的*G宏通常是對TSRM的封裝,TSRM(Thread Safe Resource Manager)線程安全資源管理器.
└── win32 //Windows平臺相關的一些實現,比如sokcet的實現在Windows下和*Nix平臺就不太一樣,同時也包括了Windows下編譯PHP相關的腳本.
└── Zend //Zend引擎的實現目錄,比如腳本的詞法語法解析,opcode的執行以及擴展機制的實現等等.
└── .gdbinit //gdb命令編寫腳本 (gdb) source /home/laruence/package/php-5.2.14/.gdbinit (gdb) zbacktrace
└── CODING_STANDARDS //PHP編碼標準
└── config.guess //由automake產生,兩個用于目標平臺檢測的腳本
└── config.log //configure執行時生成的日志文件
└── config.nice //configure執行時生成,記錄了上次執行configure時帶的詳細參數
└── config.status //configure執行時生成,實際調用編譯工具構建軟件的shell腳本
└── config.sub //由automake產生,兩個用于目標平臺檢測的腳本
└── configure //配置并生成makefile
└── configure.in //autoreconf創建,開發者維護,用于生成configure
└── CREDITS //開發人員名單
└── EXTENSIONS //擴展說明(維護狀態,維護人員,版本,適用系統..)
└── LICENSE //發布協議
└── php.ini-development //PHP開發環境示例配置文件
└── php.ini-production //PHP生產環境示例配置文件
└── README.EXT_SKEL //構建擴展腳本說明
└── README.GIT-RULES //GIT提交時的規則
└── README.namespaces //命名空間說明
└── README.PARAMETER_PARSING_API //新的參數解析函數說明
└── README.REDIST.BINS //PHP中引用到的其它程序協議說明
└── README.RELEASE_PROCESS //PHP發布過程說明
└── README.SELF-CONTAINED-EXTENSIONS//創建一個內建的PHP擴展
└── README.STREAMS //PHP Streams(流概念) 說明
└── README.SUBMITTING_PATCH //介紹如何提交PHP的增強功能或修補程序
└── README.TESTING //測試說明(run-tests.php)
└── README.TESTING2 //測試說明(server-tests.php)
└── README.UNIX-BUILD-SYSTEM //PHP編譯系統V5概述
└── README.WIN32-BUILD-SYSTEM //WIN32編譯說明
└── run-test.php //測試腳本
└── server-test.php //測試腳本
└── sesrver-test-config.php //測試腳本
└── UPGRADING //版本更新說明
└── UPGRADING.INTERNALS //內部更新說明