从PHP扩展获取运行脚本的名称

时间:2012-08-17 14:38:07

标签: php c php-extension php-internals

我正在为PHP编写一个小扩展。有没有办法在运行时知道正在运行的脚本文件的名称(例如:test.php)?也许是一些全球或环境变量?

3 个答案:

答案 0 :(得分: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(只是-in时间)。如果没有该代码块,如果您在脚本尝试访问$_SERVER['PHP_SELF']之前尝试阅读$_SERVER,则最终会得到一个空值。

显然,如果出现任何问题,您应该在上面的代码中添加错误处理,这样在尝试访问script_name时就不会调用未定义的行为。

答案 1 :(得分:0)

尝试变量$argv。该数组中的第一项包含脚本的名称。

修改

对于C函数

int main需要两个参数argcargv(请参阅here)。同样仍然如上所述。即argv[0]是命令名。

答案 2 :(得分:0)

我试过这个剧本,但它并不适合我。第一个声明:

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

失败。我从CLI运行PHP。但是,我确实通过我的PHP脚本设置了变量,当我通过相同的脚本使用print_r($ _ SERVER)时,我得到了一整套值。

我认为zend_hash_exists()之前的否定在这种背景下是不必要的。