可以去拜讀一下,分析得挺詳細的。自己再讀了一下源**,有了一些不同的心得,也順便寫下來。
首先要知道一點,$_get,$_post等變數的含義,即是在與web伺服器結合的情況下才會有的變數,在php源文夾的main目錄下面,有兩個文 件,php_variables.c,php_variables.h,從名字可以看出這主要是用來處理php的變數的一些定義及函式。
在標頭檔案中定義了乙個php_startup_auto_globals(tsrmls_d)函式,
main/php_variables.h
void php_startup_auto_globals(tsrmls_d);
在c檔案裡面最後幾行有這個函式的定義:
void php_startup_auto_globals(tsrmls_d)
很顯然是註冊了這幾個全域性變數。查詢一下 知道zend_register_auto_global函式在zend/zend_compile檔案裡面定義的,
int zend_register_auto_global(char *name, uint name_len, zend_auto_global_callback auto_global_callback tsrmls_dc)
主要是把這幾個變數註冊到_zend_compiler_globals結構體裡面的auto_globals雜湊表裡面.關於hashtable的介紹看昨天發表的一篇文章
zend hashtable詳解,結構體在zend/zend_globals.h裡面定義.另外cg巨集的定義如下:
# define cg(v) (compiler_globals.v),在zend/zend_globals_macros.h標頭檔案定義
好了,現在知道了startup_auto_globals的主要作用,那麼php是在什麼時候去呼叫這個函式的呢。利用一些工具的「在檔案中查詢」的功 能就很容易很找到這個函式出現在哪些檔案中。個人用慣了editplus,也有用visual studio。一搜就發現這個函式在main/main.c裡面被呼叫了,而且是在php_module_startup這個函式裡面呼叫的,在這個函式 裡面還做了很多其他工作,這些不是今天的內容暫時先跳過。從函式名中可以知道這個函式是在模組啟動的時候做的一些初始化工作,好,繼續尋找,這個函式是在 什麼地方被呼叫,再一搜出現了將近有20個結果,都是在sapi目錄下面出現的,比如在sapi/apache/mod_php5.c檔案裡 面,php_apache_startup這個函式呼叫了,作用也很明顯了,就是在php作為apache模組啟動時,php就去初始化這些變數。
深入理解zend sapis(zend sapi internals)
.
PHP變數的變數
什麼叫作變數的變數?根據php手冊,變數的變數是指取得乙個變數的值並把它作為另乙個變數的變數名。這表述顯得相當的直接,容易和那些在乙個句子中使用 變數 這個詞弄混淆。給乙個簡單的例子,你定義乙個變數 x 等於 this 然後定義乙個變數的變數,意味著你把 x 的值作為新變數的名,在這個例子中,這個新...
php傳送get post請求的幾種方法
方法1 用file get contents 以get方式獲取內容 url html file get contents url echo html 方法2 用fopen開啟url,以get方式獲取內容 fp fopen url,r 返回請求流資訊 陣列 請求狀態,阻塞,返回值是否為空,返回值htt...
php傳送get post請求的幾種方法
方法1 用file get contents 以get方式獲取內容 php view plain copy print?url html file get contents url echo html 方法2 用fopen開啟url,以get方式獲取內容 php view plain copy pr...