PHP代码优化与性能提升:多线程

本文探讨了PHP中的多线程使用,尽管PHP传统上被视为单线程,但通过pthreads扩展可以在5.3版本以上支持多线程。文章介绍了线程的概念,如何在PHP中创建和管理线程,以及多线程在重复性任务、接口请求、通知发送等场景的应用。同时,文章提醒开发者注意线程的创建和管理也会带来性能损耗,需根据任务性质合理使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于c++,java等的强类型语言,多线程的使用十分普遍,但对于php来说,我们用得十分之少,因为在我们固定的思维里认为PHP 普遍都是单线程模型,并不适合多线程领域,花些时间翻了几个多线程的项目源码之后,发现 PHP 的多线程也颇有可取之处,活用起来,用来解决某些问题竟然非常适合。

1、 概念

线程(thread) 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,线程自己不拥有系统资源,它与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。每一个程序都至少有一个线程,那就是程序本身,通常称为主线程。线程是程序中一个单一的顺序控制流程。 在单个程序中同时运行多个线程完成不同的工作,称为多线程。

2、php 中的多线程

 

PHP 5.3 以上版本,使用pthreads PHP扩展,做好相应的配置,就可以使PHP真正地支持多线程。重复性的循环任务用多线程处理,能够大大缩短程序执行时间。

PHP 将线程 封装成了 Thread 类,线程的创建通过实例化一个线程对象来实现,由于类的封装性,变量的使用只能通过构造函数传入,而线程运算结果也需要通过类变量传出,以下是几个常用的 Thread 类方法:

run():此方法是一个抽象方法,每个线程都要实现此方法,线程开始运行后,此方法中的代码会自动执行;

start():在主线程内调用此方法以开始运行一个线程;

join():各个线程相对于主线程都是异步执行,调用此方法会等待线程执行结束;

kill():强制线程结束;

isRunning():返回线程的运行状态,线程正在执行run()方法的代码时会返回 true;

3、调试多线程代码实例

4、使用多线程对比for 循环的性能优化实例

输出时间对比:

5、综上总结

重复性的循环任务用多线程处理,在多进程开启的异步执行情况下,能够大大缩短程序执行时间。

6、应用场景

 1、一个程序中多次请求接口获取数据。

2、发送大量的邮件,短信,或者其他的通知信息。

3、多次读取整块文件。

4、大计算量的代码。

7、多线程的局限性

多线程的优化是很多,可是无脑使用多线程并不能提升程序的执行效率,因为线程的创建和销毁、上下文切换、线程同步等也是有性能损耗的,耗费时间可能比顺序执行的代码还多。如:

一个从1累加到50000的函数素sumSmall。

上图是在主线程内执行了三次 sumSmall 和三个线程分别执行 sumSmall ,再将结果同步到一个线程的时间对比,我们会发现只在主线程执行的时间反而更短,三个线程创建、切换、同步的时间远远大过了线程异步执行节省的时间。

而函数 sumLarge 从1累加到5000000,下图同一线程执行三次和三个线程执行的耗时:

所以,在设计代码时合理使用多线程,不可盲目,让多线程发挥出它应有的作用。

在这里插入图片描述

文章来自公众号:睿江云计算

睿江云官网链接:https://www.eflycloud.com/home?from=RJ0024

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值