PHP的多样化执行方式(parallel PHP多线程实现,原生协程实现,多进程实现,ZTS、NTS、TS又是什么)

进程、线程、协程

  • 进程:应用程序的启动实例,运行起的代码叫进程,有独立的内存空间,类比工厂的P个(P=1单进程,P>1多进程)车间。
  • 线程:线程是CPU调度的最小单位,是进程内的执行单元,多个线程共享所属进程的资源。类比车间内的T个员工(T=1单线程,T>1多线程)车间。
  • 协程:类似线程,协程是用户态(CPU受限执行用户程序指令),线程是内核态(CPU任意可在操作系统中任意执行任何指令)。通常在函数内部运行,并且可以在函数的不同部分之间暂停和恢复执行(最明显的特点就是协程不一定会跟着函数的return而结束,下次调用时能保留上调用时的状态)。

多进程、多线程怎么选?

做PHP的是几乎不用考虑的,毕竟不是C/C++这种偏底层适合做C/S或单Client的应用,PHP大多都是LAMP或LNMP的架构,结合Windows Server用IIS多线程的从来还没有遇见过。

  • 多进程适用场景:
    • CPU密集型任务:对于需要大量计算的任务,多进程可以充分利用多核处理器的优势,提高整体处理速度。
    • 独立性要求高:如果任务之间需要完全独立的内存空间和资源,避免相互影响,多进程是更好的选择。
    • 故障隔离:多进程能够提供更好的故障隔离性,一个进程崩溃不会影响其他进程,提高了系统的可靠性。
    • 跨平台兼容性:多进程在跨平台兼容性方面表现更好,因为不同操作系统有不同的线程实现,而进程模型更为统一。
  • 多线程适用场景:
    • I/O密集型任务:对于需要频繁进行I/O操作的任务,多线程能够更好地利用等待时间,提高系统的响应速度。
    • 资源共享:多线程适用于需要共享数据或资源的场景,能够更轻松地实现数据共享和通信。
    • 实时性要求高:多线程能够更快速地响应事件和处理任务,适合需要实时性的应用场景。
    • 内存消耗较低:线程间共享同一进程的内存空间,相比多进程消耗的内存较少。
    • GUI编程:图形界面程序通常需要不同的线程处理用户交互和界面更新,多线程能够提高界面的响应性和流畅性。

多线程实现

  • parallel:是适用于 PHP ≥ 7.2.0 的并行并发扩展。
  • 要求:自 parallel 1.2.0 起,要求 PHP ≥ 8.0.0,必须用ZTS版本(./configure时PHP7需要加–enable-maintainer-zts,PHP>=8需要加–enable-zts)
  • Github地址:https://github.com/krakjoe/parallel
  • 使用说明:https://www.php.net/manual/zh/intro.parallel.php
  • 下载地址:https://pecl.php.net/package/parallel
  • 应用场景:
    • 并行数据处理:对大量数据进行并行处理,如图像处理、视频处理、大规模数据分析等。
    • 网络请求并行处理:同时发送多个网络请求,例如同时请求多个API或网页数据,以提高数据获取速度。
    • 并行计算:执行需要大量计算的任务,如数值计算、科学计算等。
    • 并行爬虫:爬取网页数据时,可以利用并行处理提高爬取效率,加快数据采集速度。
    • 多任务调度:在需要同时执行多个任务的场景,可利用此扩展进行任务调度和执行,提高系统的并发处理能力。
  • 实操
cd /test
wget https://pecl.php.net/get/parallel-1.2.1.tgz
tar zxf parallel-1.2.1.tgz
cd parallel-1.2.1/
/usr/local/php/bin/phpize
./configure
make
make installvim /usr/local/php/etc/php.ini
extension=parallel

常规测试,输出@@@%%%,说明程序是从上到下依次执行的。

vim /test/a.php
<?php
for($i = 0; $i < 3; $i ++) {echo '@';
}for($j = 6; $j < 9; $j ++) {echo '%';
}

使用扩展执行

