我正在为PHP编写一个小的扩展。有没有办法在运行时知道正在运行的脚本文件的名称(例如:test.php
)?也许一些全球或环境变量?从PHP扩展中获取运行脚本的名称
1
A
回答
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
0
我试过这个脚本,但它不适合我。第一条语句:
if (!zend_hash_exists(&EG(symbol_table), "_SERVER", 8)
失败。我从CLI运行PHP。但是,我通过我的PHP脚本设置了变量,当我通过相同的脚本使用print_r($ _ SERVER)时,我得到了一组完整的值。
我认为zend_hash_exists()
之前的否定在这种情况下是不必要的。
相关问题
- 1. 从扩展类中获取类名称
- 2. 如何获得没有扩展名的运行脚本的名称
- 3. 使用PHP SOAP扩展从SOAP请求获取参数名称?
- 4. 在序言中获取正在运行的脚本名称
- 5. 从PHP脚本中获取HTML文件的名称
- 6. 从扩展运行方法扩展运行扩展运行
- 7. 如何获取正在运行的Perl脚本的名称
- 8. 如何在shell脚本中获取文件的扩展名
- 9. 从文件名提取基本名称和扩展名 - file.txt.1
- 10. 使用扩展脚本在After Effects项目中获取合成名称
- 11. 获取PHP类扩展类的类名?
- 12. 需要什么PHP扩展才能运行这个PHP脚本?
- 13. 如何在png/jpg扩展中运行php脚本
- 14. 从Mac OS X中的扩展坞运行脚本
- 15. 如何从网址获取页面名称(不带扩展名)
- 16. 从扩展方法中获取原始变量名称
- 17. 从URL获取域名扩展名?
- 18. 如何从Chrome扩展中的内容脚本获取变量?
- 19. Bash脚本获取所需的扩展名的所有文件
- 20. 如何从扩展名运行时获得解决方案名称?
- 21. php:从损坏的文件中获取文件扩展名
- 22. 获取cronjob运行PHP脚本为PHP5
- 23. 获取Php文件/图像扩展名
- 24. PHP,获取文件名没有扩展
- 25. 或扩展脚本中的运算符
- 26. 在Powershell中获取脚本名称
- 27. 扩展到包括jQuery脚本中的当前文档名称
- 28. 如何使用* .bat扩展名运行批处理脚本
- 29. 获取基本映像名称以扩展在JavaScript
- 30. Php从数组值中获取文件扩展名
谢谢!这对我来说是一个很好的起点。 – dtoch 2012-08-20 06:35:52
谢谢你的这个片段:我试图通过使用'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