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需要两个参数argcargv(见这里)。与上述情况相同。ieargv[0]是命令名称。

于 2012-08-17T14:43:09.553 回答
0

我试过这个脚本,但它对我不起作用。第一个声明:

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

失败。我正在从 CLI 运行 PHP。但是,我确实通过我的 PHP 脚本设置了变量,当我通过同一个脚本使用 print_r($_SERVER) 时,我得到了一个完整的值数组。

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

于 2015-07-04T02:11:13.570 回答