PHP7.0 は、最も一般的に使用されるサーバーサイド プログラミング言語の 1 つです。フレンドリーなインターフェイス、習得が簡単、強力な機能、豊富な拡張ライブラリを備えています。同時プログラミングの点でも、PHP7.0 には多くの優れたツールとテクノロジが備わっています。この記事では、PHP7.0で並行プログラミングを行う方法を紹介します。
1. 並行プログラミングとは
並行プログラミングとは、複数のスレッド、プロセス、またはコルーチンを通じて複数のタスクを同時に実行できるようにするプログラミング手法を指します。プログラミングでは、同時実行技術を効果的に使用すると、プログラムのパフォーマンスとスループットを向上させることができます。
2. PHP7.0 の並行プログラミング ツール
PHP7.0 では、並行プログラムを作成するために選択できるツールが多数あります。
1. PCNTL 拡張機能
PHP によって提供される PCNTL 拡張機能は、プロセスと信号処理を管理するための一連の関数を提供します。この拡張機能を使用すると、同じプロセスで実行されている複数のタスクを同時に簡単に管理できます。
2. pthread 拡張機能
pthread 拡張機能は、PHP で POSIX スレッド インターフェイスを実装する便利な PHP 拡張機能です。この拡張機能は、スレッドの作成、破棄、同期、通信のためのさまざまな機能を提供します。
3. Swoole 拡張機能
Swoole は、非同期、ノンブロッキング、コルーチン プログラミング機能を提供する PHP 拡張機能です。この拡張機能は、PHP で人気のあるオープン ソース プロジェクトの 1 つとなり、ネットワーク プロトコル、スレッド プール、非同期タスクなどを含む完全な同時プログラミング フレームワークを提供します。
4. AMQP プロトコル
AMQP プロトコル (正式名は Advanced Message Queuing Protocol) は、標準のメッセージ キュー プロトコルです。 AMQP プロトコルを使用すると、非同期および分散操作を実装でき、同時プログラミングを簡単に実装できます。
3. 同時プログラミングに PHP7.0 を使用するテクノロジと例
次に、同時プログラミングに PHP7.0 を使用するテクノロジと例を示します。 PCNTL 拡張機能
複数のタスクを同期する古典的な方法は、フォーク メカニズムを使用することです。このテクノロジーを使用すると、単一プロセスで複数のサブプロセスを開始し、複数のタスクを同時に実行できます。以下はサンプル コードです。
$NUM_CHILDREN = 5; $pid_array = array(); for ($i = 0; $i < $NUM_CHILDREN; ++$i) { $pid = pcntl_fork(); if ($pid == -1) { die('could not fork'); } else if ($pid) { $pid_array[] = $pid; } else { sleep(5); exit(0); } } while(count($pid_array) > 0) { foreach($pid_array as $key => $pid) { $res = pcntl_waitpid($pid, $status, WNOHANG); if($res == -1 || $res > 0) { unset($pid_array[$key]); } } }
上の例では、まず $num_children 変数を定義し、同時に実行する必要があるタスクの数を示します。次に、$num_children 子プロセスを開始し、それらが完了するのを待ちます。この例では、子プロセスが完了した後にメインプロセスが終了することに注意してください。
2. pthread 拡張機能を使用する
pthread 拡張機能を使用すると、複数の同時スレッドを簡単に作成および管理して、複数のタスクを同時に実行できます。以下は簡単な例です。
class MyThread extends Thread { public function run() { echo "Task started"; sleep($this->rand(1, 5)); echo "Task completed"; } } $thread1 = new MyThread(); $thread1->start(); $thread2 = new MyThread(); $thread2->start(); $thread1->join(); $thread2->join();
上記のコードでは、MyThread という名前のカスタム スレッド クラスが定義されています。このクラスは、Thread クラスの run メソッドをオーバーライドし、その中で同時タスクを定義します。メイン コード セクションで、スレッド インスタンスを作成し、start() メソッドを使用してスレッドを開始します。次に、join() メソッドを使用して、スレッドが完了するのを待ちます。
3. Swoole 拡張機能を使用する
Swoole 拡張機能は、非同期、ノンブロッキング、コルーチン開発を簡単に処理できる便利な同時プログラミング フレームワークを提供します。以下は、Swoole を使用した同時プログラミングの例です。
$server = new swoole_http_server("127.0.0.1", 9501); $server->on('request', function ($request, $response) { $response->header("Content-Type", "text/plain"); $response->end("Hello World "); }); $server->start();
上記のコードは、ポート 9501 でリッスンする Swoole HTTP サーバーを作成します。要求されると、サーバーは単に「Hello World」を返します。この例で書かれたコードは非同期でノンブロッキングであることに注意してください。これにより、サーバーは高いユニットパフォーマンスで同時に多くのリクエストを処理できるようになります。
4. AMQP プロトコルを使用する
AMQP プロトコルは、分散メッセージ キューの標準です。 AMQP プロトコルを使用すると、メッセージの送受信操作や非同期プログラミングを簡単に実装できます。 AMQP 同時プログラミングの例を次に示します。
require __DIR__ . '/vendor/autoload.php'; use PhpAmqpLibConnectionAMQPConnection; $connection = new AMQPConnection('localhost', 5672, 'guest', 'guest'); $channel = $connection->channel(); $channel->queue_declare('task_queue', false, true, false, false); echo ' [*] Waiting for messages. To exit press CTRL+C', " "; $callback = function($msg) { echo " [x] Received ", $msg->body, " "; sleep(substr_count($msg->body, '.')); echo " [x] Done", " "; }; $channel->basic_qos(null, 1, null); $channel->basic_consume('task_queue', '', false, true, false, false, $callback); while(count($channel->callbacks)) { $channel->wait(); } $channel->close(); $connection->close();
上記のコードでは、AMQP プロトコルを使用して、rabbitmq キュー上にタスク キューが作成され、非同期タスクを取得し、タスクの完了後にレポートします。この例では、AMQP プロトコルをカプセル化する PHP 拡張ライブラリである PhpAmqpLib ライブラリを使用します。
4. 概要
PHP7.0 同時プログラミングを使用すると、高性能で高スループットのアプリケーションをより簡単に実装できます。この記事では、PCNTL 拡張機能、pthread 拡張機能、Swoole 拡張機能、AMQP プロトコルなど、一般的に使用される PHP 同時プログラミング ツールをいくつか紹介します。さらに、これらのツールの使用例もいくつか示します。アプリケーションのパフォーマンスを最大化したい場合は、これらの手法を試してみることを検討してください。
以上が同時プログラミングに PHP7.0 を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。