<?php
$runtime = new \parallel\Runtime();$future = $runtime->run(function(){for ($i = 0; $i < 25; $i ++)echo "@";return "result";
});for ($j = 0; $j < 25; $j ++) {echo "%";
}print_r($future->value());多次执行,效果是这样的,可见是多个线程交替执行。
%%%%%%%%%%%%%%%%%%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@result[root@localhost test]# php a.php 
@%%%%%%%%%%%%%%%%%%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@result[root@localhost test]# php a.php 
%%%%%%%%%%%%%%%%%%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@result[root@localhost test]# php a.php 
%%%%%%%%%%%%%%%%%%%%@%@@@@@@@@@@@@@@@%%@@@@@@@@@%%result[root@localhost test]# php a.php 
%%%%%%%%%%%%%%%%%%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@result[root@localhost test]# php a.php 
%%%%%%%%%%%%%%%%%%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@result[root@localhost test]# php a.php 
%%%%%%%%%%%%%%%%%%%%%%%%@%@@@@@@@@@@@@@@@@@@@@@@@@result[root@localhost test]# php a.php

原生协程实现

  • 说明:之前的文章就有用到,把9.7GB的文本数据,按照一行一条数据的方式导入数据库,如果一次性加载,内存过载会报错。
    所以就需要协程来帮忙,PHP的协程使用yield关键字来实现,在导入过程中,就用到了,协程不一定会跟着函数的return而结束,下次调用时能保留上调用时的状态的特点
  • 协程适用场景之一:万字详解PHP+Sphinx中文亿级数据全文检索实战(实测亿级数据0.1秒搜索耗时)
  • 示例:
    • 代码不多,就可以实现,就例如大名鼎鼎的单例模式,也没几行就能实现,概念指定的代码不在多少,在于解决的问题。
    • 如下:yield相当于return的返回之意,且不会中断,还能记住上次迭代的位置,所以输出的结果是0123456789。
<?php
function func() {$i = 0;while ($i < 10) {yield $i;$i ++;}
}$func = func();
foreach($func as $v) {echo $v;
}

多进程方式

  • 说明:最常见的执行方式,大部分企业都这种架构,不必过多演示。configure时需要添加–enable-fpm --with-fpm-user=www --with-fpm-group=www。与Nginx通信,通常使用php-fpm(php进程管理器)去实现多个进程。
  • 解决问题:
    • 提高并发量:请求量一上来,一个进程扛不住,就多个进程一起抗。
    • 进程隔离:PHP-FPM 可以实现进程隔离,一个进程的崩溃不会影响到其他进程,提高了系统的稳定性和可靠性。
    • 提高资源利用率:PHP-FPM 可以根据实际情况调整进程池的大小,以适应服务器负载的变化,从而更好地利用服务器资源,避免资源浪费。
ps aux | grep phproot      3511  0.0  0.3 172232  5936 ?        Ss   Mar17   1:20 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
www       4554  0.0  0.7 178812 14516 ?        S    15:13   0:01 php-fpm: pool www
www       4555  0.0  0.7 178812 14444 ?        S    15:13   0:01 php-fpm: pool www
www       4556  0.0  0.7 178812 14500 ?        S    15:13   0:01 php-fpm: pool www
www       4596  0.0  0.7 178812 14496 ?        S    15:14   0:01 php-fpm: pool www
www       4597  0.0  0.7 178812 14556 ?        S    15:14   0:01 php-fpm: pool www

ZTS、NTS、TS版本的区别

  • ZTS:指的是 PHP 的线程安全版本。PHP ZTS 版本中的核心功能被修改和重新编写,以确保在多线程环境下能够安全地运行。这样,开发人员就可以在需要在多线程环境中运行 PHP 脚本时,选择使用 PHP ZTS 版本来提高线程安全性和稳定性。
    总的来说,PHP ZTS(Zend Thread Safety)是 PHP 的线程安全版本,专门设计用于在多线程环境下提供更好的线程安全性和稳定性。

  • TS:多线程访问时,采用了加锁机制,当一个线程访问某些数据时进行保护,其它线程不能进行访问,直到该线程读取完,其它线程才可使用。主要是针对windows系统iis运行的情况,如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本。因为windows申请进程开销较大,所以windows主要以多线程方式运行PHP,这时候需要线程安全的版本。

  • NTS:linux下,PHP使用多进程方式运行,所以可以选择nts版本。
    ISAPI全称Internet Server Application Programming Interface,是一种微软Windows平台下的Web服务器扩展技术。它允许开发者编写动态网页应用程序并直接运行在Web服务器上,可以与Web服务器(如IIS)直接交互,提供更高效的性能和更灵活的功能扩展。通过ISAPI,开发者可以使用C++、Delphi等语言编写高性能的Web应用程序。

  • 如果要开多线程:ZTS优于TS优于NTS。

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

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

