Welcome to the website navigation,本站只接受合法正规的企业网站,欢迎站长们提交你的网站获得展示和流量有任何问题请联系站长,欢迎大家加入本站。

                
提交网站
  • 网站:76083
  • 待审:5
  • APP:577
  • 文章:304411
  • 会员:56004
文字内链包年1000元 文字内链包年1000元 文字内链包年1000元 AI办公网站 AI绘画工具 AIchat

名站导航为爱好php程序的朋友们提供php相关的教程知识。

这里将介绍引擎内部执行一个PhP程序脚本的流程,以CLI SAPI为例子来对流程中核心的部分做简单介绍,省去一些初始化及清理操作。I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

CLI(Command Line Interface)即PhP程序的命令行模式,现在此SAPI是默认安装的,我们在服务器上安装完PhP程序之后,一般会生成一个可执行文件,假设此文件为/usr/local/bin/php ,那么我们在ShELL下可以用以下命令来执行一个PhP程序脚本:I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

/usr/local/bin/php -f test.phpI3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

这个命令将执行当前目录下的test.php脚本,我们暂且不关心test.php具体内容,只关心一下这个执行的内部过程是怎么样的。I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

CLI的主源具体代码如下文件在{PhP程序SRC}/sapi/cli/php_cli.c,整个过程就从这个文件中的 main()函数执行,整个函数比较长,主要可以分为以下几个阶段:I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

解析命令行参数I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

初始化环境I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

编译执行PhP程序具体代码如下I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

清理环境并返回退出I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

在第1个阶段中,解析-f参数为执行一个PhP程序文件,-f后面的test.php就是需要被执行的文件。I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

这里我们将关注第3个阶段,如何执行test.php中的PhP程序具体代码如下。I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

最终是通过php_execute_script(&file_handle TSRMLS_CC)来执行PhP程序的脚本,这个函数定义在{PhP程序SRC}/main/main.c,原型为I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

PhP程序API int php_execute_script(zend_file_handle *primary_file TSRMLS_DC)  I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

file_handle的类型为zend_file_handle,这个是zend对文件句柄的一个封装,里面的内容就是和test.php相关的了。I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

php_execute_script最终是调用的zend_execute_scripts,这个函数定义在{PhP程序SRC}/Zend/zend.c,原型为:I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_count, ...)  I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

此函数具有可变参数,可以一次执行多个PhP程序文件,在此函数中最核心的是调用zend_compile_file和zend_execute,zend_compile_file是一个函数指针,其声明在{PhP程序SRC}/Zend/zend_compile.c:I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC);  I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

 在引擎初始化的时候,会将compile_file函数的地址赋值给zend_compile_file,compile_file函数定义在{PhP程序SRC}/Zend/zend_language_scanner.c,通过声明可以看到这个函数以zend_file_handle指针作为参数,返回一个指向zend_op_array的指针。I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

zend_execute也是一个函数指针,其声明在{PhP程序SRC}/Zend/zend_execute.c:I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

ZEND_API extern void (*zend_execute)(zend_op_array *op_array TSRMLS_DC);  I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

  同样在引擎初始化的时候,会将execute函数的地址赋值给zend_execute,execute的定义在{PhP程序SRC}/Zend/zend_vm_execute.h。I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

通过声明知道zend_execute以一个指向zend_op_array结构的指针作为参数,这个指针即前面zend_compile_file的返回值,zend_execute就开始执行op_array中的op code,在执行op code的过程中,就实现了PhP程序语言的各种功能。I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

到这里主要的执行工作基本就完成。I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

PS:为什么要把zend_execute和zend_compile_file定义为函数指针?I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

在引擎初始化(zend_startup)的时候,将zend_execute指向了默认的execute,zend_compile_file指向了默认的compile_file。我们可以在实际编译和执行之前将zend_execute和zend_compile_file重写为其他的编译和执行函数,这样就为我们扩展引擎留下了钩子,比如一个比较有名的查看PhP程序的op code的扩展vld(http://www.derickrethans.nl/projects.html#vld),此扩展就是在每次请求初始化的钩子函数(PhP程序_RINIT_FUNCTION)中,将zend_execute和zend_compile_file替换成自己的vld_execute和vld_compile_file,这两个函数其实是对原始函数进行了封装,添加了输出opcode信息的附加功能,因为引擎初始化是发生在模块请求初始化之前,而模块请求初始化又是在编译和执行之前,所以这样的覆盖能达到目的。I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

名站网址导航

PhP程序内核探索:变量概述I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

I3LAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

好了关于php程序的知识就说到这里希望可以帮助需要的朋友。,

标签:

分享到:

  admin

注册时间:

网站:0 个   APP:3 个  文章:0 篇

  • 76083

    网站

  • 577

    APP

  • 304411

    文章

  • 56004

    会员

赶快注册账号,推广您的网站吧!
文章分类
热门网站
最新入驻APP小程序

宝贝市场2023-02-08

宝贝市场——买手和卖家商品展示

夺宝助手2023-02-08

夺宝助手小程序,查看每日快夺宝平

查诚信2023-02-08

查诚信是一款免费的商业查询工具

车价天天报2023-02-08

快速连接汽车销售,获知汽车最新报

考勤助理小程序2023-02-08

上班签到考勤,实时定位,后台轻松

汽车报价大全查询2023-02-08

汽车报价大全查询提供最新汽车市