Home >Backend Development >PHP Tutorial >PHP pthread expansion usage and pitfalls
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();
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
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);
Final output:
task1:run task2:run task3:run
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
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"];
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!