相关文章

面向对象-----继承

前面向大家介绍了面向对象中的封装性&#xff0c;今天再来向大家介绍面向对象的继承和多态的两大特性。 1.继承 1.1 为什么需要继承&#xff1f; 在java语言中&#xff0c;我们用类来描述世间万物&#xff0c;虽然万物非常复杂&#xff0c;但总有一些共同点&#xff0c;如果…

CAD2023 2024 2025以上版本出现无法运行 AutoCAD,原因可能如下1) 此版本的 AutoCAD 安装不正确

错误提示如下 此版本的 AutoCAD 安装不正确 缺少依赖组件Microsoft Edge webview2 Runtime 缺少依赖组件 Microsoft.NET跟You must install .NET Desktop Runtime 打开autoremove&#xff0c;点击扩展&#xff0c;输入 无法运行&#xff0c;点击搜索 你的软件属于什么版本…

fork 与 vfork 的区别

关键区别一&#xff1a; vfork 直接使用父进程存储空间&#xff0c;不拷贝。 关键区别二&#xff1a; vfork保证子进程先运行,当子进程调用exit退出后&#xff0c;父进程才执行。 我们可以定义一个cnt&#xff0c;在子进程中让它变成3&#xff0c; 如果使用fork&#xff0c;那…

PHP 7.4开始 调用方法success()可根据参数名称来指定参数值uccess(data: $list, count: $count)

定义了方法&#xff1a; static function success(int $code200,string $msgok,array $data[],int $count0,int $pages1){return [code>$code,msg>$msg,data>$data,count>$count,pages >$pages]; } 引用&#xff1a;(不用按顺序) return self::success(data:…

【LeetCode】【1】两数之和(1141字)

文章目录 [toc]题目描述样例输入输出与解释样例1样例2样例3 提示进阶Python实现哈希表 个人主页&#xff1a;丷从心 系列专栏&#xff1a;LeetCode 刷题指南&#xff1a;LeetCode刷题指南 题目描述 给定一个整数数组nums和一个整数目标值target&#xff0c;请在该数组中找出…

【Vue3进阶】- Vite 配置

视频 Vite 配置 基础配置项 server 选项 本地运行时&#xff0c;开发环境服务器的配置。 host 默认 localhost&#xff0c;设置为 true 或 0.0.0.0 时会监听所有地址&#xff0c;让局域网内的设备进行访问&#xff0c;否则只有本机能访问项目。 open 默认 false&#x…

C#如何通过反射获取外部dll的函数

在C#中&#xff0c;你可以使用反射&#xff08;Reflection&#xff09;来加载外部的DLL&#xff08;动态链接库&#xff09;并获取其中的函数&#xff08;在C#中通常称为方法&#xff09;。但是&#xff0c;请注意&#xff0c;反射主要用于访问类型信息&#xff0c;并且对于非托…

Apache 平滑升级:逐步指南与示例

在维护Web服务器时&#xff0c;Apache的平滑升级是一项重要的操作&#xff0c;它可以确保服务在升级过程中继续对外提供服务&#xff0c;最小化或无需停机时间。本文将详细介绍如何在Linux系统中平滑升级Apache HTTP服务器&#xff0c;提供一个完整的操作示例&#xff0c;并说明…

Typora+PicGo+Gitee设置图床,解决CSDN上传markdown文件图片加载不出来的问题(超级实用)

注&#xff1a; 由于gitee现在已经加上了防盗链&#xff0c;并且只支持1M的图片&#xff0c;我觉得不是很好用&#xff08;可以买腾讯云或阿里云等&#xff09;&#xff0c;之后找到比较好点的图床工具也会持续更新的。&#xff08;sm.ms好像还好&#xff0c;github网速不太稳定…

计算机网络 3.5局域网

