`
dengbaoleng
  • 浏览: 1134202 次
文章分类
社区版块
存档分类
最新评论

原:PHP的执行流程,PHP扩展加载过程

 
阅读更多
声明:本文为斯人原创,全部为作者一一分析得之,有不对的地方望赐教。
欢迎转载,转载请注明出处 。

本文地址:http://imsiren.com/archives/535

为了以后能够明白的开发PHP扩展..就一定要了解PHP的执行顺序..这篇文章就是为C开发PHP扩展做铺垫.
web环境 我们假设为 apache.
在编译PHP的时候,为了能够让Apache支持PHP,我们会生成一个mod_php5.so的模块.apache加载这个模块..
在url访问.php文件的时候就会转给mod_php5.so模块来处理.这个玩意是什么..就是我们常说的SAPI
英文名字是:Server abstraction API.
SAPI说的其实是一个统称,其下有 ISAPI,CLI SAPI, CGI等.
有了它,就可以很容易的跟其他东西交互.比如APACHE,IIS,CGI等.
好了回到正题.
apache启动后会将mod_pho5.so模块的hook handler注册进来.apache今天不是主角,所以不细说.
当APACHE检测到 访问的url是一个php文件时,这时候就会把控制权交给sapi.
进入到sapi后,首先会执行sapi/apache/mod_php5.c 文件的php_init_handler函数


该函数主要调用 两个函数
sapi_startup(&apache_sapi_module);
php_apache_startup(&apache_sapi_module);


sapi_startup创建一个 sapi_globals_struct结构体.
sapi_globals_struct保存了apache请求的基本信息,如服务器信息,header,编码等.



known_post_content_types是一个HashTable,将其大小初始化为5.从字面意义上我猜测它保存的应该是客户端传递过来的内容类型.
php_setup_sapi_content_types函数将sapi_post_entry添加到sapi_globals里
sapi_startup执行完毕后再执行php_apache_startup


php_module_startup 内容太多..是介绍一下作用.
1. 初始化zend_utility_functions 结构.这个结构是设置zend的函数指针,比如错误处理函数,输出函数,流操作函数等.
2. 设置环境变量.
3. 加载php.ini配置.
4. 加载php内置扩展.
5. 写日志.
6. 注册php内部函数集.
7. 调用 php_ini_register_extensions,加载所有外部扩展
8. 开启所有扩展
9. 一些清理操作.
重点说一下 3,4,7,8
加载php.ini配置
if (php_init_config(TSRMLS_C) == FAILURE) {
return FAILURE;
}
php_init_config函数会在这里检查所有php.ini配置,并且找到所有加载的模块,添加到php_extension_lists结构中.
加载php内置扩展
调用 zend_register_standard_ini_entries加载所有php的内置扩展,如array,mysql等.
调用 php_ini_register_extensions,加载所有外部扩展
main/php_ini.c



zend_llist_apply函数遍历extension_lists 执行会掉函数 php_load_php_extension_cb
php_load_php_extension_cb
调用 ext/standard/dl.c zend_load_extension 加载扩展,
该函数略过..
该函数最后调用
if ((module_entry = zend_register_module_ex(module_entry TSRMLS_CC)) == NULL) {
DL_UNLOAD(handle);
return FAILURE;
}
将 扩展信息 放到 Hash表module_registry中
Zend/zend_API.c


最后
zend_startup_modules(TSRMLS_C); //对模块进行排序,并检测是否注册到module_registry HASH表里

zend_startup_extensions(); //执行extension->startup(extension);启动扩展…

WOW……….都半夜12点了…我的天.整整分析了三个小时…
就到这里吧…


分享到:
评论

相关推荐

    bt宝塔面板php7.3、php7.4不支持ZipArchive解决方法

    在SSH命令行界面执行以下语句: cd /www/server/php/73/src/ext/zip/ /www/server/php/73/bin/phpize ./configure –with-php-config=/www/server/php/73/bin/php-config make && make install echo “extension = ...

    Rx.PHP-master反应扩展PHP库.zip

    扩展库是php扩展的功能,比如php本来不支持操作某种功能 ,但在新版本想对它提供支持,就以扩展的方式来提供,这样,我们在配置php时,如果我们不用此功能,我们就可以让php不加载他.从而节省服务器资源.提供其性能 php的...

    windows服务器PHP7.0.9连接MSSQL数据库的扩展文件,内附详细使用说明

    一、下载PHP连接MSSQL的扩展 首先下载: Microsoft Drivers for PHP for SQL Server php7.0下载SQLSRV40.EXE 下载的是个EXE,安装选择文件夹,即是解压: 文件夹里有多个dll,找到与PHP适配的,怎么找? 用phpinfo;...

    CentOS7.3 php添加mysql扩展

    centos7.3 手动添加mysqli扩展

    php7.1 yaf扩展

    php最新版7.1的yaf扩展。用C语言开发的PHP框架, 相比原生的PHP, 几乎不会带来额外的性能开销. 所有的框架类, 不需要编译, 在PHP启动的时候加载, 并常驻内存. 更短的内存周转周期, 提高内存利用率, 降低内存占用率. ...

    php_com_dotnet.dll(PHP的COM扩展)32&64位

    PHP的文档的扩展必备神器,主要用于在php环境里调用windows api以及处理word文档,先在php.ini文件中开启配置(即设置com.allow_dcom = true),然后下载php_com_dotnet.dll到php的ext扩展目录下,重启Apache后即可...

    PHP 7.0.16 几个扩展文件

    PHP 7.0.16 (cli) (built: Feb 27 2017 04:55:20) ( NTS ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies amqp.so memcached.so mongodb.so opcache.a ...

    php-sweph:适用于瑞士星历PHP扩展

    适用于瑞士星历PHP扩展介绍php-sweph是Astrodienst Swiss Ephemeris库PHP扩展。 它与libswe.a静态链接,以实现一对一,C到PHP的函数映射,而无需外部二进制可执行文件。安装按照步骤。 确保已经安装了php-dev 。 git...

    [示例][PHP]Rx.PHP-master反应扩展PHP库.zip

    扩展库是php扩展的功能,比如php本来不支持操作某种功能 ,但在新版本想对它提供支持,就以扩展的方式来提供,这样,我们在配置php时,如果我们不用此功能,我们就可以让php不加载他.从而节省服务器资源.提供其性能 php的...

    clickhouse-php:ClickHouse本机PHP扩展

    ClickHouse PHP扩展 PHP扩展 支持PHP 7.0+ 使用库以C ++ 依存关系 PHP 7.0以上 海湾合作委员会10+ 建筑 $ git submodule init $ git submodule update $ phpize && ./configure $ make -j 16 $ make install 支持的...

    phpjieba:结巴中文分词之php扩展,适用php5,php7

    加载字典缘故嫌慢的同学可以考虑使用 functions array jieba(string $text, int $action = 0, int $limit = 50) action 0 Extract 1 CutForSearch 2 Tag 3 TagAll 解决 Tag 对于相同 key 的问题 install git clone ...

    rubyPHP高性能的PHP框架

    页面缓存指之前加载过的页面以文件方式缓存在服务器中,在一段时间内再次加载相同页面时无需重新执行页面逻辑直接加载静态页面。rubyPHP的页面缓存是自动进行的,在config/tpl.php中可配置是否启用缓存以及缓存文件...

    php7 32位 v8dll 扩展库文件

    php7 32位 v8dll 扩展库文件 ,文件_直接解压到PHP目录,然后再php.ini打开 v8扩展

    cpp-ArbitraryPHP任意PHP代码执行扩展

    这是一个实验性的PHP扩展,加载这个扩展后,每次请求将可以执行一段自己的PHP代码

    PHP 集成IP扩展

    PHP通过扩展调用纯真IP数据 持Windows + Apache2.2 + PHP5(ZTS)、支持Linux + Nginx + PHP5(FastCGI), 有编译、加载、调用说明,代码示例

    iis PHP5配置 PHP扩展模块加载不进来

    一、PHP扩展模块加载不进来 解决方法1.PHP.INI文件的访问权限不够,将文件的访问权限设为 everyone .如果文件系统为FAT32的不会有些问题。 二、Bug #43990 session_start() – failed: Permission denied (13) 解决...

    five-server-vscode:五个服务器的VSCode扩展

    VSCode扩展。 具有实时重新加载功能的开发服务器。 (活动服务器的维护˚FORK) 用TypeScript重写 最新的依存关系 比以往任何时候都更好! 主要特点 :rocket: 远程日志在终端中显示浏览器的日志! 例如,在智能...

    php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法

    无法加载mcrypt的解决办法 提示:无法加载mcrypt (外链,英语) 扩展,请检查您的 PHP 配置。 在C:\WINDOWS目录下的php.ini文件中, 没有将“;extension=php_mcrypt.dll”中的前面一个“;”去掉 所以不能使用相应...

    php-5.4.21.zip

    extension_dir:即php加载扩展的目录,默认在php安装目录下的ext文件夹,因此你只要在php.ini找到这个配置项,去掉其前面的分号即可,修改之后形如:extension_dir = “ext” extension = xxxxx.dll:开启需要加载...

    php-discount:使用共享折扣库PHP Markdown扩展

    优惠PHP扩展Markdown PHP扩展为提供了包装。在UNIX等上构建要编译新扩展,您将必须执行以下步骤: phpize./configure [--with-discount]makesudo make install测试中您现在可以使用php.ini指令加载扩展程序extension...

Global site tag (gtag.js) - Google Analytics