2012-08-17 70 views

回答

4

(如果需要或其他任何$ _ SERVER變量),您可以獲取$_SERVER['PHP_SELF'],像這樣:

// This code makes sure $_SERVER has been initialized 
if (!zend_hash_exists(&EG(symbol_table), "_SERVER", 8)) { 
    zend_auto_global* auto_global; 
    if (zend_hash_find(CG(auto_globals), "_SERVER", 8, (void **)&auto_global) != FAILURE) { 
     auto_global->armed = auto_global->auto_global_callback(auto_global->name, auto_global->name_len TSRMLS_CC); 
    } 
} 

// This fetches $_SERVER['PHP_SELF'] 
zval** arr; 
char* script_name; 
if (zend_hash_find(&EG(symbol_table), "_SERVER", 8, (void**)&arr) != FAILURE) { 
    HashTable* ht = Z_ARRVAL_P(*arr); 
    zval** val; 
    if (zend_hash_find(ht, "PHP_SELF", 9, (void**)&val) != FAILURE) { 
     script_name = Z_STRVAL_PP(val); 
    } 
} 

script_name變量將包含腳本的名稱。

如果您想知道,初始化$_SERVER的第一個塊是必需的,因爲一些SAPI(例如:Apache處理程序)僅在用戶腳本訪問它(即時)時才初始化$_SERVER。沒有這段代碼,如果您在腳本嘗試訪問$_SERVER之前嘗試讀取$_SERVER['PHP_SELF'],您最終會得到一個空值。

很顯然,在任何失敗的情況下,您應該在上述代碼中添加錯誤處理,以便在嘗試訪問script_name時不會調用未定義的行爲。

+0

謝謝!這對我來說是一個很好的起點。 – dtoch 2012-08-20 06:35:52

+0

謝謝你的這個片段:我試圖通過使用'zend_auto_global_disable_jit'初始化'_SERVER',但不知何故它不工作。 這也幫助我確認了我在另一個問題中發現的東西:散列查找函數需要密鑰的大小,包括終止字符,而'disable_jit函數不是這種情況。 我在說的問題在這裏:http://stackoverflow.com/questions/1906565/php-extension-library-accessing-php-superglobals/1906804 – ravemir 2012-08-30 11:01:01

0

嘗試變量$argv。該數組中的第一項包含腳本的名稱。

EDIT

對於C的函數

int main需要兩個paramters argcargv(見here)。同樣如上所述。即argv[0]是命令名稱。

+0

對不起,我的意思是在C代碼中,而不是從PHP腳本。 – dtoch 2012-08-17 14:46:41

0

我試過這個腳本,但它不適合我。第一條語句:

if (!zend_hash_exists(&EG(symbol_table), "_SERVER", 8)

失敗。我從CLI運行PHP。但是,我通過我的PHP腳本設置了變量,當我通過相同的腳本使用print_r($ _ SERVER)時,我得到了一組完整的值。

我認爲zend_hash_exists()之前的否定在這種情況下是不必要的。

相關問題