PHP源码阅读笔记六:stream_get_wrappers函数

PHP源码阅读笔记stream_get_wrappers函数
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文件中包含了此扩展的实现
其路径如下:

1
2
3
4
==>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()函数

而函数直接调用全局变量中的数据,此变量初始化和注册过程跟踪如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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行

此次跟踪的时间跨度为一周,也算是经历几多磨难。但是最后总算是弄清楚其来源。

ubuntu9.10安装 备忘

ubuntu9.10安装 备忘

人生的意义在于折腾,生命不止,折腾不止
于是在体验了一把window7后,又把自己的开发环境换到了ubuntu下,安装完系统后安装一些常用软件及开发环境

1、安装kupfer: sudo apt-get install kupfer
2、终端命令 xfce下面是Alt+F2,输入 xfce4-terminal GNOME下也是Alt+F2,输入gnome-terminal
3、安装esvn:
sudo apt-get install esvn
4、安装nginx+php 移步:http://www.linuxidc.com/Linux/2008-07/14419.htm

QUOTE:
php-cgi: /usr/bin/php-cgi
php5-cgi: /usr/bin/php5-cgi
cgi config: /etc/php5/cgi/php.ini

conf: /etc/nginx/nginx.conf
bin:/usr/sbin/nginx
vhost: /etc/nginx/sites-enable/default
cgi-params: /etc/nginx/fastcgi-params

spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php-cgi
sudo /etc/init.d/nginx start

5、安装gvim : sudo apt-get install gvim
6、chm阅读器: sudo apt-get install chmsee (不支持索引查找,针对一些本身有乱码的,但是在window下可以正常查看的文件不能正常显示)

命令备忘:
1、sudo fdisk -l 查看磁盘信息(此处需要使用sudo,否则权限不够,不会看到任何信息)
2、mount -t vfat /dev/sda5 /media/windows -o codepage=936,iocharset=utf8

PHP源码阅读笔记五:array 数组的创建

PHP源码阅读笔记五:array 数组的创建

在PHP的调试环境中使用cli执行PHP文件
一步一步跟踪代码,由于对C和词法分析不熟悉
所使用PHP文件如下:

1
2
3
 <?PHP
$a = array(1, 2, 3);
var_dump($a);

代码简单跟踪如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
 
===>php_execute_script(&file_handle TSRMLS_CC);     //php_cli.c line1130
==> retval = (zend_execute_scripts(ZEND_REQUIRE TSRMLS_CC, NULL, 3, prepend_file_p, primary_file, append_file_p) == SUCCESS);    //    main.c 2023行
==> EG(active_op_array) = zend_compile_file(file_handle, type TSRMLS_CC);      //    zend.c 1126行
==> compiler_result = zendparse(TSRMLS_C);   //    zend_language_scanner.c  3420行
==> zend-language_parse.c     2773==>case 382:     { zend_do_init_array(&(yyval), &(yyvsp[(1) - (1)]), NULL, 0 TSRMLS_CC); }    //    zend_language_parser.c  4689行
    ==>void zend_do_init_array(znode *result, znode *expr, znode *offset, zend_bool is_ref TSRMLS_DC)    //    zend_compile.c 3348行
 
 
 
==>case 380:    { zend_do_add_array_element(&(yyval), &(yyvsp[(3) - (3)]), NULL, 0 TSRMLS_CC); }//    zend_language_parser.c  4684行
    ==>void zend_do_add_array_element(znode *result, znode *expr, znode *offset, zend_bool is_ref TSRMLS_DC)    //    zend_compile.c 3371行

在代码跟踪过程中,发现当PHP的源码生成语法树时,遇到array和第一个数字时是没有任何有关数组的操作的,当解析到1后面的逗号时才会调用zend_do_init_array函数,创建数组

以上只是一个跟踪的过程,对于代码没有解释,由于自身水平有限,对于词法分析和语法分析了解不多,
另:如果PHP程序的最后一行代码后面没有回车换行,在读取源码文件时会看到一堆乱码

待续…