php不支持多线程怎么办-PHP问题

资源魔 38 0

PHP 默许其实不支持多线程,要应用多线程需求装置 pthread 扩大,而要装置 pthread 扩大,必需应用 --enable-maintainer-zts 参数从新编译 PHP,这个参数是指定编译 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 类是一个对多线程调配治理的类,这里也再也不多引见了。

以上就是php没有支持多线程怎样办的具体内容,更多请存眷资源魔其它相干文章!

标签: php php教程 php故障解决 php使用问题 多线程

抱歉,评论功能暂时关闭!