我正在爲PHP編寫一個小的擴展。有沒有辦法在運行時知道正在運行的腳本文件的名稱(例如:test.php
)?也許一些全球或環境變量?從PHP擴展中獲取運行腳本的名稱
1
A
回答
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
0
我試過這個腳本,但它不適合我。第一條語句:
if (!zend_hash_exists(&EG(symbol_table), "_SERVER", 8)
失敗。我從CLI運行PHP。但是,我通過我的PHP腳本設置了變量,當我通過相同的腳本使用print_r($ _ SERVER)時,我得到了一組完整的值。
我認爲zend_hash_exists()
之前的否定在這種情況下是不必要的。
相關問題
- 1. 從擴展類中獲取類名稱
- 2. 如何獲得沒有擴展名的運行腳本的名稱
- 3. 使用PHP SOAP擴展從SOAP請求獲取參數名稱?
- 4. 在序言中獲取正在運行的腳本名稱
- 5. 從PHP腳本中獲取HTML文件的名稱
- 6. 從擴展運行方法擴展運行擴展運行
- 7. 如何獲取正在運行的Perl腳本的名稱
- 8. 如何在shell腳本中獲取文件的擴展名
- 9. 從文件名提取基本名稱和擴展名 - file.txt.1
- 10. 使用擴展腳本在After Effects項目中獲取合成名稱
- 11. 獲取PHP類擴展類的類名?
- 12. 需要什麼PHP擴展才能運行這個PHP腳本?
- 13. 如何在png/jpg擴展中運行php腳本
- 14. 從Mac OS X中的擴展塢運行腳本
- 15. 如何從網址獲取頁面名稱(不帶擴展名)
- 16. 從擴展方法中獲取原始變量名稱
- 17. 從URL獲取域名擴展名?
- 18. 如何從Chrome擴展中的內容腳本獲取變量?
- 19. Bash腳本獲取所需的擴展名的所有文件
- 20. 如何從擴展名運行時獲得解決方案名稱?
- 21. php:從損壞的文件中獲取文件擴展名
- 22. 獲取cronjob運行PHP腳本爲PHP5
- 23. 獲取Php文件/圖像擴展名
- 24. PHP,獲取文件名沒有擴展
- 25. 或擴展腳本中的運算符
- 26. 在Powershell中獲取腳本名稱
- 27. 擴展到包括jQuery腳本中的當前文檔名稱
- 28. 如何使用* .bat擴展名運行批處理腳本
- 29. 獲取基本映像名稱以擴展在JavaScript
- 30. Php從數組值中獲取文件擴展名
謝謝!這對我來說是一個很好的起點。 – dtoch 2012-08-20 06:35:52
謝謝你的這個片段:我試圖通過使用'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