ホームページ  >  記事  >  バックエンド開発  >  PHP 関数の非同期プログラミングに関する簡単な説明

PHP 関数の非同期プログラミングに関する簡単な説明

王林
王林オリジナル
2024-05-05 11:06:01997ブラウズ

PHP では、非同期プログラミングにより、実行フローをブロックすることなく、時間のかかるタスクを実行できます。非同期プログラミングを実装するための手法には次のものがあります。 コールバック関数: 別の関数の実行が完了した後にコードを実行する関数ポインター。コルーチン: 同じスレッド内で複数の関数の実行を切り替えることができる軽量のマルチタスク メカニズム。並列化: 異なるスレッドまたはプロセスを使用して複数のタスクを同時に実行します。実践例: HTTP リクエストを並列処理することで、応答性を維持しながら処理時間を大幅に短縮できます。

浅谈 PHP 函数的异步编程

PHP 関数の非同期プログラミングに関する簡単な説明

はじめに

PHP の非同期プログラミング パターンを使用すると、現在の実行フローをブロックすることなく、時間のかかるタスクを実行できます。この記事では、コールバック関数、コルーチン、並列化手法を使用して PHP で非同期プログラミングを実装する方法を検討し、実際のケースを通じてこれらの手法を適用する方法を説明します。

コールバック関数

コールバック関数は、別の関数の実行が完了した後にコードを実行できるようにする関数ポインターです。これらは、非同期操作を処理するときに非常に役立ちます。次の例は、コールバック関数を使用した単純な非同期操作を示しています。

function long_task($seconds, callable $callback)
{
    // 模拟耗时任务
    sleep($seconds);

    // 执行回调函数
    $callback();
}

long_task(5, function () {
    echo "任务已完成!\n";
});

Coroutine

Coroutine は、複数の関数の実行を切り替えることができる軽量のマルチタスク メカニズムです。スレッド。コルーチンを使用すると、現在の実行フローをブロックすることなく、時間のかかる複数のタスクを同時に処理できます。

以下は、PHP 7.2 のコルーチン ライブラリを使用した非同期プログラミングの例です。

$coroutine = function () {
    $data = yield long_task(5);
    echo "Data received: $data\n";
};

go($coroutine);

並列化

非同期プログラミングと同様に、並列化を使用すると、複数のタスクを同時に実行します。ただし、並列化は同じスレッド内ではなく、異なるスレッドまたはプロセスで実行されます。並列化は、PHP の Process クラスと Thread クラスを使用して実現できます。

次の例は、Process クラスを使用して、時間のかかる 2 つのタスクを並行して処理する方法を示しています。

$process1 = new Process(function () {
    long_task(5, function () {
        echo "任务 1 完成!\n";
    });
});

$process2 = new Process(function () {
    long_task(3, function () {
        echo "任务 2 完成!\n";
    });
});

$process1->start();
$process2->start();

$process1->wait();
$process2->wait();

実際のケース: 非同期 HTTP リクエスト

実際的な例として、上記の手法を使用して、現在の実行フローをブロックすることなく複数の HTTP リクエストを並行して処理できます。

use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Pool;
use GuzzleHttp\Promise\EachPromise;

// 创建 Guzzle 客户端
$client = new Client();

// 初始化请求队列
$queue = [];
$urls = ['https://example.com', 'https://example2.com', 'https://example3.com'];
foreach ($urls as $url) {
    $queue[] = new Request('GET', $url);
}

// 创建请求池并指定并发限制
$pool = new Pool($client, $queue, [
    'concurrency' => 5,
    'fulfilled' => function (Response $response) {
        echo $response->getBody() . "\n";
    }
]);

// 开始并行处理请求
$pool->promise()->wait();

HTTP リクエストを並列処理することで、現在の実行フローがブロックされないため、応答性を維持しながら処理時間を大幅に短縮できます。

以上がPHP 関数の非同期プログラミングに関する簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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