php中stream_get_wrappers函数学习笔记_自学php网
来源:自学PHP网
时间:2014-12-04 22:12 作者:
阅读:次
[导读] stream_get_wrappers (PHP 5) stream_get_wrappers 返回注册的数据流列表 Description array stream_get_wrappers ( void ) Returns an indexed array containing the name of all stream wrappers available on the running system. 在某次其他函...
stream_get_wrappers
(PHP 5)
stream_get_wrappers — 返回注册的数据流列表
Description
array stream_get_wrappers ( void )
Returns an indexed array containing the name of all stream wrappers available on the running system.
在某次其他函数的实现过程中需要知道url_stream_wrappers_hash变量的来源,
从而发现此函数也是从url_stream_wrappers_hash变量直接读取数据,
于是有了对于此函数和url_stream_wrappers_hash变量的跟踪过程。
首先在standard文件夹下的streamsfuncs.c文件中包含了此扩展的实现
其路径如下:
==>PHP_FUNCTION(stream_get_wrappers) // streamsfuncs.c 548行
==>#define php_stream_get_url_stream_wrappers_hash() _php_stream_get_url_stream_wrappers_hash(TSRMLS_C) // php_stream.h 552行
==>PHPAPI HashTable *_php_stream_get_url_stream_wrappers_hash(TSRMLS_D) // streams/streams.c 58行
==>static HashTable url_stream_wrappers_hash; // 全局静态变量,
从此函数的代码中我们可以看出它是直接遍历php_stream_get_url_stream_wrappers_hash()函数的返回值,生成一个字符串数组
php_stream_get_url_stream_wrappers_hash()函数
而函数直接调用全局变量中的数据,此变量初始化和注册过程跟踪如下:
url_stream_wrappers_hash初始化位置:
==>int php_init_stream_wrappers(int module_number TSRMLS_DC) // streams.c 1395行 初始化数据流
引用位置:
==> if (php_init_stream_wrappers(module_number TSRMLS_CC) == FAILURE) // main.c 1765行,初始化,注册数据流
添加默认注册的流程如下:
==> zend_startup_modules(TSRMLS_C); // main.c 1843行,添加注册数据流
==>zend_hash_apply(&module_registry, (apply_func_t)zend_startup_module_ex TSRMLS_CC); // zend_API.c 1519行
==>ZEND_API int zend_startup_module_ex(zend_module_entry *module TSRMLS_DC) // zend_API.c 1424行
==>if (module->module_startup_func) { // zend_API.c 1470行
==>PHP_MINIT_FUNCTION(basic) // basic_functions.c 3973行
==> php_register_url_stream_wrapper("php", &php_stream_php_wrapper TSRMLS_CC);
php_register_url_stream_wrapper("file", &php_plain_files_wrapper TSRMLS_CC);
php_register_url_stream_wrapper("data", &php_stream_rfc2397_wrapper TSRMLS_CC);
#ifndef PHP_CURL_URL_WRAPPERS
php_register_url_stream_wrapper("http", &php_stream_http_wrapper TSRMLS_CC);
php_register_url_stream_wrapper("ftp", &php_stream_ftp_wrapper TSRMLS_CC);
#endif
// basic_functions.c 4073行,添加过程
==>php_register_url_stream_wrapper // main/streams/streams.c 1450行
此次跟踪的时间跨度为一周,也算是经历几多磨难。但是最后总算是弄清楚其来源 |
|