PHP pthread expansion usage and pitfalls

藏色散人
Release: 2023-04-08 08:50:01
forward
2562 people have browsed it

PHP was born for WEB development. In the past, PHP did not have threads until the emergence of pthread, which increased the vitality of PHP;

Recommended: "PHP Tutorial"

1. Creation and use of threads

1. Thread class

Basic creation and use:

<?php
//通过继承Thread类来实现自己的线程类MyThread
class MyThread extends Thread{
    //重写构造函数
    function __construct(){
    }
    //重写run方法(运行的是子线程需要执行的任务)
    function run(){
    }
}
//对象的实例化和运行就和java一样
$mt = new MyThread();
$mt->start();
Copy after login

Of course, as a thread class, there must be other methods for querying thread status and managing threads

<?php
//获取创建线程的父线程id
Thread::getCreatorId 
//获取当前线程id
Thread::getCurrentThreadId
//获取当前线程引用
Thread::getCurrentThread 
//将线程加入检测
Thread::join
//查看线程是否被检测(是否被join)
Thread::isJoined
//强行杀死线程
Thread::kill
Copy after login

2. Worker class

The parent class of the Worker class is the Thread class, so the basic usage is the same as Thread. Compared with the Thread class, the Worker class adds the function of thread reuse (to reduce the resources consumed by creating and destroying threads). It is usually used in conjunction with the Stackable class, which means that the worker class can be used as a thread or a task. Container to use, such as:

<?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);
Copy after login

Final output:

task1:run
task2:run
task3:run
Copy after login

Of course, the Worker class has other methods for the parent thread to manage it

//获取还没执行的任务数量
Worker::getStacked 
//判断worker是否关闭
Worker::isShutdown
//判断worker是否在工作
Worker::isWorking
//关闭销毁worker
Worker::shutdown
//将任务压栈
Worker::stack
//将任务出栈(该api有问题,慎用)
Worker::unstack
Copy after login

2. Some problems and points of attention encountered by PHP threads

1. The attributes of the thread class cannot directly perform hash table (array) operations, such as:

//这样是无效的
$this->var1["hello"] = "world"; 
//改为
$this->var1 = ["hello"=>"world"];
Copy after login

Why? Because the assignment of thread class attributes is implemented through serialization, its essence is to store serialized data, so the common direct operation of PHP's hash table (array) is not supported.

2. The attribute of the thread class cannot be a "closure function"

Reason: The closure function cannot be serialized; therefore, if you want to use a "callback function" in a thread, then Give up the thread;

3. The thread object opens up the second space of PHP

(1) After the thread is created, it cannot access the variables of the parent thread, such as $GLOBALS or global. Neither can operate the global variables of the parent thread, which should take into account thread safety issues;

(2) However, the parent thread can access the contents of the child thread object;

The above is the detailed content of PHP pthread expansion usage and pitfalls. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:csdn.net
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!