ホームページ  >  記事  >  バックエンド開発  >  PHP で基礎となる同時実行処理を実装する方法

PHP で基礎となる同時実行処理を実装する方法

WBOY
WBOYオリジナル
2023-11-08 19:55:041042ブラウズ

PHP で基礎となる同時実行処理を実装する方法

PHP の基礎となる同時処理を実装するには、特定のコード例が必要です。

Web 開発のプロセスでは、多くの場合、多数の同時リクエストを処理する必要があります。 . 並行処理を使用しない場合、この方法では応答時間が長くなる、サーバーに過剰な負荷がかかるなどの問題が発生します。 PHP は Web 開発用の言語であり、その組み込みのマルチスレッド サポートは比較的弱いですが、他の方法を通じて基礎的な同時処理を実現できます。

1. 原理の紹介

PHP では、各リクエストは Web サーバーによって開かれた新しいプロセスまたはスレッドによって処理されます。同時実行性を向上させるために、下部でマルチプロセスまたはマルチスレッドメソッドを使用して複数のリクエストを同時に処理し、それによって同時実行性を向上させる効果を得ることができます。

マルチプロセス方式は、fork 関数によって子プロセスを作成することで実装され、子プロセスは親プロセスのコンテキスト (変数、ファイル記述子など) を継承し、メモリを共有できます。マルチスレッドは、プロセスのコンテキストを共有できるスレッドを作成するための API を提供する pthread 拡張機能を通じて実装されます。

2. 同時処理を実装するライブラリ

  1. Swoole

Swoole は C で書かれた拡張機能であり、高性能、非同期、イベント駆動型ネットワーク プログラミング フレームワークは、PHP の基礎となる同時処理を迅速に実装するのに役立ちます。 Swoole は、非同期 TCP/UDP/Unix Socket プロトコル、HTTP/WebSocket サーバーに加え、非同期 MySQL、Redis、DNS クエリ、その他の機能をサポートしています。

以下は、Swoole を使用して実装された単純な HTTP サーバーの例です。

<?php
$http = new swoole_http_server("0.0.0.0", 9501);

$http->on("start", function ($server) {
    echo "Swoole http server is started at http://127.0.0.1:9501
";
});

$http->on("request", function ($request, $response) {
    $response->header("Content-Type", "text/plain");
    $response->end("Hello Swoole!");
});

$http->start();
  1. Amp

Amp は、PHP に基づく非同期プログラミング フレームワークです。コルーチンと非同期ノンブロッキング IO API のセットは、基礎となる同時処理の実装に役立ちます。 Amp は、非同期 TCP/UDP/Unix ソケット プロトコル、HTTP/HTTPS クライアント、サーバー、および非同期 MySQL、PostgreSQL、Redis、Memcached およびその他の機能をサポートします。

次は、Amp を使用して実装された単純な HTTP サーバーの例です:

<?php
require 'vendor/autoload.php';

use AmpHttpServerHttpServer;
use AmpHttpServerRequestHandlerCallableRequestHandler;
use AmpHttpServerResponse;
use AmpHttpStatus;

$server = new HttpServer([new CallableRequestHandler(function () {
    return new Response(Status::OK, ['content-type' => 'text/plain'], 'Hello, world!');
})]);

$socket = AmpSocketlisten('0.0.0.0:9501');

$server->listen($socket);

AmpLoop::run();

3. 基礎となるマルチプロセス/マルチスレッド コードの例

PCNTL 拡張機能を使用すると、 PHP を簡単に実装する マルチプロセス プログラミング。以下は単純なマルチプロセスの例です。

<?php
$workerNum = 3; // 子进程数量

// 父进程等待子进程结束并回收资源
for ($i = 0; $i < $workerNum; $i++) {
    $pid = pcntl_fork();
    if ($pid < 0) {
        // 创建子进程失败
        exit('fork failed');
    } elseif ($pid == 0) {
        // 子进程代码
        echo 'worker ', $i, " pid is ", posix_getpid(), "
";
        // 这里是子进程具体的处理逻辑
        sleep(10);
        exit(0);
    }
}

while (($ret = pcntl_waitpid(-1, $status, WNOHANG)) != -1) {
    // 回收子进程资源
    if ($ret > 0) {
        echo "worker ", $ret, " exit with status ", $status, "
";
    } else {
        break;
    }
}

pthreads 拡張機能を使用すると、PHP でマルチスレッド プログラミングを簡単に実装できます。以下は単純なマルチスレッドの例です。

<?php
class MyWorker extends Thread {
    public function run() {
        echo 'Worker ', $this->getThreadId(), " starts
";
        // 这里是子线程具体的处理逻辑
        sleep(10);
        echo 'Worker ', $this->getThreadId(), " ends
";
    }
}

$workerNum = 3; // 子线程数量

$workers = [];
for ($i = 0; $i < $workerNum; $i++) {
    $workers[] = new MyWorker();
}

foreach ($workers as $worker) {
    $worker->start();
}

foreach ($workers as $worker) {
    $worker->join();
}

上記は、一般的に使用される 2 つの低レベル マルチプロセス/マルチスレッド プログラミング手法です。もちろん、ReactPHP や Workerman などのサードパーティ フレームワークを使用するなど、より高度な手法も使用できます。実際のアプリケーションでは、ビジネス シナリオに基づいて適切なソリューションを選択する必要があり、PHP の基礎となる同時処理を実現する必要があります。

以上がPHP で基礎となる同時実行処理を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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