ホームページ >バックエンド開発 >PHPの問題 >PHP がマルチスレッドをサポートしていない場合はどうすればよいですか?

PHP がマルチスレッドをサポートしていない場合はどうすればよいですか?

尚
オリジナル
2019-10-30 13:40:092803ブラウズ

PHP がマルチスレッドをサポートしていない場合はどうすればよいですか?

PHP はデフォルトではマルチスレッドをサポートしていません。マルチスレッドを使用するには、pthread 拡張機能をインストールする必要があります。pthread 拡張機能をインストールするには、--enable- PHP を再コンパイルするための maininer-zts パラメータこのパラメータは、PHP をコンパイルするときに使用するスレッドセーフなメソッドを指定します。

推奨: php サーバー

スレッド セーフティ

マルチスレッドはプログラムを不安定にする要因です。マルチスレッドを使用する前に、まずスレッドを実行してください。安全性の問題を考慮する必要があります:

スレッド セーフティ: スレッド セーフティとはプログラミングの用語で、関数または関数ライブラリがマルチスレッド環境で呼び出されたときに、複数のスレッド間の共有を正しく処理できることを意味します。変数を使用してプログラム機能を正しく完了できるようにします。

従来のマルチスレッドでは、複数のスレッドが変数を共有するため、次の問題が発生する可能性があります。

  1. グローバル配列 $arr = array('a ') が存在します。 ;;

  2. A スレッドは長さ 1 の配列を取得します;

  3. B スレッドは長さ 1 の配列を取得します;

  4. A スレッドが配列要素をポップアウト $a = array_pop($arr); $a = 'a';;

  5. B スレッドもポップアウト配列要素 $b = array_pop($arr); $a = null;;

  6. このとき、B スレッドで超常現象が発生しました。配列の長さは明らかに 0 より大きくなっています。 、または何もポップされませんでした。

PHP 実装

PHP によって実装されたスレッド セーフティは、主に TSRM メカニズムを使用してグローバル変数と静的変数を分離し、グローバル変数と静的変数をコピーします。各スレッドへの静的変数のコピー 1 つのコピーで、各スレッドはメイン スレッドのバックアップを使用するため、変数の競合やスレッドの安全性の問題が回避されます。

PHP のマルチスレッド カプセル化により、スレッドの安全性が確保されます。プログラマは、読み取りと書き込みの競合を避けるために、グローバル変数にさまざまなロックを追加することを考慮する必要がなくなりました。また、エラーの可能性が減り、記述されたコードの安全性が高まります。

しかし、その結果、サブスレッドが実行を開始すると、メインスレッドはサブスレッドの実行の詳細を調整できなくなり、スレッドはグローバル変数を介してスレッド間でメッセージを送信する機能を失います。ある程度です。

同時に、PHP がスレッド セーフ オプションをオンにすると、TSRM メカニズムを使用して変数を割り当てて使用するときに追加の損失が発生するため、マルチスレッドを必要としない PHP 環境では、 PHP の ZTS (非スレッド セーフ) バージョンを使用してください。

クラスとメソッド

PHP は、スレッドを Thread クラスにカプセル化します。スレッドの作成は、スレッド オブジェクトをインスタンス化することによって行われます。クラスのカプセル化により、変数はコンストラクターを通じてのみ使用できます。渡すと、スレッド操作の結果もクラス変数を通じて渡す必要があります。

次に、よく使用される Thread クラス メソッドをいくつか紹介します:

  • run(): このメソッドは抽象メソッドです。各スレッドはこのメソッドを実装する必要があります。スレッドはその後開始されます。実行中、このメソッドのコードは自動的に実行されます;

  • start(): スレッドの実行を開始するには、メイン スレッド内でこのメソッドを呼び出します;

  • join(): 各スレッドはメイン スレッドに対して非同期で実行されます。このメソッドを呼び出すと、スレッドの実行が終了するまで待機します。

  • kill(): スレッドを強制的に実行します。 end;

  • isRunning(): スレッドの実行ステータスを返します。スレッドが run() メソッドのコードを実行している場合は true を返します。

  • スレッドセーフの実装により、PHPのマルチスレッドが動作を開始すると、共有メモリ空間を介した通信ができなくなり、スレッド間通信によるスレッドの再利用もできなくなるため、PHPの「スレッド」は、プール」は意味がありません。拡張機能に付属するPoolクラスはマルチスレッドの割り当てを管理するクラスなのでここでは紹介しません。

以上がPHP がマルチスレッドをサポートしていない場合はどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。