问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

PHP使用Pthread实现的多线程操作实例

发布网友 发布时间:2022-04-29 09:31

我来回答

2个回答

懂视网 时间:2022-04-29 13:52

PHP是为WEB开发而生,以前PHP是没有线程的说法,直到pthread的出现,这样php增加了活力;

推荐:《PHP教程》

一. 线程的创建和使用

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)但是父线程却能够访问子线程对象的内容;

热心网友 时间:2022-04-29 11:00

本文实例讲述了PHP使用Pthread实现的多线程操作。分享给大家供大家参考,具体如下:
<?php
class
vote
extends
Thread
{
public
$res
=
'';
public
$url
=
array();
public
$name
=
'';
public
$runing
=
false;
public
$lc
=
false;
public
function
__construct($name)
{
$this->res
=
'暂无,第一次运行.';
$this->param
=
0;
$this->lurl
=
0;
$this->name
=
$name;
$this->runing
=
true;
$this->lc
=
false;
}
public
function
run()
{
while
($this->runing)
{
if
($this->param
!=
0)
{
$nt
=
rand(1,
10);
echo
"线程[{$this->name}]收到任务参数::{$this->param},需要{$nt}秒处理数据.\n";
$this->res
=
rand(100,
999);
sleep($nt);
$this->lurl
=
$this->param;
$this->param
=
'';
}
else
{
echo
"线程[{$this->name}]等待任务..\n";
}
sleep(1);
}
}
}
//这里创建线程池.
$pool[]
=
new
vote('a');
$pool[]
=
new
vote('b');
$pool[]
=
new
vote('c');
//启动所有线程,使其处于工作状态
foreach
($pool
as
$w)
{
$w->start();
}
//派发任务给线程
for
($i
=
1;
$i
<
10;
$i++)
{
$worker_content
=
rand(10,
99);
while
(true)
{
foreach
($pool
as
$worker)
{
//参数为空则说明线程空闲
if
($worker->param=='')
{
$worker->param
=
$worker_content;
echo
"[{$worker->name}]线程空闲,放入参数{$worker_content},上次参数[{$worker->lurl}]结果[{$worker->res}].\n";
break
2;
}
}
sleep(1);
}
}
echo
"所有线程派发完毕,等待执行完成.\n";
//等待所有线程运行结束
while
(count($pool))
{
//遍历检查线程组运行结束
foreach
($pool
as
$key
=>
$threads)
{
if
($worker->param=='')
{
echo
"[{$threads->name}]线程空闲,上次参数[{$threads->lurl}]结果[{$threads->res}].\n";
echo
"[{$threads->name}]线程运行完成,退出.\n";
//设置结束标志
$threads->runing
=
false;
unset($pool[$key]);
}
}
echo
"等待中...\n";
sleep(1);
}
echo
"所有线程执行完毕.\n";
希望本文所述对大家php程序设计有所帮助。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
高启强与陈书婷结婚是哪一集 陈舒婷和高启强第几集结婚 高启强陈书婷结婚是第几集 高启强和陈书婷结婚是第几集 高启强和陈书婷第几集结的婚 狂飙高启强第几集和大嫂在一起的 2021年清明节时间(是公历几月几号) js中类似`${xx,xxxy}`的语句是什么意思? 用支付宝帐号注册的淘宝帐号但是淘宝显示未绑定支付宝帐号如图 银行黑户影响子女什么 斗牛牛规则,详解 斗牛的特殊规则 一个可以建几个微信群?一个微信群可以有多少人? 关于做人做事的古人写的名言警句 . 希望答案给的有条理 没有灌水_百 ... 一个可以建几个微信群都是多少人 激励人的名言名句古代 古代家风家训名言名句 微信里面总有人发这样消息这样 我今天被清了,你也清清吧。不用回,试试吧,复制我发的信息,找到微信里 为人处事、立志的古代名句有司那些 微信有人发文件过来,为什么是这个? 古代关于关于做人方面的格言 有没有教做人的古代名言 微信商品test怎么改 中国古人修身,做人的美德方面的名句五句 微信老是有人发这个是手机病毒吗 古代关于做人的格言 请问微信有人发这样的消息是不是病毒 为什么老是收到有腾讯微信的验证码短信 古代关于做人方面的格言 微信转发文字内容时,怎么变成英语Test了? 五指毛桃猪骨汤加无花果可以吗? 五指毛桃猪骨汤的食材分析 ios14.7.1设备管理在哪里? 可以在王者营地里关闭观战吗? 王者荣耀怎样禁止别人访问 王者营地怎么观战好友 王者营地怎么观战好友对局 王者怎么好友观战 更新后王者荣耀战绩隐藏 债券的待偿还期限是什么意思? 汉语中待偿是什么意思? 债券的剩余期与存续期有什么区别? 待偿期是什么呢 公司债券期限及偿还方式是什么? 债券待偿期怎么算? 我的硬盘通电时摔了,之后试试转的时候有轻微的咔咔声,一会就不转了。请问这怎么修理啊,里面数据很重要 移动硬盘被摔后 移动硬盘咔咔响 1TB移动硬盘摔了一下!灯一直闪烁,里面咔咔响,读不出来盘符! 移动硬盘摔坏后里面的数据怎么恢复。。我刚买没多久的,今天被摔了之后... 系统风险包括哪些风险