PHP は WEB 開発のために生まれました。以前は、PHP の活力を高めた pthread が登場するまで、PHP にはスレッドがありませんでした。
推奨: 「PHP チュートリアル 」
1. スレッドの作成と使用
1. スレッド クラス
基本的な作成と使用:
<?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 クラスであるため、基本的な使用方法は次のとおりです。スレッドと同じです。 Worker クラスは、Thread クラスと比較して、スレッドの再利用機能 (スレッドの作成と破棄によって消費されるリソースを削減するため) を追加しており、通常は Stackable クラスと組み合わせて使用されます。スレッドまたはタスク使用するコンテナー (例:
<?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
2. PHP スレッドで発生するいくつかの問題と注意点
1. スレッド クラスの属性は、次のようなハッシュ テーブル (配列) 操作を直接実行できません。ああ、
なぜですか?スレッド クラス属性の割り当てはシリアル化によって実装されるため、その本質はシリアル化されたデータを格納することであるため、PHP のハッシュ テーブル (配列) の一般的な直接操作はサポートされていません。 2. スレッド クラスの属性を「クロージャ関数」にすることはできません 理由: クロージャ関数はシリアル化できないため、スレッド クラスで「コールバック関数」を使用したい場合は、 thread, then Give up the thread; 3. スレッド オブジェクトは、PHP の 2 番目のスペースを開きます (1) スレッドの作成後、親スレッドの変数にアクセスすることはできません$GLOBALS や global など、どちらも親スレッドのグローバル変数を操作することはできないため、スレッドの安全性の問題を考慮する必要があります; (2) ただし、親スレッドは子スレッドのコンテンツにアクセスできます。物体; ###以上がPHP pthread 拡張の使用法と落とし穴の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。