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及芯片制造商联盟开发,视频电子标准协…

文治者必有武备不然长大了挨欺负_【博古斋·六月春拍】人文事者必有武备

原标题:【博古斋六月春拍】人文事者必有武备上海博古斋 2017年春季艺术品拍卖会6月24日 中国书画 文房雅玩6月25日 古籍善本文献资料上海大剧院八楼宴会厅(上海市黄陂北路200号A1门入口)图录已寄出,请各位藏友注意查收人文事者必有武备LOT 1649 武备志二…

@Transactional 使用

1 .添加位置 1)接口实现类或接口实现方法上,而不是接口类中。 2)访问权限:public 的方法才起作用。Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。 系统设计:将标签放…

SpringBoot集成JPA用法笔记

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

【转】有的共享软件赚了一百万美元,而为什么你没有?我的软件推广成功之路...

有的共享软件赚了一百万美元,而为什么你没有? 转自:http://blog.csdn.net/wangjiwei2010/article/details/1267044 译:DreamGoal 原作:Steve Pavlin 几个月以前,我决定对共享软件业进行一项非正式的长期研…

vue全局引入openlayers_vue中使用OpenLayers(一):引入谷歌地图

vue中使用OpenLayers(一):引入谷歌地图第一步npm install olpackage.json 中可以看到第二步引入import "ol/ol.css";import Map from "ol/Map";import Feature from "ol/Feature";import View from "ol/View";import XYZ f…

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

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

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

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

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

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

bootstrap.yml与application.properties区别?

1. bootstrap.yml先于application.properties被加载。 2. bootstrap.yml被Spring ApplicationContext的父类加载,这个类先于加载application.yml的ApplicatonContext启动。

hsv 明度的范围_色彩空间中的 HSL、HSV、HSB 有什么区别?

首先, HSB 和 HSV 是同一个东西,只是名称不同,本文后面仅使用 HSB,当提到它的时候,也代表 HSV。HSB 和 HSL 在字面意思上是一样的:H 指的是色相(Hue),就是颜色名称,例如“红色”、“…

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…

mysql换成oracle_从mysql转换到oracle数据库

最近做了几个项目,我对项目的要求(有些也是客户的要求)都是既要能用mysql数据库,又要能用oracle数据库,开发时尽量用mysql,等到发布时要求两者都能适应。因为两种数据库还是许多具体的应用有些不同,而我们开发中采用的…

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

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

UnityShader之Shader分类篇【Shader资料2】

关于ShaderLab,从我个人的理解上来看应该是分为三种类型。 1、Fixed function shader 固定渲染管线Shader,基于用于高级Shader在老显卡无法显示时的Fallback,使用的是ShaderLab语言,属于真正的ShaderLab语言,和我们平时…