返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP简介(非常详细)
  • 261
分享到

PHP简介(非常详细)

phpapache服务器经验分享开发语言 2023-09-02 06:09:21 261人浏览 薄情痞子
摘要

PHP(Hypertext Preprocessor,超文本预处理器)是一种通用开源脚本语言,其语法吸收了C语言、Java 和 Perl 的特点,利于学习,使用广泛,主要适用于 WEB 开发领域。 php 独特的语法混合了 C、Java、P

PHP(Hypertext Preprocessor,超文本预处理器)是一种通用开源脚本语言,其语法吸收了C语言、Java 和 Perl 的特点,利于学习,使用广泛,主要适用于 WEB 开发领域。

php 独特的语法混合了 C、Java、Perl 以及 PHP 自创的语法,它可以比 CGI 或者 Perl 更快速地执行动态网页。

与其他的编程语言相比,PHP 是将程序嵌入到 html(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成 HTML 标记的 CGI 要高许多。

PHP 还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。

2015 年 6 月,官方发布了 PHP 7Alpha 1 版本,同年 12 月 3 日发布 GA 版本,PHP 7 的发布对于 PHP 来说是具有里程碑意义的。在性能上,PHP 7 的执行效率是原来 PHP 5 的两倍左右,和 HHVM 相当。

相对于 PHP 5.6.x,PHP 7 多了以下几个主要的新特性:

  • 提升性能:PHP 7 速度是 PHP 5.6 的两倍
  • 支持 64 位
  • 许多重大错误可以进行异常处理
  • 移除了旧的和不支持的 Sapis 和扩展
  • null 合并操作符(? ?)
  • 结合比较运算符(<=>)
  • 标量类型声明
  • 匿名类


当然,PHP 7 相对于以前的版本还有很多不同之处,但是大部分是兼容以前版本的,所以大多情况下无须修改代码就可以迁移到 PHP 7。

我们首先介绍 PHP 语言的优势、运行机制和原理,以及 PHP 7 的新特性,帮助读者对 PHP 有一个初步的认识。

PHP 语言的优势

PHP 语言主要有以下几点优势:

1) PHP 学习入门快、开发成本低,语法相对简单,并且提供了丰富的类库,如用于图像处理的 GD 库、各种加密扩展(如 OpenSSL 和 Mcrypt 等),可以很方便地直接使用。

很多库默认在安装 PHP 环境的时候都是自带的。

2) PHP 结合 linuxNginx 或 Apache、Mysql 可以方便快捷地搭建一套系统,PHP 还支持直接调用系统命令,这样便可以用代码完成许多操作 Linux 的工作,如打包压缩、复制粘贴、重命名、执行 Linux 中 grep 查询筛选等。

Nginx 是一个非常优秀的 Web 服务器软件,Nginx 可接收客户端请求,将 PHP 文件发送给 PHP 程序执行,Nginx 中的 PHP 采用 fastCGI 的形式运行脚本。

3) PHP 支持使用 mysql、MSsql、SQLite 等多种数据库,其中与 MySQL 的结合使用最为流行。

PHP 提供了3种连接 MySQL 的扩展,包括 MySQL 扩展、MySQLi 扩展和 PDO 扩展,其中:

  • MySQL 扩展在 PHP 5.5 及以后的版本中不再支持;
  • MySQLi 是 PHP 推出的专门用于链接 MySQL 的更加安全高效的扩展,并且提供了更高级的一些操作,完全支持面向对象
  • PDO 扩展是 PHP 推出的链接 MySQL 和其他类型的数据库的一种统一解决方案,可移植性很高,使用它可以灵活方便地切换不同类型的数据库,而不需变动更多的代码。


4) PHP 是解释执行的脚本语言,写完程序以后可以立即执行,不像 C、Java、c++ 等其他语言需要编译再执行,这使得 PHP 的开发效率更高。

5) PHP 中使用到的配置文件相对简单,与 PHP 运行有关的配置文件常用的有 php-fpm.conf 和 php.ini 两个,并且配置参数也简单易懂。

更改了 PHP 的配置文件不需要重新启动即可继续运行,因为 PHP 每次运行程序前都会主动加在配置文件中,这比 Java 等其他语言方便多了。

6) PHP 作为最流行、使用最为广泛的 Web 开发语言,有着丰富的生态圈,有许多著名的开源框架可供使用,例如:

  • 官方的 Zend Framework、CakePHP、Yaf、Symfony 等;
  • 开源论坛有 Discuz!、PHPwind 等;
  • 开源博客 WordPress;
  • 开源网店系统如 Ecshop、ShopEx 等;
  • 开源的 SNS 系统如 UCHome、ThinkSNS 等。


基于这些优秀的开源系统,你可以方便快速地搭建一套 Web 站点。另外,活跃的社区氛围也能帮助你快速解决开发中遇到的问题。

7) 结合 LVS 负载均衡消息队列、数据库主从等技术,PHP 能够支持一般大型网站的应用,满足绝大多数场景下的应用开发。

8) PHP 本身是由C语言开发的,在一些对性能有严苛要求的情况下,还可以使用C语言编写 PHP 的扩展来提升程序的执行速度,使用 PHP 完成主要业务的代码编写,使用C完成性能提升的需求,这使得可以保证软件开发效率的同时兼顾执行效率。

在这种对软件开发速度和程序执行性能有极致追求的情况下,如果是其他语言,可能会让你束手无策,或者推倒重来。

9) 国内的许多大公司,如百度、淘宝、360 等公司都广泛地使用 PHP 作为开发语言,在具体实践中已经取得了很大成功,有许多成功的经验可供借鉴。

PHP 的运行机制和原理

PHP 由内核 Zend 引擎和扩展层组成,其中:

  • PHP 内核负责处理请求、完成文件流错误处理等操作,Zend 引擎可以将 PHP 程序文件转换成可在虚拟机上运行的机器语言;
  • 扩展层提供一些应用层操作需要的函数类库等,比如数组和 MySQL 数据库的操作等。


Zend 引擎是用C语言实现的,将 PHP 代码通过词法语法解析成可执行的 opcode 并实现相应的处理方法、基本的数据结构内存分配和管理等,对外提供相应的可供调用的 API 方法。

Zend 引擎是 PHP 的核心,所有的外围功能都是围绕它实现的。扩展层通过组件的方式提供各种基础服务、内置函数,标准库都是通过它实现的。用户也可以编写自己的扩展来实现特定的需求。

服务端应用编程接口(Server Application Programming Interface,SAPI),通过一系列钩子函数使得 PHP 可以和外围交互数据。我们平时编写的 PHP 程序就是通过不同的 SAPI 方式得到不同的应用模式,如通过 WebServer 实现的 Web 应用和在命令行下运行的脚本等。

一段 PHP 程序被执行的时候会先被解析成 opcode 指令,然后在虚拟机中按顺序执行,由于 PHP 本身是用C语言开发的,所以其在执行的时候调用的都是C的函数。opcode 是 PHP 程序执行的最基本单位。

HashTable 是 Zend 的核心数据结构,实现了 PHP 里几乎所有的功能,支持 key->value 查询,添加删除的复杂度是 O(1),支持线性遍历和混合类型。

在 HashTable 中既有 key->value 形式的散列结构,也有双向链表模式,使得它能够非常方便地支持快速查找和线性遍历。

Zend 的散列结构是典型的 hash 表模型,通过链表的方式来解决冲突。

Zend 的 HashTable 是一个自增长的数据结构,当 hash 表数目满了之后,其本身会动态地以2倍的方式扩容并重新布置元素位置,初始大小均为 8。

另外,在进行 key->value 快速查找的时候,Zend 本身还做了一些优化,通过空间换时间的方式加快速度。比如在每个元素中都会用一个变量 nKeyLength 标识 key 的长度以做快速判定。

Zend HashTable通过一个链表结构实现了元素的线性遍历。理论上,做遍历使用单向链表就够了,使用双向链表的主要目的是为了快速删除链表元素,避免遍历。

PHP 是一门弱类型语言,本身不严格区分变量的类型。PHP 在声明变量的时候不需要指定类型。PHP在程序运行期间可能进行变量类型的隐式转换。和其他强类型语言一样,程序中也可以进行显式的类型转换。

Zval 是 Zend 中另一个非常重要的数据结构,用来标识并实现 PHP 变量。

Zval 主要由以下3部分组成:

  • Type:指定了变量所述的类型(整数、字符串、数组等);
  • refcount&is_ref:用来实现引用计数;
  • value:核心部分,存储了变量的实际数据。


Zval 用来保存一个变量的实际数据。因为要存储多种类型,所以 zval 是一个 uNIOn,也由此实现了弱类型。

引用计数在内存回收、字符串操作等地方使用得非常广泛。PHP 中的变量就是引用计数的典型应用。Zval 的引用计数通过成员变量 is_ref 和 ref_count 实现。通过引用计数,多个变量可以共享同一份数据,避免频繁复制带来的大量消耗。

在进行赋值操作时,Zend 将变量指向相同的 Zval,同时 ref_count++,在 unset 操作时,对应的 ref_count-1。只有 ref_count 为 0 时才会真正执行销毁操作。如果是引用赋值,Zend 就会修改 is_ref 为 1。

PHP 变量通过引用计数实现变量共享数据,当试图写入一个变量时,Zend 若发现该变量指向的 Zval 被多个变量共享,则为其复制一份 ref_count 为 1 的 Zval,并递减原 Zval 的 refcount,这个过程称为“Zval分离”。

可见,只有在有写操作发生时,Zend 才进行复制操作,因此也叫 copy-on-write(写时复制)。

对于引用型变量,其要求和非引用型相反,引用赋值的变量间必须是捆绑的,修改一个变量就修改了所有捆绑变量。

PHP 7 的新特性

相较于以前的版本,PHP 7 在语言语法层面和底层架构层面都有一些改进。

在语法层面的改进主要是增加了一些新特性、移除了一些扩展、改变了错误异常处理等。

在底层结构方面,改变了存储各种变量的 Zval 和 Zend_String 结构体、优化了 Zend Array 的 HashTable、改进了函数的调用机制等。这些底层结构的改进大幅提升了 PHP 的执行效率,使得其执行速度比 PHP 5 高出一倍左右。

PHP 是一个弱类型的语言,不过在 PHP 7 中支持变量类型的定义,引入了一个开关指令 declare(strict_type=1);。

这个指令一旦开启,就会强制当前文件下的程序遵循严格的函数传参类型和返回类型。

  • 不开启 strict_type,PHP 将会尝试转换成要求的类型;
  • 开启之后,PHP 不再做类型转换,类型不匹配就会抛出错误。


要使用严格模式,一个 declare 声明指令必须放在文件的顶部。这意味着严格声明标量是基于文件可配的。这个指令不仅影响参数的类型声明,还影响函数的返回值声明。

PHP 7 中的新特性主要有以下几点:

  1. 标量类型声明。
  2. 函数返回值类型声明。
  3. 新增 null 合并运算符。
  4. 新增组合比较符。
  5. 支持通过 define() 定义常量数组。
  6. 新增支持匿名类。
  7. 支持 Unicode codepoint 转译语法。
  8. 更好的闭包支持。
  9. 为 unserialize() 提供过滤。
  10. 新增加 IntlChar 类。
  11. 支持 use 语句从同一 namespace 导入类、函数和常量。
  12. 新增整除函数 intdiv()。
  13. session_start() 支持接收数组参数。

了解更多
除了以上列举的 13 点新特性之外,还有其他一些变更,读者可到 PHP: 新特性 - Manual 查看有关 PHP 7 新特性的详细变更和示例。

另外,在 PHP 7 中,很多致命错误以及可恢复的致命错误都被转换为异常来处理了。这些异常继承自 Error 类,此类实现了 Throwable 接口(所有异常都实现了这个基础接口)。

这也意味着,当发生错误的时候,以前代码中的一些错误处理的代码将无法被触发。因为在 PHP 7 版本中,已经使用抛出异常的错误处理机制了(如果代码中没有捕获 Error 异常,就会引发致命错误)。

在 2013 年的时候,惠新宸和 Dmitry(PHP语言内核开发者之一)就曾经在 PHP 5.5 的版本上做过一个 JIT(Just In Time,即时编译,一种软件优化技术)的尝试。

PHP 5.5 原来的执行流程是将 PHP 代码通过词法和语法分析编译成 opcode 字节码,然后 Zend 引擎读取这些 opcode 指令,逐条解析执行。

他们在 opcode 环节后又引入了类型推断(TypeInf),然后通过 JIT 生成 ByteCodes 再执行。

采用这种技术优化,PHP 的效率在实际项目中并没有取得明显的提升,于是他们重新设计了 PHP 的底层语言结构。

Zval 是存储 PHP 中变量的载体,是一个C语言实现的结构体(struct),PHP 5 的 Zval 在内存中占据 24 个字节,而在 PHP 7 中优化后的 Zval 只占 16 个字节,这样变量的存储变得非常简单和高效。

PHP 7 优化了数组的 HashTable 实现,PHP 5 的数组存储形式是一个支持双向链表的 HashTable,不仅支持通过数组的 key 来做 hash 映射访问元素,也能通过 foreach 以访问双向链表的方式遍历数组元素。

当我们通过 key 值访问一个元素内容的时候,有时需要3次的指针跳跃才能找对需要的内容。最重要的一点是,这些数组元素的存储是分散在各个不同的内存区域的,在 CPU 读取的时候,因为它们很可能不在同一级缓存中,导致 CPU 不得不到下级缓存甚至内存区域查找,从而引起 CPU 缓存命中下降,进而增加更多的耗时。

优化后的 Zend Array 最大的特点是整块的数组元素和hash映射表全部连接在一起,被分配在同一块内存中。如果是遍历一个整型的简单类型数组,效率会非常快,因为数组元素(Bucket)本身是连续分配在同一块内存里的,并且数组元素的 Zval 会把整型元素存储在内部,也不再有指针外链,全部数据都存储在当前内存区域内。当然,最重要的是它能够避免 CPU 缓存命中率下降。

另外,PHP 7 还改进了函数的调用机制,通过优化参数传递的环节减少了一些指令,提高执行效率。

来源地址:https://blog.csdn.net/Noah_ZX/article/details/129059859

--结束END--

本文标题: PHP简介(非常详细)

本文链接: https://lsjlt.com/news/390008.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PHP简介(非常详细)
    PHP(Hypertext Preprocessor,超文本预处理器)是一种通用开源脚本语言,其语法吸收了C语言、Java 和 Perl 的特点,利于学习,使用广泛,主要适用于 Web 开发领域。 PHP 独特的语法混合了 C、Java、P...
    99+
    2023-09-02
    php apache 服务器 经验分享 开发语言
  • 非常详细的 Ceph 介绍、原理、架构
    非常详细的 Ceph 介绍、原理、架构 1. Ceph架构简介及使用场景介绍 1.1 Ceph简介 Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。 Ceph项目最早起源于Sage就读博士期间的工作(最...
    99+
    2023-09-05
    ceph
  • Pandas教程(非常详细)
    文章目录 教程特点阅读条件 Pandas是什么Pandas主要特点Pandas主要优势Pandas内置数据结构 Pandas库下载和安装Windows系统安装Linux系统安装1) U...
    99+
    2023-08-31
    数据挖掘 数据分析 python
  • pytorch的安装(非常详细)
    文章目录 1.pytorch的安装1.1环境配置1.2创建pytorch文件夹(环境)1.3查看pytorch历史版本1.4接下来有一个小技巧1.4.1清华源:1.4.2中科大源: 1....
    99+
    2023-10-21
    pytorch python 深度学习
  • 较详细的JNI简介
    在Java中,有时候我们不得不要去使用其他语言的代码,比如说:你的应用需要访问系统的各个特性和设备,这些特性和设备通过java平台是无法访问的。你已经有了大量的测试过和调试过的用另一种语言编写的代码,并且知道如何将其导出到所有的目标平台上。...
    99+
    2023-05-31
    jni 简介 j
  • python入门教程(非常详细)
    Python是一种高级、解释性的脚本语言,其简单易学、灵活、强大等特点,使其成为了当代最流行的编程语言之一。如果您是想学习Python编程的新手,以下是详细的Python入门教程,以帮助您快速掌握Python编程基础。   安装Pytho...
    99+
    2023-09-24
    python 开发语言 前端
  • Python面向对象详解(非常详细)
    非常详细的讲解(爆肝1w字)👏🏻👏🏻👏🏻 零基础一样学得会👌🏻   干货满满不看后悔👍...
    99+
    2023-09-05
    python 算法 开发语言 pycharm 编辑器
  • 关于Redis的详细简介
    这篇文章主要介绍关于Redis的详细简介,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Redis的高并发和快速原因1.redis是基于内存的,内存的读写速度非常快;2.redis是单...
    99+
    2024-04-02
  • Oracle11g R2 安装教程(非常详细 )
    一般稍微大点的企业都在用 Oracle 数据库。而相较于 mysql 的语法有些差别,但还是值得去学习的 首先去官网下载 11g R2 的版本,这个版本相对来说还是比较流行的版本了。(好多公司也在用) 这边我已经下载好了: ...
    99+
    2020-07-06
    Oracle11g R2 安装教程(非常详细
  • MySql 安装与使用(非常详细)
    文章目录 前言一、安装MySql二、认识MySql数据库软件的文件结构三、MySql Shell的使用四、建立对MySql数据库的认知五、常见MySql指令1.数据库相关2.表相关3.数据相关...
    99+
    2023-10-20
    mysql 数据库 database
  • Centos7 防火墙配置详解(非常详细!)
    Centos7 防火墙配置详解(非常详细) 一. zone的概念1.1 预定义的zone1.2 将interface和source划分到某个zone1.3 zone配置文件 二. Service的概念2.1 service配置文...
    99+
    2023-08-19
    服务器 网络安全 centos
  • Python量化交易详细简介
    目录一、量化交易概述(algo-trading)1.历史评估2.效率3.没有任意的输入4.更高的频率二、交易系统1.回测-backtest2.交易所3.交易费一、量化交易概述(alg...
    99+
    2024-04-02
  • 总结ElasticSearch基本操作!非常详细!
    es下载地址IK分词器下载地址索引创建索引 对比关系型数据库,创建索引就等同创建数据库 PUT请求 http://127.0.0.1:9200/shopping查询索引 GET请求 http://127.0.0.1:9200/...
    99+
    2023-05-14
    ElasticSearch
  • MySQL性能压测工具SysBench详解(非常详细)
    概述 背景 最近需要给不同的客户部署数据库,各自的预算不一样,购买的服务器配置也不一样。那么我们就需要对其数据库的支撑能力进行一定测试,以保证满足业务真是的需要 数据库性能指标 指标英文含义说明QPSQuery Per Second数据库每...
    99+
    2023-08-18
    mysql 数据库 服务器
  • 全网非常详细的pytest配置文件
    目录更改默认命令行选项注册标记来防止拼写错误指定pytest的最低版本号指定pytest忽略某些目录指定测试目录更改测试搜索的规则python_classespython_files...
    99+
    2024-04-02
  • PHP Array 数组详细介绍
    目录前言语法定义数组 array()用方括号的语法新建/修改数组解包实用函数转换为数组前言 PHP 中的 array 实际上是一个有序映射。映射是一种把 values 关联到 key...
    99+
    2024-04-02
  • 非正版win7升级win11教程的详细介绍
    最近微软发布了windows11操作系统,对系统进行了大量的优化,并且对系统界面进行全新设计,图标也重新绘制,让用户在使用时视觉效果更佳。有的朋友对windows11非常感兴趣,今天小编来跟大家说说非正版win7升级win11教程的介绍,大...
    99+
    2023-07-17
  • Java非阻塞IO和异步IO的详细介绍
    这篇文章主要讲解了“Java非阻塞IO和异步IO的详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java非阻塞IO和异步IO的详细介绍”吧!阻塞模式 IO我们已经介绍过使用 Java...
    99+
    2023-06-02
  • python爬虫入门教程(非常详细),超级简单的Python爬虫教程
    一、基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序。 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT...
    99+
    2023-09-01
    python 爬虫 python爬虫 爬虫入门 python零基础
  • 【Python】pyqt6入门到入土系列,非常详细...
    写在前面 最近真的是运气不好,国庆前一天,隔壁小区有人中招了,结果国庆出不了门,好不容易国庆结束了,准备上班,结果小区又有个叼毛中招了,搞得我直接国庆放了半个月,还只能在家过,没事干只能这里写写,那里...
    99+
    2023-09-22
    python pyqt
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作