1

私はPHP用の小さな拡張機能を書いています。実行時に、実行中のスクリプト ファイルの名前 (例: test.php) を知る方法はありますか? たぶん、いくつかのグローバル変数または環境変数ですか?

4

3 に答える 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 に答える
0

変数$argvを試してください。その配列の最初の項目には、スクリプトの名前が含まれています。

編集

C の場合、関数

int mainは 2 つのパラメーターargcargv(ここを参照) を取ります。上記と同じことが引き続き当てはまります。ieargv[0]はコマンド名です。

于 2012-08-17T14:43:09.553 に答える