php-5.6.26源代码 - PHP文件汇编成opcode、执行

 

文件 php-5.6.26/Zend/zend.c

ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_count, ...) /* {{{ */
{va_list files;int i;zend_file_handle *file_handle;zend_op_array *orig_op_array = EG(active_op_array); // 保存现场,操作码数组 zval **orig_retval_ptr_ptr = EG(return_value_ptr_ptr); // 返回值“指针”long orig_interactive = CG(interactive);va_start(files, file_count);for (i = 0; i < file_count; i++) { // file_handle = va_arg(files, zend_file_handle *); // 获取文件名(前置文件、主文件、后置文件)if (!file_handle) {continue;}if (orig_interactive) {if (file_handle->filename[0] != '-' || file_handle->filename[1]) {CG(interactive) = 0;} else {CG(interactive) = 1;}}EG(active_op_array) = zend_compile_file(file_handle, type TSRMLS_CC); // 编译PHP文件成操作码 op_code  , zend_compile_file == compile_fileif (file_handle->opened_path) {int dummy = 1;zend_hash_add(&EG(included_files), file_handle->opened_path, strlen(file_handle->opened_path) + 1, (void *)&dummy, sizeof(int), NULL); // included 的文件列表
        }zend_destroy_file_handle(file_handle TSRMLS_CC);  // 销毁文件句柄if (EG(active_op_array)) { // “操作码”数组EG(return_value_ptr_ptr) = retval ? retval : NULL;zend_execute(EG(active_op_array) TSRMLS_CC);  // 执行编译后的操作码 op_code  , zend_execute ==  execute_exzend_exception_restore(TSRMLS_C); // 还原异常if (EG(exception)) { // 检查异常if (EG(user_exception_handler)) { // 用户的异常处理器zval *orig_user_exception_handler;zval **params[1], *retval2, *old_exception;old_exception = EG(exception);EG(exception) = NULL;params[0] = &old_exception;orig_user_exception_handler = EG(user_exception_handler);if (call_user_function_ex(CG(function_table), NULL, orig_user_exception_handler, &retval2, 1, params, 1, NULL TSRMLS_CC) == SUCCESS) { // 调用用户的异常处理器if (retval2 != NULL) {zval_ptr_dtor(&retval2);}if (EG(exception)) {zval_ptr_dtor(&EG(exception));EG(exception) = NULL;}zval_ptr_dtor(&old_exception);} else {EG(exception) = old_exception;zend_exception_error(EG(exception), E_ERROR TSRMLS_CC);}} else {zend_exception_error(EG(exception), E_ERROR TSRMLS_CC);}}destroy_op_array(EG(active_op_array) TSRMLS_CC); // 迭代执行所有 zend_extensions 扩展的 zend_extension_op_array_dtor_handler 函数 
            efree(EG(active_op_array));} else if (type==ZEND_REQUIRE) {va_end(files);EG(active_op_array) = orig_op_array;EG(return_value_ptr_ptr) = orig_retval_ptr_ptr;CG(interactive) = orig_interactive;return FAILURE;}}va_end(files);EG(active_op_array) = orig_op_array; // 还原现场EG(return_value_ptr_ptr) = orig_retval_ptr_ptr;CG(interactive) = orig_interactive;return SUCCESS;
}
/* }}} */

 

转载于:https://www.cnblogs.com/xiaoyaogege/p/8628641.html

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

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

相关文章

java1a2b3c4d5e6f_用两个线程,一个输出字母,一个输出数字,交替输出1A2B3C4D...26Z...

用两个线程&#xff0c;一个输出字母&#xff0c;一个输出数字&#xff0c;交替输出1A2B3C4D...26Z方法一public class Test {static Thread t1 null, t2 null;public static void main(String[] args) {char[] aI "1234567".toCharArray();char[] aC "ABCD…

js如何设置浏览器全屏效果?

现在很多网页游戏进入游戏界面后都是全屏显示的效果&#xff0c;很多人问我这个要怎么实现&#xff0c;其实这个只要调用Fullscreen API就可以实现了作为一个比较新的 API&#xff0c;目前只有 Safari、Chrome 和 FireFox以及IE10以上的浏览器才支持该特性。因为尚未发布正式版…

6759: 异或序列

6759: 异或序列 时间限制: 1 Sec 内存限制: 128 MB题目描述 已知一个长度为n的整数数列a1,a2,…,an&#xff0c;给定查询参数l、r&#xff0c;问在al,al1,…,ar区间内&#xff0c;有多少子序列满足异或和等于k。也就是说&#xff0c;对于所有的x,y(l≤x≤y≤r)&#xff0c;满足…

Neo4j Java REST绑定–第2部分(批处理)

在第1部分中 &#xff0c;我们讨论了使用Java REST绑定建立与Neo4j Server的连接。 现在让我们详细了解事务&#xff0c;批处理以及REST请求的实际情况。确保org.neo4j.rest.logging_filter to true) as described in Part 1打开日志记录&#xff08;将系统属性org.neo4j.rest.…

selector简介

最近在学习java NIO&#xff0c;发现java nio selector 相对 channel ,buffer 这两个概念是比较难理解的 ,把学习理解的东西以文字的东西记录下来&#xff0c;就像从内存落地到硬盘&#xff0c;把内存中内容换成该知识点的索引。 在介绍Selector之前先明确以下3个问题&#…

java随机数排序算法_理解快速排序算法

