php不支持多线程怎么办

PHP 默认并不支持多线程,要使用多线程需要安装 pthread 扩展,而要安装 pthread 扩展,必须使用 --enable-maintainer-zts 参数重新编译 PHP,这个参数是指定编译 PHP 时使用线程安全方式。

线程安全

多线程是让程序变得不安分的一个因素,在使用多线程之前,首先要考虑线程安全问题:

线程安全:线程安全是编程中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。

在传统多线程中,由于多个线程共享变量,所以可能会导致出现如下问题:

  1. 存在一个全局数组$arr = array(‘a‘);;
  2. A线程获取数组长度为1;
  3. B 线程获取数组长度为1;
  4. A 线程 pop 出数组元素 $a = array_pop($arr); $a = ‘a‘;;
  5. B 线程也 pop 数组元素 $b = array_pop($arr); $a = null;;
  6. 此时 B 线程内就出现了灵异事件,明明数组长度大于0,或没有 pop 出东西;

PHP 实现

PHP 实现的线程安全主要是使用 TSRM 机制对 全局变量和静态变量进行了隔离,将全局变量和静态变量 给每个线程都复制了一份,各线程使用的都是主线程的一个备份,从而避免了变量冲突,也就不会出现线程安全问题。

PHP 对多线程的封装保证了线程安全,程序员不用考虑对全局变量加各种锁来避免读写冲突了,同时也减少了出错的机会,写出的代码更加安全。

但由此导致的是,子线程一旦开始运行,主线程便无法再对子线程运行细节进行调整了,线程一定程度上失去了线程之间通过全局变量进行消息传递的能力。

同时 PHP 开启线程安全选项后,使用 TSRM 机制分配和使用变量时也会有额外的损耗,所以在不需要多线程的 PHP 环境中,使用 PHP 的 ZTS (非线程安全) 版本就好。

类和方法

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

下面介绍几个常用的 Thread 类方法:

  • run():此方法是一个抽象方法,每个线程都要实现此方法,线程开始运行后,此方法中的代码会自动执行;
  • start():在主线程内调用此方法以开始运行一个线程;
  • join():各个线程相对于主线程都是异步执行,调用此方法会等待线程执行结束;
  • kill():强制线程结束;
  • isRunning():返回线程的运行状态,线程正在执行run()方法的代码时会返回 true;

因为线程安全的实现,PHP 的多线程开始运行后,无法再通过共享内存空间通信,线程也无法通过线程间通信复用,所以我认为 PHP 的“线程池”并没有什么意义。扩展内自带的Pool 类是一个对多线程分配管理的类,这里也不再多介绍了。

原文地址:https://www.cnblogs.com/IT-SUJIU/p/11765477.html

时间: 2024-08-24 04:46:09

php不支持多线程怎么办的相关文章

监控之cacti的安装部署(监控本机及其他主机+支持多线程+命令行监控)

主机环境   redhat6.5 64位 实验环境   服务端1 ip 172.25.25.1            服务端2 ip 172.25.25.2 安装包     cacti-0.8.8h.tar.gz      php-snmp-5.3.3-26.el6.x86_64.rpm cacti-spine-0.8.8g.tar.gz 防火墙状态:关闭 Selinux状态:Disabled 1.配置安装cacti及测试 A)配置安装cacti [[email protected] Asia]

ThreadSafeClientConnManager用来支持多线程的使用http client

ThreadSafeClientConnManager用来支持多线程的使用http client import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.Defau

libcurl的封装,支持同步异步请求,支持多线程下载,支持https

最近在做一个项目,需要用到http get post等 需求分析需要做到同步和异步,异步请求的返回以可选的回调通知的方式进行. 本人以Linux为例,一步一步的来实现. 配置并且编译libcurl我以在Linux底下的交叉编译举例.libcurl源码下载: http://curl.haxx.se/download.html配置libcurl支持https和zlib压缩,必须需要openssl和zlib库openssl库源码下载: http://www.openssl.org/source/.下载

发布支持多线程的PowerShell模块 —— MultiThreadTaskRunner

应用场景 多线程在需要批量处理一些任务的时候相当有用,也更加有利于充分利用现有计算机的能力.所有主流的开发语言都支持多线程. 默认情况下,PowerShell作为一个脚本语言,是不支持多线程操作的,虽然有所谓的后台任务,但实际上控制起来相当麻烦. 解决方案 我很喜欢PowerShell,所以为此专门写了一个自定义的模块,来实现多线程的功能.该模块使用C#编写,源代码可以在下面的地址访问到 https://github.com/chenxizhang/MultiThreadTaskRunner 与

看到有网友说Node.js是支持多线程的,我在这里解释一下

Node.js确实有一个扩展,叫tagg,可以实现多线程.但实际上是这样的,它的这个多线程只是一个线程池,去执行一部分计算的任务. EventLoop和IO的处理部分始终是单线程的,在任务线程中不能调用异步接口,只能计算或者执行阻塞IO. 除了tagg之外,Node.js还有child_process,cluster等扩展可以实现多进程.但这里的多进程也不知真正意义上的子进程.而是node的另外一个实例.它无法继承使用父进程的任何资源. 注:有好多同学说,单线程EventLoop足够用了.各位可

JAVA在语言级支持多线程

进程:任务 任务并发执行是一个宏观概念,微观上是串行的. 进程的调度是有OS负责的(有的系统为独占式,有的系统为共享式,根据重要性,进程有优先级). 由OS将时间分为若干个时间片. JAVA在语言级支持多线程. 分配时间的仍然是OS. 1 package TomTexts; 2 3 public class TomTexts_21 { 4 public static void main(String args[]) 5 { 6 int data1[]={2,4,6,8,10,12}; 7 int

XUtils开源框架的使用(HttpUtils支持多线程断点续传)

XUtils项目下载地址:https://github.com/wyouflf/xUtils XUtils中包含的四大模块: 1.DbUtils模块 2.ViewUtils模块 3.HttpUtils模块: 支持同步,异步方式的请求: 支持大文件上传,上传大文件不会oom: 支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求: 下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件

基于c++11新标准开发一个支持多线程高并发的网络库

背景 新的c++11标准出后,c++语法得到了很多的扩展,比起以往任何时候都要灵活和高效,提高了程序编码的效率,为软件开发人员节省了不少的时间. 之前我也写过基于ACE的网络服务器框架,但ACE毕竟有些臃肿,内部对象关系错综复杂,容易给人造成只见树木不见森林的错觉. 所以打算用c++11开发一个较为简洁,高效,支持高并发的网络库. 开源         花了两三周,终于把基础的结构开发完成,代码也开源在github上,网址是 https://github.com/lichuan/fly 欢迎各位

MVAPICH2支持多线程和设备间通信问题

MVAPICH2多线程支持问题 MVAPICH2为了优化性能,默认的情况是将进程绑定到处理器的.因此默认是只支持单线程的,如果要运行MPI多线程程序,可以通过以下方式运行多线程: $ mpirun  -np 2 –env MV2_ENABLE_AFFINITY  0  ./mpi app (或者:$ mpirun_rsh  -np 2 MV2_ENABLE_AFFINITY =0  ./mpi app) 当然在程序mpiapp的代码中MPI初始化函数MPI_Init(),要用函数MPI_Init