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

dto*_*och 1 php c php-extension php-internals

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

net*_*der 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

script_name变量将包含脚本的名称.

如果您想知道,初始化的第一个块$_SERVER是必要的,因为一些SAPI(例如:Apache处理程序)将$_SERVER仅在用户脚本访问它(即时)时初始化.如果没有该代码块,如果您$_SERVER['PHP_SELF']在脚本尝试访问之前尝试读取$_SERVER,则最终会得到一个空值.

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