PHP 底層實現



2、 請在local環境,編譯PHP,要求:版本5.4, 5.5, 5.6,每個版本要涵蓋3個編譯版本,包括nts \ zts \ debug

/usr/lib/apache2/modules


/etc/apache2/mods-enabled/

vim php5.load 



    a.安裝apsx工具   apt-get install apache-dev

    b.在php源碼包下運行 ./configure  --prefix=/home/merlin/make_php_version/php-5.4-zts-debug/   --enable-maintainer-zts  --with-apxs2=/usr/bin/apxs2   --enable-debug

    c.make&&make install  在/usrb/apache2/modules下生成libphp5.so文件

    d.在/etc/apache2/mods-enabled下php5.load中添加模塊文件.so


編譯報錯 解決 undefined reference to `libiconv_open'



配置文件:

在安裝包中找到php.ini.development 拷貝到安裝後的目錄下的lib裏

每次執行該版本的php 要指定目錄

例如:/home/merlin/php_version/php-5.5.21-zts-debug/bin/php -i|grep php.ini


解決方法:
#wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
#tar -zxvf libiconv-1.13.1.tar.gz
#cd libiconv-1.13.1
# ./configure --prefix=/usr/local/libiconv
# make
# make install


再檢查php,指定 iconv的位置  --with-iconv=/usr/local/libiconv



3、 編寫一個簡單的PHP擴展,實現3個PHP方法,分別接收參數,並完成結果輸出:

    a. 數字a與數字b的,加、減、乘、除

    b. 字符串a,在字符串b中的重複次數

    c. 數組a與數組b的交集與差集


參考 http://www.laruence.com/2009/04/28/719.html


源碼包執行

  1. ./ext_skel --extname=myfunctions --proto=myfunctions.def


          make clean && make && make install

        /etc/php5   操作ini 以及移動so文件


類型指定符 對應的C類型 描述
l long 符號整數
d double 浮點數
s char *, int 二進制字符串,長度
b zend_bool 邏輯型(1或0)
r zval * 資源(文件指針,數據庫連接等)
a zval * 聯合數組
o zval * 任何類型的對象
O zval * 指定類型的對象。需要提供目標對象的類類型
z zval * 無任何操作的zval

if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sdd",&str,&str_len,&a,&b) == FAILURE){

    return;

  }



設置返回值並且結束函數 設置返回值 宏返回類型和參數
RETURN_LONG(l) RETVAL_LONG(l) 整數
RETURN_BOOL(b) RETVAL_BOOL(b) 布爾數(1或0)
RETURN_NULL() RETVAL_NULL() NULL
RETURN_DOUBLE(d) RETVAL_DOUBLE(d) 浮點數
RETURN_STRING(s, dup) RETVAL_STRING(s, dup) 字符串。如果dup爲1,引擎會調用estrdup()重複s,使用拷貝。如果dup爲0,就使用s
RETURN_STRINGL(s, l, dup) RETVAL_STRINGL(s, l, dup) 長度爲l的字符串值。與上一個宏一樣,但因爲s的長度被指定,所以速度更快。
RETURN_TRUE RETVAL_TRUE 返回布爾值true。注意到這個宏沒有括號。
RETURN_FALSE RETVAL_FALSE 返回布爾值false。注意到這個宏沒有括號。
RETURN_RESOURCE(r) RETVAL_RESOURCE(r) 資源句柄。



          php -i | grep php.ini

1、 請具體敘述PHP的運行機制(細到多深看你心情, 呵);

PHP從下到上是一個4層體系:

  • Zend引擎:Zend整體用純C實現,是PHP的內核部分,它將PHP代碼翻譯(詞法、語法解析等一系列編譯過程)爲可執行opcode的處理並實現相應的處理方法、實現了基本的數據結構(如hashtable、oo)、內存分配及管理、提供了相應的api方法供外部調用,是一切的核心,所有的外圍功能均圍繞Zend實現。
  • Extensions:圍繞着Zend引擎,extensions通過組件式的方式提供各種基礎服務,我們常見的各種內置函數(如array系列)、標準庫等都是通過extension來實現,用戶也可以根據需要實現自己的extension以達到功能擴展、性能優化等目的(如貼吧正在使用的PHP中間層、富文本解析就是extension的典型應用)。
  • Sapi:Sapi全稱是Server Application Programming Interface,也就是服務端應用編程接口,Sapi通過一系列鉤子函數,使得PHP可以和外圍交互數據,這是PHP非常優雅和成功的一個設計,通過sapi成功的將PHP本身和上層應用解耦隔離,PHP可以不再考慮如何針對不同應用進行兼容,而應用本身也可以針對自己的特點實現不同的處理方式。
  • 上層應用:這就是我們平時編寫的PHP程序,通過不同的sapi方式得到各種各樣的應用模式,如通過webserver實現web應用、在命令行下以腳本方式運行等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章