ホームページ  >  記事  >  バックエンド開発  >  PHP の複数のプロセス

PHP の複数のプロセス

王林
王林オリジナル
2023-05-23 08:39:322090ブラウズ

インターネットの発展に伴い、大量のユーザー アクセス リクエストを処理する必要がある Web サイトがますます増えています。高い同時実行性が発生すると、単一プロセス サーバーはすぐにボトルネックに達し、ユーザーが通常どおり Web サイトにアクセスできなくなります。したがって、マルチプロセスは、同時実行性が高い問題を解決するための効果的なソリューションの 1 つとなっています。この記事では、プログラムの品質を確保しながら同時リクエストを処理するプログラムの能力を向上させる、PHP のマルチプロセス テクノロジを紹介します。

1. マルチプロセスの概要

コンピューター サイエンスでは、プロセスとは実行中のプログラム インスタンスを指します。各プロセスには独自のメモリ空間とシステム リソースがあります。マルチプロセッシングとは、1つのプログラム内に複数の処理を作成することを指します。各プロセスは独立して実行され、独自のプロセス番号とプロセス制御ブロックを持ち、相互に干渉しません。マルチプロセス技術は、サーバー ソフトウェア、オペレーティング システム、その他の分野で広く使用されています。

2. PHP でのマルチプロセス

  1. マルチプロセスを実装する方法

PHP でマルチプロセスを実装するには、pcntl 拡張機能を使用できます。またはposix拡張子。どちらの拡張機能も、プロセスの作成、プロセス間通信、シグナル処理などの機能を提供します。

pcntl 拡張子は、プロセスの作成、操作、管理のための多くの関数を提供する PHP のプロセス制御関数ライブラリです。 pcntl関数ライブラリを利用して複数のプロセスを実装すると、プロセスの親子関係、シグナル伝達、リソース共有などを簡単に制御できます。

posix 拡張機能は、pcntl 拡張機能を補足するプロセス制御、信号処理、その他の機能も提供します。また、ファイル操作、システム情報クエリなど、より多くのシステム機能も提供します。

  1. 子プロセスの作成

pcntl_fork() 関数を使用して、PHP で子プロセスを作成します。 fork()関数の戻り値が異なることで親プロセスと子プロセスを区別することができ、親プロセスと子プロセスの区別が実現される。

$pid = pcntl_fork();   // 创建子进程
if ($pid == -1) {
    die('fork failed');
} elseif ($pid == 0) { // 子进程
    // 子进程代码
} else {                // 父进程
    // 父进程代码
}

fork() 関数が呼び出された後、オペレーティング システムは新しい子プロセスを作成します。この時点では、メイン プロセスは引き続き実行でき、子プロセスは fork() 関数の後に実行を開始します。 。子プロセスの pid は 0 で、親プロセスの pid は子プロセスの pid 値です。サブプロセスを作成した後、サブプロセス内で時間のかかる操作を実行したり、いくつかのタスクを並行して実行したりできるため、処理システム全体の同時実行パフォーマンスが向上します。

  1. 子プロセスの終了ステータス

子プロセスの実行が完了したら、その終了ステータスを取得する必要があります。 pcntl_waitpid() 関数の最初のパラメータは子プロセスの終了を待機しているプロセス番号、2 番目のパラメータは子プロセスの終了ステータスが保存される場所です。戻り値が正の場合は、子プロセスが終了したことを意味し、それ以外の場合は、待機中にシグナルによって中断されたことを意味します。

$pid = pcntl_fork();
if ($pid == -1) {
    die('fork failed');
} elseif ($pid == 0) {
    // 子进程
    exit(0); // 子进程退出状态为0
} else {
    // 父进程
    pcntl_waitpid($pid, $status); // 等待子进程退出
    echo $status;   // 输出子进程退出状态
}

3. 実践的なケース

以下では、簡単な実践的なケースを使用して、PHP でマルチプロセス テクノロジを使用する方法を説明します。

複数の URL の内容を取得するスクリプトを実装し、複数のサブプロセスを作成して URL の内容を同時に取得し、取得成功後にその内容をデータベースに保存します。

<?php
// 需要获取的URL列表
$urlList = [
    'https://www.baidu.com/',
    'https://www.qq.com/',
    'https://www.sina.com.cn/',
    'https://www.163.com/',
    'https://www.taobao.com/'
];

// 创建多个子进程并行获取URL内容
foreach ($urlList as $url) {
    $pid = pcntl_fork();
    if ($pid == -1) {
        die('fork failed');
    } elseif ($pid == 0) {
        // 子进程
        $content = file_get_contents($url); // 获取URL内容
        // 保存内容到数据库
        $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
        $stmt = $pdo->prepare("INSERT INTO url_content(url, content) VALUES(?, ?)");
        $stmt->execute([$url, $content]);
        exit(0);
    }
}

// 等待所有子进程执行完毕
while (pcntl_waitpid(0, $status) != -1) {
    // do nothing
}
echo 'All child processes have terminated' . PHP_EOL;

上記のコードでは、foreach を介して $urllist を走査し、複数のサブプロセスを作成して URL コンテンツを並行して取得します。 file_get_contents() 関数を通じて URL コンテンツを取得した後、そのコンテンツをデータベースに保存します。親プロセスでは、while 関数と pcntl_waitpid() 関数を通じて子プロセスの実行が完了するのを待ちます。

4. 注意事項

マルチプロセステクノロジを使用する場合は、次の点に注意する必要があります:

  1. 子プロセスは親プロセスより前に終了する必要があります。終了しない場合は、ゾンビ プロセスが作成されます。
  2. 子プロセスは、親プロセスが作成されたときにのみコピーを作成します。子プロセスによって変更されたコンテンツは親プロセスに影響を与えず、親プロセスによって変更されたコンテンツは子プロセスに影響を与えません。
  3. 子プロセスが作成されると、親プロセスのすべての変数とファイル記述子がコピーされますが、親プロセスによって開かれたストリームはコピーされません。
  4. マルチプロセステクノロジを使用する場合、システムリソースの過剰な消費を避けるために、システムリソースの使用状況を考慮する必要があります。

5. 概要

PHP でマルチプロセス テクノロジを適用すると、同時リクエストを処理するプログラムの能力が効果的に向上します。マルチプロセス技術により、複数のタスクを並列処理することができ、システムの応答速度と同時実行性を向上させることができます。プログラムの品質を確保することを前提として、マルチプロセス技術は効率的でシンプルなソリューションを提供します。

以上がPHP の複数のプロセスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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