原创 PHP內核之動態修改PHP.INI

運行時改變配置 在前一篇中曾經談到,ini_set函數可以在php執行的過程中,動態修改php的部分配置。注意,僅僅是部分,並非所有的配置都可以動態修改。關於ini配置的可修改性,參見:http://php.net/manual/zh

原创 PHP內核之opcode 變量哪裏去了

首先我們需要知道一個東東:操作數,每個操作數有一下兩部分組成 IS_TMP_VAR: 一個臨時變量,保存一些op_array的結果,以便接下來的op_array使用,這種的操作數的 u 保存着一個指向變量表的一個句柄(整數),這種操

原创 PHP匿點之語言結構快於函數的原因

1、PHP中的語言結構有: echo() print() die() isset() unset() include() require() array() list() empty() 2、概念普及: 語言結構:就是

原创 PHP內核之SAPI:Apache2 SAPI分析

1、首先概念普及: SAPI: Server abstraction API,它提供了一個接口,使得PHP可以和其他應用進行交互數據,具體點說是提供了一個和外部通信的接口。常見的:給apache的mod_php5,CGI,給IIS的ISA

原创 PHP匿點之巧用位運算符 >

先來回顧下來自官方的位運算符說明: 1、<< 位左移 實質是將對應的數據的二進制值逐位左移若干位,並在空出的位置上填0,最高位溢出並捨棄。 例 如  $a=10; $b=$a<<2; //$b=40根據手冊描述可以看出位運算可以看

原创 ZVAL_STRING 和 ZVAL_STRINGL

字符串處理是我們常用的操作,而 zend 封裝了很多關於字符串操作相關的宏,先看下 ZVAL_STRING 和 ZVAL_STRINGL #define ZVAL_STRING(z, s, duplicate) do { \ cons

原创 PHP函數源碼之SESSION實現機制

Session是以擴展的形式嵌入到PHP內核的,所以我們可以把Session當成擴展來看待。 一般擴展被載入到PHP會經過下面幾個過程 [cpp] view plain copy   #define PHP_MINI

原创 PHP匿點源碼之變量賦值與引用

首先需要知道的是: 拿$a=10舉例 PHP變量的名稱和值在內核中是保存在兩個不同的地方的, 值[10]是通過一個與名字毫無關係的zval結構來保存, 名字[a]則保存在符號表裏, 兩者之間通過指針聯繫着。 我們來看下zval的結構

原创 PHP內核之PHP.INI配置原理

使用php的同學都知道php.ini配置的生效會貫穿整個SAPI的生命週期。在一段php腳本的執行過程中,如果手動修改ini配置,是不會啓作用的。此時如果無法重啓apache或者nginx等,那麼就只能顯式的在php代碼中調用ini_s

原创 PHP內核之opcode的處理函數查找

首先我們需要知道有個存放 所有opcode 的 opcode_handler_t 的函數指針字段 的集合 的文件 php-5.5.12\Zend\zend_vm_execute.h void zend_init_opcodes_handl

原创 PHP內核之opcode解讀

我們通過示例來說吧 <?php echo '1'.print(2)+3; exit; ?>得出的opcode如圖: 行號、指令編號、腳本開始標記、結束標記、ZEND VM指令、返回值、ZEND VM指令對應的參數。 ZEND V

原创 MEMCACHED源碼之main初始化

一.啓動memcached 1.memcached啓動選項: -p TCP監聽端口 (default: 11211) -U UDP 監聽端口 (default: 11211, 0 is off) -s UNIX socket監聽路徑,不

原创 PHP內核之Apache的PHP模塊啓動

首先,我們必須知道所有的apache module都必須是這個結構體,其定義結構如下(以PHP模塊爲例): AP_MODULE_DECLARE_DATA module php5_module = { STANDARD20_MODULE

原创 PHP匿點之數組運算符+和array_merge區別

我們在平常寫代碼時候會經常對數組進行操作,當然少不了數組的合併操作。 在數組合並時候,我們通常會用到  數組運算符+   和  函數array_merge,對於 array_merge函數的底層實現邏輯前面文章已經介紹過了,這裏我們主要說