文章插图
php 默认并不支持多线程 , 要使用多线程需要安装 pthread 扩展 , 而要安装 pthread 扩展 , 必须使用 --enable-maintainer-zts 参数重新编译 PHP , 这个参数是指定编译 PHP 时使用线程安全方式 。
PHP 实现
PHP 实现的线程安全主要是使用 TSRM 机制对 全局变量和静态变量进行了隔离 , 将全局变量和静态变量 给每个线程都复制了一份 , 各线程使用的都是主线程的一个备份 , 从而避免了变量冲突 , 也就不会出现线程安全问题 。
PHP 对多线程的封装保证了线程安全 , 程序员不用考虑对全局变量加各种锁来避免读写冲突了 , 同时也减少了出错的机会 , 写出的代码更加安全 。
同时 PHP 开启线程安全选项后 , 使用 TSRM 机制分配和使用变量时也会有额外的损耗 , 所以在不需要多线程的 PHP 环境中 , 使用 PHP 的 ZTS (非线程安全) 版本就好 。
类和方法
PHP 将线程 封装成了 Thread 类 , 线程的创建通过实例化一个线程对象来实现 , 由于类的封装性 , 变量的使用只能通过构造函数传入 , 而线程运算结果也需要通过类变量传出 。
实例代码:
下面是一个线程类 , 用来请求某一接口 。接下来根据它写两个多线程的应用实例:
class Request extends Thread { public $url; public $response; public function __construct($url) { $this->url = $url; } public function run() { $this->response = file_get_contents($this->url); }}
【php有多线程吗】
推荐阅读
- php运行模式有哪几种
- php开发编辑器有哪些?
- php关闭报错,防止把网站漏洞暴露给用户
- php有哪些运行环境?每个都有不同的特点,适合不同的系统
- php fpm有什么用
- php变量名中不能包含哪些字符?
- php5与php7的区别是什么?
- PHP将两个日期之间的日期存到数组中
- PHP二维数组通过key去重
- 烟酒的利润一般是多少 烟酒行业利润有多大