PHP开发实例大全(提高卷) 中文完整pdf扫描版[244MB]
一、php源码入口函数
php是由c语言开发的,既然是C语言,那么就必须有main()这样一个入口函数,而php是按照模式运行的
1. cgi模式下其入口函数在cgi_main.c
2. fpm模式下其入口函数在fpm_main.c
二、sapi服务器应用编程接口
php通过sapl提供了一组接口,供应用和php内核之间进行数据交互
我们通过Linux命令行执行一段PHP代码,本质是Linux的Shell通过PHP的SAPI传入一组参数,Zend引擎执行后,返回给shell,由shell显示出来的过程。同样的,通过Apache调用PHP,通过Web服务器给SAPI传入数据,Zend引擎执行后,返回给Apache,由Apache显示在页面上。
PHP提供很多种形式的接口,包括apache、apache2filter、apache2handler、caudium、cgi 、cgi-fcgi、cli、cli-server、continuity、embed、isapi、litespeed、milter、nsapi、phttpd pi3web、roxen、thttpd、tux和webjames。但是常用的只有5种形式,CLI/CGI(命令行)、Multiprocess(多进程)、Multithreaded(多线程)、FastCGI和Embedded(内嵌)。
php提供了一个函数查看当前sapi接口类型
string php_sapi_name(void);
php的运行和加载
无论使用哪种sapi,在php执行脚步前后,都包含一系列事件:module的init(mint)和shutdown(mshutdown),request的init(rint)和shutdown(rshutdown)。
第一阶段是php模块初始化阶段(mint),可以初始化扩展内部变量、分派资源和注册资源处理器,在整个php实例生命周期内,该过程只执行一次。
什么是php模块?在php中可以使用get loaded extensions函数查看所有编译并加载的模块/扩展,相当于cli模式下的php -m
以PHP的Memcached扩展源代码为例:
1. PHP_MINIT_FUNCTION(memcached) {
2. zend_class_entry ce;
3. memcpy(&memcached_object_handlers,zend_get_std_object_handlers(), sizeof(zend_object_handlers));
4. memcached_object_handlers.clone_obj = NULL; /* 执行了一些类似的初始化操作 */
5. return SUCCESS;
6. }
第二阶段,请求初始化阶段(rint),在模块初始化并激活后,会创建php运行环境,同时调用所有模块注册的rint函数,调用每个扩展的请求初始化函数,设定特定的环境变量、分配资源或者执行其他任务
PHP_RINIT_FUNCTION(memcached){
/*执行一些关于请求的初始化*/
return success;
}
第三阶段,请求处理完成后,调用PHP_RSHUTDOWN_FUNCTION进行回收,这是每个扩展的请求关闭函数,执行最后的清理工作。zend引擎执行清理过程、垃圾收集、对之前请求期间用到的每个变量执行unset。请求完成可能是执行到脚本完成,也可能是调用die()或exit()函数完成
第四阶段,php生命周期结束时候,PHP_MSHUTDOWN_FUNCTION对模块进行回收处理,这时每个扩展的模块关闭函数,用于关闭自己的内核子系统。
PHP_MSHUTDOWN_FUNCTION(memcached){
/*执行关于模块的销毁工作*/
UNREGISTER_INI_ENTRIES();
return SUCCESS;
}
转载请注明:谷谷点程序 » php扩展 php源码入口函数 cgi模式下其入口函数在cgi_main.c fpm模式下其入口函数在fpm_main.c