php Pthread 多线程 (二) Worker和Threaded

本文介绍了一个基于PHP的并发编程示例,通过自定义的MySqlWorker类和Query类实现线程间的资源共享。MySqlWorker作为持久化的线程对象,负责建立数据库连接;Query类则用于执行SQL查询并获取结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?php
//Worker是具有持久化上下文(执行环境)的线程对象
//Worker对象start()后,会执行run()方法,run()方法执行完毕,线程也不会消亡
class MySqlWorker extends Worker {
    private $name = '';
    private $db = null;

    public function __construct($name) {
        $this->name = $name;
    }

    public function run() {
        $this->db = mysql_connect('127.0.0.1', 'root', '');
        mysql_select_db('test', $this->db);
    }

    public function getDb() {
        return $this->db;
    }
}

//Stackable是Threaded的一个别称,直到pthreads v.2.0.0
class Query extends Threaded {
    private $sql = '';
    private $data = array();

    public function __construct($sql) {
        $this->sql = $sql;
    }

    public function run() {
        //访问线程工作对象
        $db = $this->worker->getDb();
        $res = mysql_query($this->sql, $db);
        $tmp = array();
        while($row = mysql_fetch_assoc($res)) {
            //这里不能使用$this->data[] = $row;这种方式。
            $tmp[] = $row;
        }
        $this->data = $tmp;
    }

    public function getData() {
        return $this->data;
    }
}

$mysqlWork = new MySqlWorker('mysqlWork');
$query1 = new Query('select * from test order by id limit 0,2');
$query2 = new Query('select * from test order by id limit 2,2');

//通过Worker的stack方法,我们把对象加入到Worker中
//会激活Worker执行对象的run()方法。
//说白了就是会执行$query1,$query2的run()方法。
$mysqlWork->stack($query1);
$mysqlWork->stack($query2);

$mysqlWork->start();
//执行完Worker中的对象后,关闭Worker。
//如果把这段代码放到$query1->getData()和$query2->getData()之后
//则会输出两个空数组,那该方法的作用有可能是等待Worker中对象执行完毕,类似join方法()。
$mysqlWork->shutdown();

var_dump($query1->getData());
var_dump($query2->getData());
php Thread 多线程 Worker和Threaded - 怀素真 - 因上努力 果上随缘
 
Worker对象与Threaded对象的关系有点像是,船在河中运行,一条河里有很多条船,而河也不止一条。不同的船运行在特定的环境下,比如大吨位的船是无法运行在河床浅的河中。船是可以随时变化的,而河的环境确相对持久。我们通过stack方法把对象加入到Worker中,在对象的run方法中通过对worker的访问来获取信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值