第五节 局域网 一、认识局域网 1.定义&#xff1a; ①功能性&#xff1a;一组在地理位置上相隔不远的计算机及其设备按照一定的连接方式组织起来的&#xff0c;以实现用户间相互通信的资源共享的网络系统。 ②技术性&#xff1a;由特定类型的传输媒体和网络适配器互联在一起…

基于Vue和uni-app的增强型单选ccRadioView组件开发

标题&#xff1a;基于Vue和uni-app的增强单选组件ccRadioView的设计与实现 摘要&#xff1a;本文将详细介绍如何使用Vue和uni-app构建一个简单、好用且通用的单选框组件ccRadioView。该组件提供了单选列表的功能&#xff0c;并支持反向传值&#xff0c;方便开发者快速实现单选…

太速科技-基于5VLX110T FPGA FMC接口功能验证6U CPCI平台

基于5VLX110T FPGA FMC接口功能验证6U CPCI平台 一、板卡概述   本板卡是Xilinx公司芯片V5系列芯片设计信号处理板卡。由一片Xilinx公司的XC5VLX110T-1FF1136 / XC5VSX95T-1FF1136 / XC5VFX70T-1FF1136芯片组成。FPGA接1片DDR2内存条 2GB&#xff0c;32MB Nor flash存储器&a…

【Java基础】IO流(4) —— 转换流、打印流

【Java基础】IO流(1) —— 简介 【Java基础】IO流(2) —— 字符流 【Java基础】IO流(3) —— 字节流 【Java基础】IO流(4) —— 转换流、打印流 【Java基础】IO流(5) —— 序列流、内存流 【Java基础】IO流(6) —— 随机访问文件流、数据流 转换流 InputStreamReader 是字节输…

【Linux】在Linux中使用date命令

路过了学校花店 荒野到海边 有一种浪漫的爱 是浪费时间 徘徊到繁华世界 才发现你背影 平凡得特别 绕过了城外边界 还是没告别 爱错过了太久 反而错得完美无缺 幸福兜了一个圈 想去的终点 就在原点 &#x1f3b5; 林宥嘉《兜圈》 前言 date命令是Linux系统…

【制作100个unity游戏之28】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版4(附带项目源码)

最终效果 系列导航 文章目录 最终效果系列导航前言僵尸配置僵尸动画移动断头攻击死亡 源码完结 前言 本节主要实现配置僵尸动画&#xff0c;移动&#xff0c;断头&#xff0c;攻击&#xff0c;死亡功能。 僵尸 配置僵尸动画 普通动画 无头动画&#xff0c;新增覆盖图层 …

java实现环形链表带哨兵

双向环形链表带哨兵&#xff0c;这时哨兵既作为头&#xff0c;也作为尾。 package com.tfq.arithmetic.linkedlist;import java.util.Iterator;/*** author: fqtang* date: 2024/05/22/8:40* description: 环形链表*/ public class DoublyLinkedListSentinel implements Iterab…

嵌入式学习——3——IO分类模型

1、阻塞IO和非阻塞IO 1.1 阻塞IO - 在阻塞IO模型中&#xff0c;当一个IO操作&#xff08;如读取或写入&#xff09;开始时&#xff0c;如果数据没有准备好&#xff0c;程序会被挂起&#xff08;即阻塞&#xff09;&#xff0c;直到数据准备好并且IO操作完成。 - 在数据准备阶段…

浏览器API与协议

现代浏览器是一个囊括了数百个组件的操作系统&#xff0c;包括进程管理、安全沙箱、分层的优化缓存、JavaScript虚拟机、图形渲染和GPU管道、存储系统、传感器、音频和视频&#xff0c;网络机制等等。 在浏览器上运行的应用的性能。&#xff0c;取决于多个组件&#xff1a;解析…

SSH反向代理是什麼?有什麼用?

SSH反向代理&#xff0c;也被稱為SSH隧道&#xff0c;是一種利用SSH協議的端口轉發功能&#xff0c;將網路數據通過加密的SSH連接進行傳輸的技術。它的工作原理是&#xff0c;通過SSH連接將本地的一個端口與遠程伺服器的一個端口進行綁定&#xff0c;所有發往本地端口的數據都會…