快速排序在平均状况下&#xff0c;排序n个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n^2)次比较&#xff0c;但这种状况并不常见。事实上&#xff0c;快速排序通常明显比 其他Ο(n log n)算法更快&#xff0c;因为它的内部循环(inner loop)可以在大部分的架构上很有效率地…

开课吧视频内容汇总

1. 前端读取文件内容&#xff0c; FileReader对象 2. 用户联网状态 3. application/x-www-form-urlencoded 参数序列化 &#xff08;具体借鉴jquery的$.param方法&#xff09;&#xff0c;后端接收到的数据格式是 a[0][a] 1,并不会将其整理成对象或者数组 var nextStr ;funct…

PhantomJS宣布终止开发

由于没有人贡献代码&#xff0c;我很快就要把这个项目归档了。也许未来的某一天&#xff0c;我又想开发了&#xff0c;还会重新启动起来。既然决定停止开发了&#xff0c;那么自然地&#xff0c;PhantomJS 2.5 和原定的 PhantomJS2.1.x 就告吹了。对应的&#xff0c;这两个版本…

Servlet和JSP中的文件上传示例

使用Servlet和JSP将文件上传到服务器是Java Web应用程序中的常见任务。 在对Servlet或JSP进行编码以处理文件上传请求之前&#xff0c;您需要了解一点有关HTML和HTTP协议中文件上传支持的知识。 如果要让用户从文件系统中选择文件并上传到服务器&#xff0c;则需要使用<inpu…

20165312-第4周-课上内容补做以及知识点总结

20165312-第4周-课上内容补做以及知识点总结 1、课上内容补做 教材代码完成情况测试p45这题很快就做完了&#xff0c;然后忘记提交了。。就开始做递归。想起来的时候已经过了时间。 public class Example3_7 {public static void main(String args[]) {int sum0,i,j;for(i1;i&l…

java入门就是死敲代码吗_JAVA入门第二季综合练习(直接思考敲的代码,面向过程,不好)...

package com.imocc;/*author ndh2016年3月27日 21:03:02*/import java.util.Scanner;public class DiDi {public static void main(String[] args){Scanner sc new Scanner(System.in);System.out.println("欢迎使用迪迪租车系统&#xff01;");System.out.println(…

JavaScript实现表单的全选,反选,获取值

构思 通过for循环和for in循环来实现&#xff0c;界面效果如下 步骤 全选&#xff1a; 循环给所有的表单设置checked 反选&#xff1a; 循环内判断checked是否为true&#xff0c;如果为true则改为false否则改为true 获取值&#xff1a; 最开始用for取&#xff0c;但是只打印最后…

jQuery.extend() 使用语法详解

今天在写插件&#xff0c;使用$.extend({}, defaults, options)的时候发现漏写了 {}&#xff0c;浪费了一些时间&#xff0c; 所以详细记录下该方法的 API 和使用。API 如下&#xff1a;jQuery.extend( [ deep ], target, [ object1 ], [ objectN ] )描述&#xff1a;合并两个或…

EJB钝化和激活示例

在本教程中&#xff0c;我们将了解状态Java企业会话Bean中激活和钝化的工作方式。 1.简介 有状态会话Bean通常保存有关特定客户端的信息&#xff0c;并在整个会话中保存该信息。 但是&#xff0c;事实是&#xff0c;客户端会话往往会在相当长的时间内保持活动状态&#xff0c;…

Python进阶_面对对象面对过程

这节主要讲面对对象与面对过程两种编程思想的主要区别。 一. 简单对比 面向过程是一种基础的方法&#xff0c;它考虑的是实际的实现步骤&#xff0c;一般情况下&#xff0c;面向过程是自顶向下逐步求精&#xff0c;其最重要的是模块化的思想方法。 面向对象的方法主要是把事物给…

puppet 安装mysql_Puppet安装dashboard

Puppet安装dashboard安装依赖包[rootmaster ~]# sudo yum install -y mysql mysql-devel mysql-server ruby ruby-devel ruby-irb ruby-mysql ruby-rdoc ruby-ri启动mysql并设置开机启动[rootmaster ~]# service mysqld start [rootmaster ~]# chkconfig mysqld on下载并安装…

命令模式详解

原文链接:https://www.cnblogs.com/java-my-life/archive/2012/06/01/2526972.html 在阎宏博士的《JAVA与模式》一书中开头是这样描述命令&#xff08;Command&#xff09;模式的&#xff1a; 命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模…

JDK 8中几乎命名的方法参数

有时在Java中命名方法参数确实很不错&#xff0c;这看起来可能不会出现很长时间了&#xff0c;但是始终还有其他一些解决方法&#xff0c;例如使用构建器模式来获得类似的行为&#xff0c;这将为一点点。 在我看来&#xff0c;使用JDK 8中的Lambda支持可以使您获得非常接近的效…

深入解析jQuery中的延时对象的概念

首先我们需要明白延时对象有什么用&#xff1f;第一个作用&#xff0c;解决时序以及动态添加执行函数的问题。function a(){alert(1)};function b(){alert(2)};function c(){alert(3)};a();setTimeout(function(){b();},0);c();很明显函数执行顺序是a->c->b,而不是按照函…

c mysql5.7_CentOS7下MySQL5.7的三种安装方式详解

操作系统环境&#xff1a;CentOS 7.4最小化安装[rootnode3 src]# cat /etc/redhat-releaseCentOS Linux release 7.4.1708 (Core)[rootnode3 ~]# uname -r3.10.0-693.5.2.el7.x86_64[rootnode3 ~]#安装版本为&#xff1a;MySQL 5.7.20一、编译安装MySQL5.71、下载源码包[rootno…