2012-08-17 43 views

回答

4

(如果需要或其他任何$ _ SERVER变量),您可以获取$_SERVER['PHP_SELF'],像这样:

// 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之前尝试读取$_SERVER['PHP_SELF'],您最终会得到一个空值。

很显然,在任何失败的情况下,您应该在上述代码中添加错误处理,以便在尝试访问script_name时不会调用未定义的行为。

+0

谢谢!这对我来说是一个很好的起点。 – dtoch 2012-08-20 06:35:52

+0

谢谢你的这个片段:我试图通过使用'zend_auto_global_disable_jit'初始化'_SERVER',但不知何故它不工作。 这也帮助我确认了我在另一个问题中发现的东西:散列查找函数需要密钥的大小,包括终止字符,而'disable_jit函数不是这种情况。 我在说的问题在这里:http://stackoverflow.com/questions/1906565/php-extension-library-accessing-php-superglobals/1906804 – ravemir 2012-08-30 11:01:01

0

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

EDIT

对于C的函数

int main需要两个paramters argcargv(见here)。同样如上所述。即argv[0]是命令名称。

+0

对不起,我的意思是在C代码中,而不是从PHP脚本。 – dtoch 2012-08-17 14:46:41

0

我试过这个脚本,但它不适合我。第一条语句:

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

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

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

相关问题