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

从PHP扩展获取正在运行的脚本的名称,php,c,php-extension,php-internals,Php,C,Php Extension,Php Internals,我正在为PHP编写一个小扩展。是否有办法在运行时知道正在运行的脚本文件的名称,例如:test.php?可能是一些全局或环境变量?请尝试使用该变量。该数组中的第一项包含脚本的名称 编辑 对于C函数 int main采用两个参数argc和argv,请参见。这一点仍然与上文相同。i、 e.argv[0]是命令名。请尝试使用该变量。该数组中的第一项包含脚本的名称 编辑 对于C函数 int main采用两个参数argc和argv,请参见。这一点仍然与上文相同。i、 e.argv[0]是命令名。如果需要,您

我正在为PHP编写一个小扩展。是否有办法在运行时知道正在运行的脚本文件的名称,例如:test.php?可能是一些全局或环境变量?

请尝试使用该变量。该数组中的第一项包含脚本的名称

编辑

对于C函数

int main采用两个参数argc和argv,请参见。这一点仍然与上文相同。i、 e.argv[0]是命令名。

请尝试使用该变量。该数组中的第一项包含脚本的名称

编辑

对于C函数

int main采用两个参数argc和argv,请参见。这一点仍然与上文相同。i、 e.argv[0]是命令名。

如果需要,您可以获取$\u SERVER['PHP\u SELF']或任何其他$\u 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变量将包含脚本的名称

如果您想知道,初始化$\u服务器的第一个块是必要的,因为某些SAPI,例如:只有当用户脚本及时访问$\u服务器时,Apache处理程序才会初始化它。如果没有这段代码,如果在脚本尝试访问$\u服务器之前尝试读取$\u服务器['PHP\u SELF'],那么最终将得到一个空值

显然,您应该在上述代码中添加错误处理,以防出现任何故障,这样在尝试访问脚本名称时就不会调用未定义的行为。

如果需要,您可以获取$\u SERVER['PHP\u SELF']或任何其他$\u 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变量将包含脚本的名称

如果您想知道,初始化$\u服务器的第一个块是必要的,因为某些SAPI,例如:只有当用户脚本及时访问$\u服务器时,Apache处理程序才会初始化它。如果没有这段代码,如果在脚本尝试访问$\u服务器之前尝试读取$\u服务器['PHP\u SELF'],那么最终将得到一个空值


显然,您应该在上面的代码中添加错误处理,以防出现任何故障,这样在尝试访问脚本名称时就不会调用未定义的行为。

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

如果!zend_哈希_存在&EGsymbol_表,_服务器,8

失败了。我正在从CLI运行PHP。然而,我确实通过我的PHP脚本设置了变量,当我通过同一脚本使用print\u r$\u SERVER时,我得到了一个完整的值数组


我认为zend_hash_存在之前的否定在这个上下文中是不必要的。

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

如果!zend_哈希_存在&EGsymbol_表,_服务器,8

失败了。我正在从CLI运行PHP。然而,我确实通过我的PHP脚本设置了变量,当我通过同一脚本使用print\u r$\u SERVER时,我得到了一个完整的值数组


我认为在zend_hash_存在之前的否定在这个上下文中是不必要的。

感谢这个片段:我试图通过使用“zend_auto_global_disable_jit”来初始化“_SERVER”,但不知何故它不起作用。这也帮助我确认了我在另一个问题中发现的东西:hash find函数需要密钥的大小,包括终止字符,而“disable_jit”函数则不是这样。我在这里讨论的问题是:感谢这段代码:我试图使用“zend\u auto\u global\u disable\u jit”初始化“\u SERVER”,但不知怎的,它不起作用。这也帮助我确认了我在另一个问题中发现的东西:hash find函数需要密钥的大小,包括终止字符,而“disable_jit”函数则不是这样。我刚才说的问题是: