PHP 进化与高并发

40 篇文章 持续更新 Maksim

从 PHP 的运行模式、内核机制,到企业级高并发解决方案的完整实践系列。

  1. 1
    PHP的运行模式

    前言 首先说一下为什么要写这篇文章。 很多PHP开发者都是自学成才,当然我并不是说这种学习方式不好,恰恰相反我特别喜欢这种方式,因为我也是在2009年开始自学并且加入PHP开发者的行列,并且因此受益。 但也由于是自学,所以我知道PHP开发者可能会遇到什么样的问题,现在 PHP 的学习资料是比较充足的,但是在早些年,PH…

  2. 2
    PHP 目录常量自动区分操作系统

    在 ThinkPHP 中有一个常量 DS,用来标记目录,可以自动区分当前系统是 windows 还是 Linux,其底层使用的就是 PHP 自带的常量只不过是进行了简写。 DIRECTORYSEPARATOR(string) 目录分隔符,这是PHP内置的一个常量,代表着"/"或“” 因为系统原因,目录的分隔符被分为两种…

  3. 3
    PHP中的 $this

    TITLE: categories: PHP date: id: 1 当一个方法在类定义内部被调用时,有一个可用的伪变量 $this。$this 是一个到主叫对象的引用(通常是该方法所从属的对象,但如果是从第二个对象静态调用时也可能是另一个对象)。 $this 伪变量的示例 以上例程会输出: 由于静态方法不需要通过对象…

  4. 4
    PHP7 微信支付不能回调,让我们的团队损失1.00CNY。

    公司目前正在使用一套基于 TP5的开源商城,在线上测试过程中碰到了一个问题,微信支付完成后无法进行回调更新订单状态,简单点说就是钱没了,啥也没得到。 What?这可是一个无法容忍的错误。 原本以为是微信支付配置环节出了问题,于是便去查看微信官网给出的帮助手册,又顺着流程走了一边,信心满满的又测试了一边,结果尴尬了,又损…

  5. 5
    一本深入学习PHP内核的书 -《PHP internals Book》

    今天给大家介绍一本 PHP 扩展开发相关的书籍《PHP internals Book》,这本书是几个PHP开发人员之间的协作努力,可以更好地记录和描述PHP内部的工作原理。 《PHP internals Book》 有三个主要目标: 记录和描述PHP内部工作原理。 记录并描述如何使用扩展扩展语言。 记录并描述如何与社区…

  6. 6
    PHP 为什么要省略结束标签

    对于PHP编译器来说,脚本的结束标签?是可选的,在写程序时你可以忽略它。你或许碰见过:在使用include、require或输入输出缓冲函数时,页面顶部有时会多空行或者出现“header had send”之类的错误信息,这类问题与结束标签有关。 省略结束标签适合纯PHP文件。如果是PHP与HTML混合开发,则不可省略…

  7. 7
    PHP 中 emtpy、isset、is_null的区别

    PHP 提供了3个用于测试变量值的函数,分别是isset、empty、isnull(从这里就可以看出PHP系统函数变量名命名的混乱,这也是一直被人诟病的地方)。这几个函数均返回布尔值,有时使用不当会造成意想不到的结果。 比如,用isset和empty返回的结果是相反的,但却并非一直如此。 isset用来检测一个变量是否…

  8. 8
    企业级 PHP 高并发解决方案 0x00 起步

    高并发架构的相关概念 高并发的概念 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任意一个时刻点上只 有一个程序在处理机上运行。 上面这一段是摘自百度百科的一段话,但是上面的定义很明显不是我们通常所说的并发,在互联网时代,所讲的并发、高并发,通常是…

  9. 9
    企业级 PHP 高并发解决方案 0x01 Web资源防盗链

    盗链是指通过技术手段获得他人服务器上的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。常见的是小站盗用大站的图片、音乐、视频、软件等资源。 通过盗链的方法可以减轻自己服务器的负担,因为真实的空间和流量均是来自别人的服务器。 防盗链的工作原理 在 http 协议中,我们的每一次请求在 heade…

  10. 10
    企业级 PHP 高并发解决方案 0x02 减少 HTTP 请求

    为什么要减少HTTP请求 性能黄金法则: 只有10%20%的最终永不响应时间花在接收请求的HTML文档上,剩下的80%90%时间花在HTML文档所引用的所有组件(图片,script,css,flash等等)进行的HTTP请求上。 如何改善 改善响应时间的最简单途径就是减少组件的数量,并由此减少HTTP请求的数量。 HT…

  11. 11
    企业级 PHP 高并发解决方案 0x03 浏览器缓存和压缩优化技术

    HTTP 缓存机制 缓存分类 在HTTP缓存模型中,如果请求成功会有三种情况。 200 from cache 304 Not Modified 200 OK 200 from cache: 直接从本地缓存中获取响应,最快速,最省流量,因为根本没有向服务器发送请求I看到。 浏览器本身就有缓存机制,当我们浏览器检测到该资源…

  12. 12
    企业级 PHP 高并发解决方案 0x04 CDN 加速

    什么是CDN CDN 的全城是 Content Delivery Network,即内容分发网络,尽可能避开互联网上有可能影响数据传输速度和稳定性的平静和环节,是内容传输的更快、更稳定。 在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层只能虚拟网络,比如说我们现在有一个服务器的集群,现在在北京,有几台服务器…

  13. 13
    企业级 PHP 高并发解决方案 0x05 动态语言并发处理

    什么是进程、线程、协程 进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 进程的三态模型 进程的三态模型:多道程序系统中,进程在处理器上交替运行,状态不断地发生变化 运行:当一个进程在处理机上运行时,则称该进程处于运行状态。处于此状态…

  14. 14
    企业级 PHP 高并发解决方案 0x06 动态语言静态化

    什么是动态语言静态化 将现有 PHP 等动态语言的逻辑代码生成为静态HTML 文件,用户访问动态脚本重定向到静态 HTML 文件的过程。 如果页面中的的数据一直都在变化,那么不建议使用静态化。 为什么要静态化 动态脚本通常会做逻辑运算和数据查询,访问量越大,服务器压力越大。 访问量大的时候可能造成 CPU 负载过高,数…

  15. 15
    企业级 PHP 高并发解决方案 0x07 独立图片服务器的部署

    独立图片服务器的必要性 我们知道,无论对于Apache还是Nginx,图片始终是最消耗系统资源的,如果将图片服务和应用服务放在同一个服务器的话,应用服务器很容易会因为图片的 高I/O负载而崩溃,因此对于有些大型网站项目,我们有必要将图片服务器和应用服务器分离。 部署独立的图片服务器(甚至是服务器集群)是大型网站图片存储…

  16. 16
    企业级 PHP 高并发解决方案 0x08 数据库缓存

    什么是数据库缓存 MySQL 等一些常见的关系型数据库的数据都存储在硬盘当中,在高并发场景下,业务应用对 MySQL 产生的增、删、改、查的操作造成巨大的I/O开销和查询压力,这无疑对数据库和服务器都是一种巨大的压力,为了解决此类问题,缓存数据的概念应运而生。 使用数据库缓存可以极大的解决我们数据的压力,提高应用数据的…

  17. 17
    企业级 PHP 高并发解决方案 0x10 Web服务器负载均衡

    负载均衡,英文名称为 LoadBalance,其意思就是将负载工作任务进行平衡,分摊到多个操作单元上进行执行例如Web服务器、FTP服务器等,实现多个服务器共同完成工作任务的目标。负载均衡建立在现有网络结构之上,它提升了服务器的性能、提高了带宽利用率,增强了网络的灵活性和可靠性。 七层负载均衡的实现 基于URL等应用层…

  18. 18
    企业级 PHP 高并发解决方案 0x01 LNMP环境搭建

    企业级 PHP 高并发解决方案 0x01 LNMP 环境搭建 环境设置 在拿到新的服务器或者虚拟机的时候,我们首先需要保证我们的环境是被正确配置的,这样可以减少生产环境出现问题的概率,这篇文章主要是用来讲解 PHP 的环境搭建。 FQDN 设置(重要) FQDN(Fully Qualified Domain Name …

  19. 19
    Docker && PHP #1 使用 PHP 官方镜像运行第一个 PHP 程序

    目前 Docker 部署算是比较流行的方式,在传统方式搭建生产环境时候我们需要人工进行编译,我们可以利用 Docker 来简化这一步操作,直接拉取官方镜像。 这个镜像对于值运行 cli 程序来说镜像镜像有些太大了,镜像大就涉及到了拉取时间慢,而且占用磁盘资源,我们也可以选择 alpine 的版本,这是一个专门面向 do…

  20. 20
    Docker && PHP #2 多容器运行 Apache + PHP

    我们来继续利用 Docker 搭建 PHP,目前主流的 PHP 运行模式还是基于 FPM,那么在这节中,我们来使用 Dcoker 搭建 PHPFPM。 首先是下载镜像。 其体积只有 76M,我们在运行容器时候可以使用 d 让容器在后台运行。 接下来,我们安装 apache。 我们还是利用上一次我们编写的 Hello D…

  21. 21
    企业级缓存中间件分布式memcached

    1. 学习目标和内容 1、能够理解描述网站业务访问流程 2、能够理解网站业务的优化方向 3、能够描述内存缓存软件Memcached的作用 4、能够通过命令行操作Memcached 5、能够操作安装php的memcached扩展 extension 6、能够实现session存储到memcached的案例 7、能够实现启…

  22. 22
    PHP 利用 Redis List 数据结构实现消息队列

    Redis 本身是用来做缓存的,但是其中有一些特性是我们可以用来完成消息队列的功能,比如如果能够容忍数据的丢失,并且持久化方面要求不是很高的场景下完成任务的分布式处理。 队列的基本实现 Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),而我们取出的时候可以从头部…

  23. 23
    PHP 利用 Redis Sorted Set的延时队列

    延迟队列是我们在业务中经常遇到的场景,例如订单过期,定时发布,定时推送等等。 在 Zset里面,每一个成员都有一个所谓的分数:score,把当前时间作为分数,因为 Zset 是有序的,时间越小的排名越靠前。所以使用Zset作为延时队列就充分利用了score。 我们还是用订单例子来距离,如果订单超过 24 小时未付款,那…

  24. 24
    为高性能优化 PHP-FPM

    PHP 是无处不在的,可以说是互联网 Web 应用上使用最广泛的语言。 然而,它的高性能并不为人所知,尤其是在涉及到高并发系统时。这就是为什么对于这样特殊的用例,正在被 Node 是的,我知道,它不是一种语言、Go 和 Elixir 等语言接管。 也就是说,您可以做很多事情来改进服务器上的 PHP 性能。本文主要关注 …

  25. 25
    PHP 原生 Socket 网络编程:守护进程

    你好,我是一笑。 目前市面上有很多开源库其中包括 Swoole、Workman、ReactPHP、AmpPHP 都可以非常方便的帮助我们去实现 Socket 或者 WebSocket 编程,但是这些都是开箱即用的工具,在这个系列的文章中,我将从 0 到 1 实现一个网络在线聊天室。 PHP Cli 后台服务守护进程 S…

  26. 26
    PHP 原生 Socket 网络编程:TCP 网络编程基础

    你好,我是一笑。 在本节我们来介绍一些 socket 基础编程,其实 socket 基础编程非常的简单,你可以把它理解为文件描述符,每一个 socket 连接都是一个文件描述符,与我们打开文件、关闭文件是很类似的,只不过在其中增加了一些跟网络相关的 API 而已。 但是对于底层协议和基本原理还是很复杂的,我会放在后面的…

  27. 27
    PHP 原生 Socket 网络编程:通过fork实现高性能网络服务器

    你好,我是一笑。 在前面的两章中,我们已经实现了守护进程和基础的 TCP Server,在这个章节我们将实现高性能的网络服务,其实实现高性能网络服务有很多方法,在接下来的几个章节中,我将一一列举。 在我们上一节的代码中,如果你比较细心,就会发现当多个客户端连接服务其的时候是可以连接上,但是只有只有第一个连接到 tcp …

  28. 28
    PHP 原生 Socket 网络编程:Select 实现高性能网络服务器

    你好,我是一笑。 再上一篇文章中,我们使用 fork 的形式完成了高性能网络服务的开发,但是由于 fork 的形式开销比较大,我们需要使用另外一种方式来进行实现,也就是这篇文章中要讲解的 select。 相对来说 select 要比 fork 高效很多,而我们常说的 select 其实就是Linux 为我们提供的异步事…

  29. 29
    PHP 原生 Socket 网络编程:实现 Reactor 模型开发 Echo 服务

    更新日志: 2023320 增加文字描述 你好,我是一笑,在前面的章节中,我们实现了基于 select socket 开发,在这里,我们将利用 select 实现 Reactor模型。 Reactor 翻译过来的意思是「反应堆」,可能大家会联想到物理学里的核反应堆,实际上并不是的这个意思。 这里的反应指的是「对事件反应…

  30. 30
    企业级 PHP 高并发解决方案 0x09 MySQL优化

    在本文中,并没有实现过程,算是一个提纲,当我们需要对MySQL进行优化的时候,可以通过本篇文章,了解一下,我们要对MySQL进行哪些优化,也算是对MySQL的优化先要有一个总体的认知。 因为如果要将所有的操作过程都放到这篇文章中,估计还没等看完,你就已经睡着了,具体的操作,我会在其他系列的博文中陆续的更新出来。 优化方…

  31. 31
    企业级高并发 LNMP 解决方案目录

    大家好,我是一笑。 这个系列的博文是我曾经在慕课网学习时候的笔记内容,一转眼已经工作多年了,前段时间迁移博客,顺便把自己以前写的博文都看了一遍,感觉这个系列的内容其实还是可以重新编辑的,也算是对以前工作的一个总结。 当时只是作为笔记,并没有太多的实际操作部分,打算在这一次重写的时候把这一部分给补上。 目录 0x00 起…

  32. 32
    基于 yaf 的微服务解决方案 1:yaf 快速入门

    目前企业大多数都是使用微服务架构作为解决方案,在这里我们使用 yaf + yar 来作为基础实现一套企业级的微服务解决方案。 Yaf 是鸟哥开发的基于 C 语言扩展的高性能框架,而 yar 是一款 rpc 解决方案。 安装 yaf 最简单的安装方式: yaf 的 hello world 在正式开始之前,我们先来解决的代…

  33. 33
    goridge 高性能的 PHP-to-Golang RPC编解码器库

    Goridge 是 SpiralsCout 开源的高性能的 PHP 到 Golang 编解码器库。该库可以帮助你在 PHP 调用 Go 的服务方法。 Goridge 入门 使用方法: 我们先来编写简单的 Go 程序,目的就是提供一个 rpc 接口给 PHP 进行访问。 Hi 函数用来接受一个 name 入参。 PHP …

  34. 34
    PHP 进化史:Personal Home Page Tools 梦开始的地方

    Personal Home Page Tools 1.0.8 是我们在官网上能够下载到的最古老的版本,虽然这个时候也叫 PHP,但是和现在的 PHP 意思是完全不同的,下面这张图是在源代码中的截图。 PHP Tools Personal Home Page Tools 个人网站工具集,严格意义上来说,这个时候的 PHP…

  35. 35
    PHP 进化史:PHP/FI 2.0 真正的动起来

    Rasmus Lerdorf 还做一个叫做 Form Interpreter 的项目,可以轻松地将SQL查询嵌入到网页中。它基本上是另一个CGI包装器,可以解析SQL查询,并能在这些查询的基础上轻松创建表单和表格,Rasmus Lerdorf 最终将两个项目合并到了一起,将其合并成为了一个程序,也就是 PHP/FI。现…

  36. 36
    PHP进化史:PHP3 已经变成了一门语言

    1997年中PHP的发展也已经有了一些变化,他已经从Rasmus的宠物项目变成了更加有组织的团体项目。语法分析引擎也由Zeev Suraski 和 Andi Gutmans进行了重新改写,这个引擎构成了PHP3的基础。PHP/FI中的大部分通用代码都经过改写后引入了PHP3中。 目录结构上,PHP 越来越工程化。 se…

  37. 37
    PHP进化史:PHP4 Zend 引擎闪亮登场

    PHP4.0整个脚本程序的核心大幅更动,让程序的执行速度,满足更快的要求。在最佳化之后的效率,已较传统CGI或者ASP等程序有更好的表现。而且还有更强的新功能、更丰富的函数库。无论您接不接受,PHP 都将在 Web CGI 的领域上,掀起巅覆性的革命。对于一位专业的Web Master 而言,它将也是必修课程之一。 P…

  38. 38
    PHP进化史:PHP5 一个全新的时代

    2004年7月,PHP5正式版本的发布,标志着一个全新的PHP时代的到来。它的核心是第二代Zend引擎,并引入了对全新的PECL模块的支持。

  39. 39
    PHP进化史:PHP7 鸟哥 YYDS

    PHP7 最受关注的一点就是性能上面的提升。 还没开始写,打算用鸟哥的博客作为大纲,然后再写一些变更的细节。 大纲: https://www.laruence.com/?s=PHP7

  40. 40
    PHP进化史:PHP8 Jit 来了

    其实在 PHPng 的项目中就已经开始实现 jit 了,不过由于 PHP 的底层实现问题,使用 Jit 带来的收益并不大,于是就放弃了。