技术标签: php执行流程 php与二进制码 PHP php php 与Java
本文主要介绍PHP执行流程,目的是梳理php代码是如何最终转换成为机器二进制指令而被执行的
参考文章:https://blog.csdn.net/diavid/article/details/81035188
一. Scanning (Lexing) ,将PHP代码转换为语言片段(Tokens)
PHP4.2+开始提供了一个函数叫token_get_all ,这个函数就可以讲一段PHP代码 Scanning成Tokens
eg:
$code='<?php
$a = 1 + 1;
echo $a;
?>';
$tokens=token_get_all($code);
print_r($tokens);
exit();
输出结果:Array ( [0] => Array ( [0] => 379 [1] => 1 ) [1] => Array ( [0] => 382 [1] => [2] => 2 ) [2] => Array ( [0] => 320 [1] => $a [2] => 2 ) [3] => Array ( [0] => 382 [1] => [2] => 2 ) [4] => = [5] => Array ( [0] => 382 [1] => [2] => 2 ) [6] => Array ( [0] => 317 [1] => 1 [2] => 2 ) [7] => Array ( [0] => 382 [1] => [2] => 2 ) [8] => + [9] => Array ( [0] => 382 [1] => [2] => 2 ) [10] => Array ( [0] => 317 [1] => 1 [2] => 2 ) [11] => ; [12] => Array ( [0] => 382 [1] => [2] => 2 ) [13] => Array ( [0] => 328 [1] => echo [2] => 3 ) [14] => Array ( [0] => 382 [1] => [2] => 3 ) [15] => Array ( [0] => 320 [1] => $a [2] => 3 ) [16] => ; [17] => Array ( [0] => 382 [1] => [2] => 3 ) [18] => Array ( [0] => 381 [1] => ?> [2] => 4 ) )
返回的结果中, 源码中的字符串,字符,空格,都会原样返回。每个源代码中的字符,都会出现在相应的顺序处。而其他的比如标签,操作符,语句,都会被转换成一个包含俩部分的Array: Token ID (也就是在Zend内部的改Token的对应码,比如,T_ECHO,T_STRING),和源码中的原来的内容。
二. Parsing , 将Tokens转换成简单而有意义的表达式
Parsing首先会丢弃Tokens Array中的多余的空格,然后将剩余的Tokens转换成一个一个的简单的表达式
eg:
1. echo a constant string
2. add two numbers together
3. store the result of the prior expression to a variable
4. echo a variable
三. Compilation , 将表达式编译成Opocdes
Compilation阶段,它会把Tokens编译成一个个op_array,每个op_arrayd包含如下5个部分:
1. Opcode数字的标识,指明了每个op_array的操作类型,比如add,echo
2. 结果存放Opcode结果
3. 操作数1给Opcode的操作数
4. 操作数2
5. 扩展值1个整形用来区别被重载的操作符
注:PHP 5.5及以后自带opcache缓存拓展,在php.ini开启后可以对Opcode 进行缓存,这样每次有请求来临的时候,就不需要重复执行前面3步,从而能大幅的提高PHP的执行速度。
四. Execution , 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。
上面的opcode 指令并不是二进制的机器码,而是C实现php软件时定义的指令,最后指令的执行都得调用c语言实现的方法,而这些方法都是zendVM 提前实现,并经过编译成汇编,最后汇编再转换为目标机器的二进制码,这种方式叫解析执行,JVM解析执行java 二进制码也基本是这个逻辑;
另外,除了解析执行, jvm 跟zendvm(PHP 8后) 都实现了即时编译(Just-In-Time compilation,JIT),即将一个方法中包含的所有字节码编译成机器码后再执行,如下图;
最后贴上一个PHP 完整执行流程图
后语:从上面的流程看 php 如果开启opcache 整个执行流程应该跟java是差不多,但为啥大家都说java性能要比PHP 高很多呢?后面将会对java 为啥比php快做一个比较完整的分析;
今天在跑melgan时候,发现GPU使用率低的感人。。原本以为是pytorch的dataloader的问题之后把num_worker改为0,用主进程进行读取数据。发现主要卡在了librosa的load上from librosa.core import loaddata, sr =load('test.wav', sr=16000)做了个小测试如下:原来在libros...
先扯两句首先声明,这篇博客解决方案取自njtuzhang的ACTION_DOWN 和ACTION_POINTER_DOWN区别PS:大家可以直接通过链接跳转到原博客查看,不过先说一下,原文是纯英文的,小老儿我试了一下,chrome的原生翻译是没成功。。。先给大家展示个神器,叫Android知识点——目录,好了,闲言少叙,下面进入正题。##正文上一篇说到了触碰时间中关于坐标获取的部分——触...
au-signer推出了Linux系统命令行重签名ipa的程序适用于自动化签名的实现au-signer工具官网http://sign.applicationloader.net/命令行签名包括了用户登录管理、重签名ipa,应用管理,时间锁管理4部分功能!下面一一介绍1、用户登录管理登录命名行,先创建账号或者登录...
前端综合应用bootstrap-table表格神器bootstrap.min.js简单灵活可用于架构流行的用户界面和交互接口的html、css、javascript工具集。font-awesome.min.css基于css框架的网页字体图标库。layui.css国产开源前端UI,简单易上手,简洁美观。jquery-3.4.1.min.js轻量级的、兼容多浏览器的JavaScript库。popper.min.js轻量级的提示插件(弹层(框))。sweeta
利用MATLAB对遥感影像进行边缘检测(canny算子)把网上现有的代码整合了一下% 去噪声clear all;clc;[image,R] = geotiffread('text.tif');info = geotiffinfo('text.tif');image = rgb2gray(image);%真彩色图像RGB转换为灰度强度图像subplot(221);imshow(image);title('原始图像');image = double(image)/256;[m,n] =
作为一个多年老程序猿来说,竟然犯这么低级的错误实属不该啊!该狠狠抽自己打几个大嘴巴辣子。今天,我在审核同事代码的时候,Android studio 又开始耍脾气耍小性子了,突然又报错了:**Error:(1466, 21) No resource found that matches the given name: attr ’ android:layout_marginRight’.**如下图所示:**我也是纳闷了,前一秒钟都还能运行起来,这下就崩溃了?**关于这个错误,网上有很多说法,有的说是需要改
1、安装软件前要知道的 Quartus 和 ISE 目前业内用主要用的软件,如果你还没有软件安装包,我特地分享了下,我的百度云盘下载链接如下: 注意1:Quartus II 14.1是支持cyclone IV的最高版本了,从Quartus II 15开始,都不再支持cyclone IV系列的芯片了。 ISE 14.7目前已经是ISE的最高版本了,xilinx不再更新ISE了,I...
m1服务器地址 内容精选换一换Linux操作系统XEN实例变更为KVM实例前,必须已完成必要的驱动安装和配置。当您需要变更的Linux操作系统的XEN实例比较多时候,推荐您使用本节的批量自动配置的方法安装驱动,通过自动化脚本的方式批量为Linux云服务器安装驱动、配置磁盘自动挂载。在驱动安装完成后使用控制台提供的“变更规格”功能将XEN实例变更为KVM实例。XEN实例默认部署在VPC下的应用可以调...
选中信号,按H,可以查看信号路径双击信号:可追踪信号的驱动;波形区域点击信号,右键有个信号触发路径;看频率:按鼠标中键,调出一跟线,然后移动测区间,测出频率在上面;查看周期数:鼠标左键和滚动键选中区域,在波形左上角view-signal event report2021 2 22搜索总线信号值:首先选中信号变量对应波形,再选中bus value(如地址),再输入相应的值(如c7cc_0008),再点旁边的搜索箭头;(虚拟机上的寄存器文档,router这里说明了地址范围,后面再加上具体的模块
前言:从2015年谷歌将tensorflow开源后,这位用于深度学习的强大神器便把Caffe,Keras,Torch7等这一票人全部干掉,github上的star和fork是一路飙升,几乎是它们的总和,当然,我这里不是对谷歌的日常互舔,从发布博主就一直关注它的最新消息,并啃了原生英文版的官方API,感谢极客学院各位大佬将它翻译成了中文版,博主也及时的对照中文,将它又滋润了两遍,两遍下来...
来源:http://www.360doc.com/content/20/0613/14/49290572_918245894.shtml所谓开源,就是把软件的源代码开放出来,大家都能看到...
PRML第二章读书笔记