1. 程式人生 > >php擴充套件獲取_ENV、_SERVER時踩到的坑。

php擴充套件獲取_ENV、_SERVER時踩到的坑。

最近寫個router元件,需要獲取SERVER這種超全域性變數。發現在symbool_table裡面死活拿不到,但是POST、GET的可以拿啊。。我就鬱悶了,最後看了下初始化流程。發現坑爹的就排除了SERVER和ENV這2變數的初始化在symbool_table裡面-。-。最後上了官網查到了這個,http://php.net/manual/en/ini.core.php#ini.auto-globals-jit
原理就是這樣,這2個變數不會初始化,只有使用的時候才有建立,也就是在jit使其初始化(JUST In Time)。像POST、GET、COOKIE這種,一個request_init就會初始化,放在symbool_tablel裡面。不管你用不用,反正它們就在那兒。。
想使用SERVER、ENV咋辦?建立唄,用這個方法建立:zend_is_auto_global,使用方式:zend_is_auto_global(ZEND_STRL(“_ENV”) TSRMLS_CC);這個方法的大致原理就是會根據_ENV這個變數來獲取相應的值並更新到全域性變數裡面,這個變數是http_globals,這是個陣列哈。通過PG巨集獲取後通過_ENV變數對應的內建巨集作為索引獲得相應的值,_ENV的對應的索引巨集是這個TRACK_VARS_ENV,具體在原始碼包裡面/main/php_globals.h裡面定義。

好了,到了這裡,你也知道咋回事了,並且怎麼獲取了這個值了。