运行原理  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.shtml

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

这下就全部清晰了。

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

PHP底层原理分析和底层扩展编写相关推荐

  1. MyBatis 动态 SQL 底层原理分析

    MyBatis 动态 SQL 底层原理分析 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" p ...

  2. 深入浅出学习透析Nginx服务器的架构分析及原理分析「底层技术原理+运作架构机制」

    Nginx再次回顾 也许你已经忘记了Nginx是做什么的?我来再次给你夯实一下概念. 多协议反向代理 Nginx是个高性能的Web和反向代理服务器及HTTP服务器,它能反向代理HTTP,HTTPS和邮 ...

  3. HashMap底层原理分析(put、get方法)

    1.HashMap底层原理分析(put.get方法) HashMap底层是通过数组加链表的结构来实现的.HashMap通过计算key的hashCode来计算hash值,只要hashCode一样,那ha ...

  4. java map原理_Java HashMap底层原理分析

    前两天面试的时候,被面试官问到HashMap底层原理,之前只会用,底层实现完全没看过,这两天补了补功课,写篇文章记录一下,好记性不如烂笔头啊,毕竟这年头脑子它记不住东西了哈哈哈.好了,言归正传,今天我 ...

  5. 【Docker篇】Docker的基本组成,底层原理分析

    文章目录 1. Docker的基本组成 1.1 Docker的架构图 1.2 几个名词解释 2. Run的执行原理 3. Docker底层工作原理 Docker官网: https://www.dock ...

  6. Spring 事务原理篇:@EnableTransactionManagement注解底层原理分析技巧,就算你看不懂源码,也要学会这个技巧!

    前言 学习了关于Spring AOP原理以及事务的基础知识后,今天咱们来聊聊Spring在底层是如何操作事务的.如果阅读到此文章,并且对Spring AOP原理不太了解的话,建议先阅读下本人的这篇文章 ...

  7. 底层原理_Spring框架底层原理IoC

    一.概述 Spring是一个轻量级的开源JavaEE框架 Spring可以解决企业应用开发的复杂性 Spring两大核心部分:IoC和AOP 特点: 方便解耦,简化开发 AOP编程支持 方便程序测试 ...

  8. 【MySQL】InnoDB行格式、数据页结构以及索引底层原理分析

    目录 一.MySQL架构图 二.InnoDB数据页结构 2.1 局部性原理 2.2 InnoDB的数据页格式 三.InnoDB的行格式 3.1 Compact行格式 3.1.1 变长字段长度列表 3. ...

  9. MyBatis动态SQL底层原理分析

    前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...

最新文章

  1. CV语义分割实践指南!
  2. arnold官方帮助文档_Baklib-随时编辑随时发布的在线帮助文档制作平台
  3. Spring Boot 实战 —— MyBatis(注解版)使用方法
  4. linux操作系统分析实验—基于mykernel的时间片轮转多道程序实现与分析
  5. 利用AI技术自动测试游戏
  6. Dart 2-Day
  7. 【计算机组成原理】课本总览
  8. 2013页面验证框架来袭。基于独创的vvc思想。还不知道的童鞋赶快围观吧!
  9. pythonide的作用_你知道Python神器IDE是什么吗?
  10. android 修改listview item view 的方法
  11. 【交换机在江湖】第十四章 VLAN通信篇
  12. ThreeJS 跨域
  13. Pytorch 微调(Fine-tuning)
  14. trouble processing xxxx.class: Ill-advised or mistaken usage of a core class (java.* or javax.*)
  15. HMS Core 5,面试必问知识点
  16. 科学计算机sd mode使用方法,你是否知道科学计算器的使用方法
  17. Opencv 原图像素坐标点透视变换后对应坐标点
  18. 云月VB代码格式化插件 1.0
  19. 计算机文化基础概括内容简介,计算机文化基础
  20. 【软件使用笔记】numeca软件使用经验

热门文章

  1. Visual Studio 内存泄漏检测方法
  2. ajax和Java session监听
  3. HTML5 新标签总汇
  4. springboot工程打包时将application.properties放在jar包外
  5. kali下生成web端后门
  6. 数据挖掘开源项目立项
  7. 快速构建Windows 8风格应用10-设备方向
  8. Kappa电商负责人顾皓澜:电商业务一直保持盈利
  9. SQL里的SWITCH分支语句
  10. C#:invoke 与 BeginInvoke使用区别