Maison  >  Article  >  développement back-end  >  Utilisation et pièges de l'expansion PHP pthread

Utilisation et pièges de l'expansion PHP pthread

藏色散人
藏色散人avant
2020-01-17 17:40:212505parcourir

PHP est né pour le développement WEB. Dans le passé, PHP n'avait pas de threads jusqu'à l'émergence de pthread, qui ajoutait de la vitalité à PHP

Recommandé : "Tutoriel PHP"

1. Création et utilisation des threads

1. Classe de thread

Création et utilisation de base :

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

Bien sûr, comme une classe de thread, il doit y avoir d'autres méthodes pour interroger l'état des threads et gérer les threads

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

2 Classe Worker

La classe parent de la classe Worker est la classe Thread, donc l'utilisation de base est. le même que Thread. Par rapport à la classe Thread, la classe Worker ajoute la fonction de réutilisation des threads (pour réduire les ressources consommées par la création et la destruction des threads). Elle est généralement utilisée en conjonction avec la classe Stackable, ce qui signifie que la classe Worker peut être utilisée comme classe Worker. thread ou une tâche. Conteneur à utiliser, tel que :

<?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);

Résultat final :

task1:run
task2:run
task3:run

Bien sûr, la classe Worker a d'autres méthodes permettant au thread parent de le gérer

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

2. Quelques problèmes et points d'attention rencontrés par les threads PHP

1 Les attributs de la classe thread ne peuvent pas effectuer directement des opérations de table de hachage (tableau), telles que :

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

Pourquoi ? Étant donné que l'attribution des attributs de classe de thread est implémentée via la sérialisation, son essence est de stocker des données sérialisées, de sorte que le fonctionnement direct commun de la table de hachage (tableau) de PHP n'est pas pris en charge.

2. L'attribut de la classe thread ne peut pas être une "fonction de fermeture"

Raison : La fonction de fermeture ne peut donc pas être sérialisée, si vous souhaitez utiliser une "fonction de rappel" dans le thread, puis abandonnez le thread ;

3. L'objet thread ouvre le deuxième espace de PHP

(1) Une fois le thread créé, il ne peut pas accéder aux variables du thread parent. , comme $GLOBALS ou global. Ni l'un ni l'autre ne peuvent exploiter les variables globales du thread parent, ce qui doit prendre en compte les problèmes de sécurité des threads

(2) Cependant, le thread parent peut accéder au contenu du thread enfant ; objet;

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer