PHP底层原理分析和底层扩展编写

运行原理  http://www.phpchina.com/article-40203-1.html

PHP底层开发 可以理解为就是C的开发,那么简单地说如果我们要查看某个PHP函数的底层实现怎么看呢?

需要PHP源码包:http://www.php.net/downloads.php

主要目录是Zend 和ext(写扩展的目录)
举个栗子,如果需要查看curl_exec(),如何查看。
我们知道curl_exec 是CURl扩展中的函数,那么源码目录大概是src/ext/crul/
然后我们发现 interface.c 下实现了 这个PHP方法:
部分源码如下:

PHP_FUNCTION(curl_exec)
{
    CURLcode    error;
    zval        *zid;
    php_curl    *ch;

    if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &zid) == FAILURE) {
        return;
    }

    if ((ch = (php_curl*)zend_fetch_resource(Z_RES_P(zid), le_curl_name, le_curl)) == NULL) {
        RETURN_FALSE;
    }

    _php_curl_verify_handlers(ch, 1);

    _php_curl_cleanup_handle(ch);

    error = curl_easy_perform(ch->cp);
    SAVE_CURL_ERROR(ch, error);
   
    if (error != CURLE_OK && error != CURLE_PARTIAL_FILE) {
        smart_str_free(&ch->handlers->write->buf);
        RETURN_FALSE;
    }

    if (!Z_ISUNDEF(ch->handlers->std_err)) {
        php_stream  *stream;
        stream = (php_stream*)zend_fetch_resource2_ex(&ch->handlers->std_err, NULL, php_file_le_stream(), php_file_le_pstream());
        if (stream) {
            php_stream_flush(stream);
        }
    }

    if (ch->handlers->write->method == PHP_CURL_RETURN && ch->handlers->write->buf.s) {
        smart_str_0(&ch->handlers->write->buf);
        RETURN_STR_COPY(ch->handlers->write->buf.s);
    }

   
    if (ch->handlers->write->method == PHP_CURL_FILE && ch->handlers->write->fp) {
        fflush(ch->handlers->write->fp);
    }
    if (ch->handlers->write_header->method == PHP_CURL_FILE && ch->handlers->write_header->fp) {
        fflush(ch->handlers->write_header->fp);
    }

    if (ch->handlers->write->method == PHP_CURL_RETURN) {
        RETURN_EMPTY_STRING();
    } else {
        RETURN_TRUE;
    }
}

这就是底层源码 了,但是我疑问的是 如果开发完扩展如何加入PHP包中生效,毕竟查看PHP Module包的时候只发现了一堆.dll文件,而且是非可读的码?呵呵,那是因为那是C被编译之后的文件。

那么来看一组干货:
windows下开发PHP扩展dll
http://www.360doc.com/content/14/0509/16/12091178_376141791.shtmlPHP底层原理分析和底层扩展编写

http://blog.csdn.net/evkj2013/article/details/52346792

这下就全部清晰了。

转载于:https://www.cnblogs.com/linewman/p/9918807.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬件知识:DP接口和HDMI接口对比,看完你就懂了

目录 一、DP接口 二、HDMI接口 三、总结 电脑显示器高清传输通过会用到两个接口,就是DP接口和HDMI接口,今天电脑学习小编带大家对比一下这两个接口。 一、DP接口 DisplayPort缩写DP,是一个由PC及芯片制造商联盟开发,视频电子标准协…

SpringBoot集成JPA用法笔记

今天给大家整理SpringBoot集成JPA用法。希望对大家能有所帮助!搭建SpringBoot项目新建配置文件 application.ymlserver: port: 8090 spring: #通用的数据源配置datasource: driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useSSLf…

显示器知识:分辨率1080P、2K、4K、8K相关知识介绍,看完你就懂了

现在各种电视和显示器都会出现4K、高清等字样。4K到底意味着什么呢? 它比超高清(Ultra HD)的像素还要多吗? 如果4K是1080p的四倍,那是否意味着4K就等于4320p? 以上三个问题按顺序回答:视情况而定;有时候是这…

c++大文本比较_Excel – 将文本转换为数值,第二种方法会的请举左手

工作中经常收到的数据是从系统直接导出的,有的数据看上去是数字,其实是文本格式。这种数字在 Excel 看来就是个文本,无法参与任何计算分析。所以首先就要把它们转换成真正的数值。案例:下图 1 中的 B、C 列均为文本格式&#xff0…

网络知识:整理各种路由器组网方法!网跨段也能访问

很多朋友问到,针对不同网段的两个电脑设备如何实现通信?这个通常在企业办公中会遇到,我们经常会遇到企业随着员工或部门的增多,增加了一个路由器,分了两个网段,A子网和B子网就处于不同网段,当网…

Java技术:serialVersionUID作用介绍

serialVersionUID概念介绍英文翻译的意思是序列化版本号。凡是实现Serializable接口的类都会有一个表示序列化版本标识符的静态变量。serialVersionUID的生成方式默认的1L:比如:private static final long serialVersionUID 1L; 。根据类名、接口名、成…

服务雪崩

假设存在如下调用链 而此时,Service A的流量波动很大,流量经常会突然性增加!那么在这种情况下,就算Service A能扛得住请求,Service B和Service C未必能扛得住这突发的请求。 此时,如果Service C因为抗不住…

华为的型号命名规则_华为交换机s2700系列命名规则

华为交换机s2700系列命名规则华为交换机s2700系列命名规则上一篇我们聊到S2700系列机型的命名规则方法。基于要满足不同用户的市场需求,S2700系列提供了多款机型。咱们就以S2700-26TP-PWR-EI、S2710-52P-SI-AC、S2700-52P-EI-AC以及S2700-9TP-SI为模板来讲解S2700系…

电脑技巧:Win10操作系统关闭这几个功能,可以大幅度提升电脑的运行速度

目录 一、禁用Cortana语音助手 二、关闭onedrive自动同步服务 三、关闭微软自带的Windows Search服务 四、关闭windows自动更新 五、清理缓存文件 六、减少不必要开机启动项 今天小编给大家介绍一下Win10操作系统需要关闭的几个功能,能让你的电脑飞速运转&#xff0…

硬件知识:视频分配器、画面分割器、矩阵、延长器相关知识介绍

目录 1、视频分配器 2、视频切换器 3、视频矩阵 4、画面分割器 5、延长器 你知道视频分配器,画面分割器,矩阵各自的作用都是什么吗?今天小编就为大家详细的介绍下它们各自的区别。 1、视频分配器 视频分配器是一种把一个源平均分配成多路视频…

mysql 交叉连接_MySQL教程77-CROSS JOIN 交叉连接

之间所讲的查询语句都是针对一个表的,但是在关系型数据库中,表与表之间是有联系的,所以在实际应用中,经常使用多表查询。多表查询就是同时查询两个或两个以上的表。在 MySQL 中,多表查询主要有交叉连接、内连接和外连接…

电脑常见的VGA、DVI、PS/2、USB等接口知识笔记

我们经常见到电脑和网络设备上都少不了VGA、DVI、PS/2、USB等常用接口,那些接口里面有多个针脚,他们每个针脚都有自己的用途,今天电脑学习小编就带大家一起看看这些接口神秘用途。 现在很多朋友们可能会遇到VGA线或HDMI线不够长,或…

数据库:MySQL、HBase、ElasticSearch三者对比

1、概念介绍 MySQL:关系型数据库,主要面向OLTP,支持事务,支持二级索引,支持sql,支持主从、Group Replication架构模型(本文全部以Innodb为例,不涉及别的存储引擎)。 HBas…

SpringBoot集成Mybatis用法笔记

今天给大家整理SpringBoot集成Mybatis用法笔记。希望对大家能有所帮助&#xff01;搭建一个SpringBoot基础项目。具体可以参考SpringBoot:搭建第一个Web程序引入相关依赖<dependencies><dependency><groupId>org.springframework.boot</groupId><ar…

网络知识:交换机中的半双工与全双工知识笔记

今天小编给大家分享一下交换机中半双工与全双工相关知识&#xff0c;希望对大家能有所帮助&#xff01; 早期的网络设备HUB&#xff08;集线器&#xff09;就是半双工&#xff0c;目前基本没有人用了&#xff0c;而现在用的SWITCH&#xff08;交换机&#xff09;就是全双工。 a…

硬件知识:U盘插入电脑没反应相关解决办法整理

目录 一、U盘可能被隐藏 二、USB端口被BIOS禁用 三、电脑的USB驱动可能有问题 今天小编给大家介绍一下U盘插入电脑没反应相应的解决方案&#xff0c;希望对大家能有所帮助&#xff01; 一、U盘可能被隐藏 首先换台电脑看看是不是U盘损坏的问题&#xff0c;如果不是&#xff0c;…