这篇文章主要介绍了PHP中使用pthread拓展,本文讲述线程类的使用方法和线程类的概念和使用场景,以及具体的代码实现,以下就是详细内容,需要的朋友可以参考下
一. 线程的创建和使用
1. Thread类
基本的创建和使用:
<?php
//通过继承Thread类来实现自己的线程类MyThread
class MyThread extends Thread{
//重写构造函数
function __construct(){
}
//重写run方法(运行的是子线程需要执行的任务)
function run(){
}
}
//对象的实例化和运行就和java一样
$mt = new MyThread();
$mt->start();
当然,作为线程类,必须还有另外一些用于查询线程状态以及管理线程的方法
<?php
//获取创建线程的父线程id
Thread::getCreatorId
//获取当前线程id
Thread::getCurrentThreadId
//获取当前线程引用
Thread::getCurrentThread
//将线程加入检测
Thread::join
//查看线程是否被检测(是否被join)
Thread::isJoined
//强行杀死线程
Thread::kill
2.Worker类
Worker类的父类是Thread类,因此基本用法和Thread一样。而Worker类相对于Thread类来说,增加了线程复用的功能(以降低创建销毁线程所耗费的资源),通常与Stackable类连用,也就是说worker类既可以当做线程使用,也可以当做任务的容器来使用,如:
<?php
class Task extends Stackable{
function __construct($no){
$this->no = $no;
}
function run(){
echo "task{$this->no}:run".PHP_EOL;
}
}
class MyWork extends Worker{
function __construct(){
}
function run(){
}
}
$t1= new Task(1);
$t2= new Task(2);
$t3= new Task(3);
$my = new MyWork();
$my->stack($t1);
$my->stack($t2);
$my->start();
$my->stack($t3);
最终输出:
task1:run
task2:run
task3:run
当然Worker类还有其他一些方法来用于父线程对其进行管理
//获取还没执行的任务数量
Worker::getStacked
//判断worker是否关闭
Worker::isShutdown
//判断worker是否在工作
Worker::isWorking
//关闭销毁worker
Worker::shutdown
//将任务压栈
Worker::stack
//将任务出栈(该api有问题,慎用)
Worker::unstack
二. PHP线程遇到的一些问题与注意点
1.线程类的属性不能直接进行哈希表(数组)操作,如:
//这样是无效的
$this->var1["hello"] = "world";
//改为
$this->var1 = ["hello"=>"world"];
为什么?因为线程类属性的赋值是通过序列化实现的,其本质是存储了序列化数据,因此不支持PHP常用直接操作哈希表(数组)的操作。
2.线程类的属性不能是“闭包函数”
原因:闭包函数不能序列化;因此,如果想在线程里用“回调函数”的话,那就放弃线程吧;
3.线程对象开辟了php的第二空间
(1)线程在创建之后,无法访问到父线程的变量,诸如$GLOBALS或global等用法都无法操作父线程的全局变量,这应该是考虑到了线程安全的问题;
(2)但是父线程却能够访问子线程对象的内容;
到此这篇关于PHP中使用pthread拓展的文章就介绍到这了,更多相关PHP pthread拓展内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:PHP中使用pthread拓展
基础教程推荐
- 在Laravel中实现使用AJAX动态刷新部分页面 2023-03-02
- PHP命名空间简单用法示例 2022-12-01
- 使用PHP开发留言板功能 2023-03-13
- php array分组,PHP中array数组的分组排序 2022-08-01
- PHP实现Redis单据锁以及防止并发重复写入 2022-10-12
- laravel 解决多库下的DB::transaction()事务失效问题 2023-03-08
- thinkphp3.2.3框架动态切换多数据库的方法分析 2023-03-19
- PHP获取MySQL执行sql语句的查询时间方法 2022-11-09
- laravel ORM关联关系中的 with和whereHas用法 2023-03-02
- PHP中的错误及其处理机制 2023-06-04