私はPHP用の小さな拡張機能を書いています。実行時に、実行中のスクリプト ファイルの名前 (例: test.php
) を知る方法はありますか? たぶん、いくつかのグローバル変数または環境変数ですか?
質問する
529 次
3 に答える
5
$_SERVER['PHP_SELF']
次のように、(または必要に応じて他の $_SERVER 変数を)取得できます。
// 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['PHP_SELF']
、スクリプトが にアクセスしようとする前に読み取ろうとする$_SERVER
と、空の値になってしまいます。
明らかに、何かが失敗した場合に備えて、上記のコードにエラー処理を追加して、にアクセスしようとしたときに未定義の動作を呼び出さないようにする必要がありますscript_name
。
于 2012-08-17T16:42:01.740 に答える