PHP底层原理分析和底层扩展编写
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.shtml
http://blog.csdn.net/evkj2013/article/details/52346792
这下就全部清晰了。
转载于:https://www.cnblogs.com/linewman/p/9918807.html
PHP底层原理分析和底层扩展编写相关推荐
- MyBatis 动态 SQL 底层原理分析
MyBatis 动态 SQL 底层原理分析 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" p ...
- 深入浅出学习透析Nginx服务器的架构分析及原理分析「底层技术原理+运作架构机制」
Nginx再次回顾 也许你已经忘记了Nginx是做什么的?我来再次给你夯实一下概念. 多协议反向代理 Nginx是个高性能的Web和反向代理服务器及HTTP服务器,它能反向代理HTTP,HTTPS和邮 ...
- HashMap底层原理分析(put、get方法)
1.HashMap底层原理分析(put.get方法) HashMap底层是通过数组加链表的结构来实现的.HashMap通过计算key的hashCode来计算hash值,只要hashCode一样,那ha ...
- java map原理_Java HashMap底层原理分析
前两天面试的时候,被面试官问到HashMap底层原理,之前只会用,底层实现完全没看过,这两天补了补功课,写篇文章记录一下,好记性不如烂笔头啊,毕竟这年头脑子它记不住东西了哈哈哈.好了,言归正传,今天我 ...
- 【Docker篇】Docker的基本组成,底层原理分析
文章目录 1. Docker的基本组成 1.1 Docker的架构图 1.2 几个名词解释 2. Run的执行原理 3. Docker底层工作原理 Docker官网: https://www.dock ...
- Spring 事务原理篇:@EnableTransactionManagement注解底层原理分析技巧,就算你看不懂源码,也要学会这个技巧!
前言 学习了关于Spring AOP原理以及事务的基础知识后,今天咱们来聊聊Spring在底层是如何操作事务的.如果阅读到此文章,并且对Spring AOP原理不太了解的话,建议先阅读下本人的这篇文章 ...
- 底层原理_Spring框架底层原理IoC
一.概述 Spring是一个轻量级的开源JavaEE框架 Spring可以解决企业应用开发的复杂性 Spring两大核心部分:IoC和AOP 特点: 方便解耦,简化开发 AOP编程支持 方便程序测试 ...
- 【MySQL】InnoDB行格式、数据页结构以及索引底层原理分析
目录 一.MySQL架构图 二.InnoDB数据页结构 2.1 局部性原理 2.2 InnoDB的数据页格式 三.InnoDB的行格式 3.1 Compact行格式 3.1.1 变长字段长度列表 3. ...
- MyBatis动态SQL底层原理分析
前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...
最新文章
- CV语义分割实践指南!
- arnold官方帮助文档_Baklib-随时编辑随时发布的在线帮助文档制作平台
- Spring Boot 实战 —— MyBatis(注解版)使用方法
- linux操作系统分析实验—基于mykernel的时间片轮转多道程序实现与分析
- 利用AI技术自动测试游戏
- Dart 2-Day
- 【计算机组成原理】课本总览
- 2013页面验证框架来袭。基于独创的vvc思想。还不知道的童鞋赶快围观吧!
- pythonide的作用_你知道Python神器IDE是什么吗?
- android 修改listview item view 的方法
- 【交换机在江湖】第十四章 VLAN通信篇
- ThreeJS 跨域
- Pytorch 微调(Fine-tuning)
- trouble processing xxxx.class: Ill-advised or mistaken usage of a core class (java.* or javax.*)
- HMS Core 5,面试必问知识点
- 科学计算机sd mode使用方法,你是否知道科学计算器的使用方法
- Opencv 原图像素坐标点透视变换后对应坐标点
- 云月VB代码格式化插件 1.0
- 计算机文化基础概括内容简介,计算机文化基础
- 【软件使用笔记】numeca软件使用经验