当前位置:首页 » 编程语言 » php底层

php底层

发布时间: 2022-12-18 14:03:30

‘壹’ 怎么理解【前台php,中间件用java,底层用C/C++】

通常来说,做一个中小型网站或Web应用不会用多种服务端语言环境。
根据你所需要的网站需求决定要使用的技术架构。

首先PHP不是WEB前台技术(HTML+CSS+JavaScript才是,PHP与Web前端关系不大,这一点很多人都搞不清楚),PHP也是服务端的,说前台PHP个人感觉描述不当,你可以说表层PHP更准确点。PHP是解释性语言,语言灵活、约束少、容错高,即使代码语法上写错了也未必影响整个网站的运行,适合实现低逻辑密度的业务处理。另外PHP的一些成熟框架也是支持插入中间件的。像博客、论坛、门户网站等适合用PHP实现。

Java是一门比较健壮的语言环境,强类型、半编译,可在运行时对自身代码进行认知(反射),Java作为开源热门,用Java编写的实用工具如海洋般广阔,所以利用Struts、Spring等成熟的JavaEE框架可以很方便地将这些工具作为中间层放置到Web应用当中。中间件通常是放置在原始服务端与客户端之间的一个处理层,可能是个程序,也可能是一个服务器(电脑),用于对原始数据进行进一步加工、筛选。Java十分适合制作业务逻辑比较复杂,对安全性、正确性与运行效率要求较高的网站或Web服务。像银行系统、支付平台、在线聊天、网页游戏等适合Java实现。

C/C++是目前大部分操作系统编写时所用的语言,所以用C/C++可以很轻易地接触到操作系统最底层的接口,C/C++很少用于网站或Web服务的开发。另外C/C++的编译是平台相关的,同时也是平台最优化的,所以在复杂数据结构、算法的处理能力上相较于其他语言有很大的优势。像大型网游的服务器可能由C/C++实现。

‘贰’ php依赖倒置原则里面,什么叫高层模块和底层模块

1、可以简单的理解:调用者为高层,被调用者为低层。
2、
比如你有class A和class B
在class A中有对class B的引用,例如A中有某方法有这样一段代码 B b=new B();var data=b.GetData();
那么class A就是高层模块
被引用的class B就是低层模块
当然这个B可以是class 也可以是interface

‘叁’ php底层原理 php是如何运行的

1、PHP动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),然后ZEND虚拟机顺次执行这些指令完成操作。PHP本身是用C实现的,因此最终调用的也是C的函数,实际上,我们可以把PHP看做一个C开发的软件。

2、PHP的4层运行体系:

(1)Zend引擎:Zend整体用纯C实现,是PHP的内核部分,他将PHP代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如:hashtable、OO)、内存分配机制及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。

(2)Extensions:围绕着Zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension的典型应用)。

(3)Sapi:Sapi全称,也就是服务端应用编程接口,Sapi通过一系列钩子函数,使得PHP可以和外围交互数据,这是PHP非常优雅和成功的设计,通过sapi成功的将PHP本身和上层应用解耦隔离,PHP可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。

(4)上层应用:这就是我们平时编写的PHP程序,通过不同的spai方式得到各种各样的应用模式,如何通过webserver实现web应用、在命令行下已脚本方式运行等等。

‘肆’ PHP做底层是否能够支撑庞大的流量群

统计ip,每次有用户访问页面都记录IP,如果在当天的ip数据中不存在此IP就写入数据库【一个ip一天只记录一次】
时间:用户登录时记录登录时间,以后用户每次连接数据库都更新最后在线时间,对这2个时间做比对,就是时间差,也就是在线时长

‘伍’ 深入了解php底层需要了解哪些语言

php 底层是C 语言,故如果想研究底层代码需要掌握C言语相关知识。
php 的zend引擎,包括词法分析,语法分析,AST 等需要掌握编译原理的知识。

‘陆’ PHP变量的底层实现

我们解压PHP的源码包, 看到如下的目录

其中,

最核心的---Zend目录, 这是zend虚拟的实现. 包括栈,数据类型,编译器等,都在这实现.

最主要的main --PHP的一些内建函数,最主要函数都在这里放着.

最大的一个目录ext -- PHP的扩展.

PHP的大部分功能,都是以extenstion形式来完成的.

如果你开发了一个扩展,也放在ext目录下.

Zend对变量的表示:

答: zend实现了 zval结构体

{

value: [联合体] ,联合体的内容可能是c语言中的long,double,hashtable...

type:变量类型 , IS_NULL,IS_BOOL,IS_STRING...... IS_RESOURCE

refcount_gc

is_ref_gc

}

如:

$a = 3;

{

value : [long lval = 3]

type: IS_LONG

}

$a = 3.5

{

value: [double dval = 3.5]

type:IS_DOUBLE

疑问:

PHP中有8种数据类型,为什么zval->value 联合体中,只有5种?

答:

1: NULL,直接 zval->type = IS_NULL,就可以表示,不必设置  value的值.

2: BOOL型 , zval->type = IS_BOOL, 再设置 zval.value.lval = 1/0;

3: Resourc型 ,资源型 往往是服务器上打开的一个接口,如果 文件读取接口.

zval->type = IS_RESOURCE, zval->tyoe.lval =服务器上打开的接口的编号

发现:

PHP中,字符串类型,长度是已经缓存的,调用strlen时,系统可以直接返回其长度,不必计算.

‘柒’ PHP简单的解释是什么意思

php是一种语言,编译和运行php语言程序的程序是用c语言写的。在和服务器并行提到PHP时,这个PHP不是语言的意思,而是指运行php语言的环境。在提到某个php页面时,这个php指的是以php为后缀的文件,称为php文件,php文件可以不包含php语言,但是php语言必须写在php文件中。php是一个多含义的词,不能使用教条来解释,而应该根据具体环境来解释。

‘捌’ 问个问题,java和php和javascript他们底层是不是都是c/c++编写的,都是c/c++上层语言

唔,他们的程序又不是编译成机器码了,还有Python Ruby Go也是。解释器都是用C/C++写的,其实也可以用某些其他语言。

‘玖’ php是用什么语言开发的,c语言吗

php的解释器是用c写的,解释器相当于弱编译器,但是php本身并不基于某种底层语言。

PHP在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。它驱动全球超过2亿多个网站,有全球超过81.7%的公共网站在服务器端采用PHP。PHP常用的数据结构都内置了,使用起来方便简单,也一点都不复杂,表达能力相当灵活。

(9)php底层扩展阅读

主要特点

(一)开源性和免费性

由于PHP的解释器的源代码是公开的,所以安全系数较高的网站可以自己更改PHP的解释程序。另外,PHP 运行环境的使用也是免费的。

(二)快捷性

PHP是一种非常容易学习和使用的一门语言,它的语法特点类似于C语言,但又没有C语言复杂的地址操作,而且又加入了面向对象的概念,再加上它具有简洁的语法规则,使得它操作编辑非常简单,实用性很强。

(三)数据库连接的广泛性

PHP可以与很多主流的数据库建立起连接,如MySQL、ODBC、Oracle等,PHP是利用编译的不同函数与这些数据库建立起连接的,PHPLIB就是常用的为一般事务提供的基库。

参考资料来源:网络-PHP

‘拾’ PHP 数组的底层实现

PHP 数组的底层主要是通过 HashTable 实现,HashTable 通过映射函数或者散列函数将 String Key 转换成一个普通的数字下标,然后再将 Value 值存储到下标对应的数组元素中

HashTable 主要包含两部分:1.存储元素的数组 2.散列函数或者映射函数

随机访问
如果我们指定一个 Key=>Value 的映射关系,Key 是一个 String 类型的,则先通过 Time 33 算法将 String 转换成一个 Int 整型,然后再通过 PHP 里面特定的散列算法映射成 Bucket 数组中的一个下标,将 Value 值存储到对应的下标元素中,当我们通过 Key 访问数组元素时,只需要再通过相同的算法计算出对应的 Key,就能实现随机访问数组元素

顺序访问
存储在 HashTable 中的数组是无序的,但是 PHP 中的数组是有序的,为了实现 HashTable 的有序性,PHP 引入了一个中间映射表,该表是一个大小和 Bucket 数组相同的数组,数组中存放的是整形数据,主要用于存放元素实际存储的 Value 的下标值,当引入中间映射表之后,Bucket 中的数据是有序的,而中间映射表中的数据是无序的,当我们顺序访问的时候只需要遍历 Bucket 中的数据即可

Hash 冲突
PHP 解决 Hash 冲突采用的是链地址法,将出现冲突的 Bucket 串成链表,这样通过中间映射表映射出来的就不再是一个元素而是一个链表,通过散列函数定位到对应的 Bucket 链表时,需要遍历链表,逐个对比 key 值,直至找出对应的目标值

PHP 实现扩容
1.当删除的元素所占比例超出阈值的时候,则需要移除已经被逻辑删除的 Bucket,将后面的 Bucket 补位到前面,因为 Bucket 的下标发生了变动,所以需要更新每元素在中间映射表中实际存储的下标值
2.当没有超出阈值的时候,PHP 会申请一个大小是原来两倍的新数组,并将旧数组中的数据复制到新数组中,因为数组长度发生了变化,所以 key->value 的映射关系需要重新计算,这个就是重建索引

热点内容
cf弹道脚本 发布:2025-01-26 15:36:40 浏览:54
我的世界花钱买的服务器 发布:2025-01-26 15:34:50 浏览:89
php环境部署 发布:2025-01-26 15:28:09 浏览:17
python实现svm 发布:2025-01-26 15:24:25 浏览:381
易语言写ip全局代理服务器 发布:2025-01-26 15:04:01 浏览:668
gm命令在哪个文件夹 发布:2025-01-26 15:03:12 浏览:307
javadate类 发布:2025-01-26 14:58:54 浏览:352
领航s1配置怎么样 发布:2025-01-26 09:58:10 浏览:763
公司局域网搭建服务器搭建 发布:2025-01-26 09:16:56 浏览:433
android裁剪圆形图片 发布:2025-01-26 09:05:56 浏览:411