現在の位置: ホーム> 最新記事一覧> Popenを介してプロセスの入力ストリームと出力ストリームを開き、データと対話する方法は?

Popenを介してプロセスの入力ストリームと出力ストリームを開き、データと対話する方法は?

M66 2025-07-07

PHPでは、 Popenは非常に便利な機能であり、プロセスの入力ストリームと出力ストリームを開くために使用できるため、プロセスのデータと対話できます。この機能は、外部コマンドを実行して外部プログラムの呼び出し、スクリプトの実行、他のシステムとの対話など、外部コマンドを実行して出力を取得する必要がある場合に便利です。

Popen機能とは何ですか?

Popen関数は、プロセスを開き、プロセスの入力または出力ストリームへのファイルポインターを返すために使用されます。この関数には2つのパラメーターがあります。

 resource popen(string $command, string $mode);
  • $コマンド:実行するコマンドは通常、シェルコマンドです。

  • $モード:操作モード、 rは読み取りモードを表し、 wは書き込みモードを表し、 r+は読み取りモードと書き込みモードを表します。

例えば:

 $handle = popen("ls -l", "r");

上記のコードはプロセスを開き、 LS -Lコマンドを実行し、プロセスの出力を読み取ることができます。

Popenを介してプロセスと対話する方法は?

Popenの返品値は、ファイルのようなデータを読み取りまたは書き込むことができるファイルポインターです。プロセスと対話する場合、通常、 FreadまたはFGETSを使用してプロセスの出力ストリームからデータを読み取るか、 FWRITEを使用してプロセスの入力ストリームにデータを書き込む必要があります。

1.プロセスからデータを読む

外部コマンドからデータを取得し、それを処理すると仮定します。コードの例は次のとおりです。

 $handle = popen("ls -l", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        echo $line;
    }
    fclose($handle);
} else {
    echo "プロセスを開くことができません";
}

ここでは、 FGETSをループして、出力がなくなるまでプロセス出力の各行を読み取ります。

2。プロセスにデータを書き込みます

プロセスの標準入力ストリームにデータを書き込む必要がある場合は、 PopenWモードを使用して実行できます。

 $handle = popen("sort", "w");
if ($handle) {
    fwrite($handle, "banana\napple\ncherry\n");
    fclose($handle);
} else {
    echo "プロセスを開くことができません";
}

上記のコードはソートコマンドを起動し、標準の入力ストリームにデータを書き込みます。ソートはこのデータをソートします。

3.データの読み取りと書き込み

データを同時に読み書きする必要がある場合は、 R+モードを使用できます。このアプローチは、プロセスとの双方向通信が必要な状況に適しています。

 $handle = popen("tee /tmp/output.txt", "r+");
if ($handle) {
    fwrite($handle, "Hello, world!\n");
    fflush($handle);  // データが書かれていることを確認してください
    while (($line = fgets($handle)) !== false) {
        echo $line;
    }
    fclose($handle);
} else {
    echo "プロセスを開くことができません";
}

この例では、 TEEコマンドを介して/tmp/output.txtファイルにデータを書き込み、プロセスの出力からデータを読み取ります。

Popenを使用してネットワークリクエストを行います

時々、 Popenを介してネットワーク関連のコマンドを実行する必要がある場合があります。 CurlWgetなどのコマンドラインツールを介してリモートリソースをリクエストできます。これは、 Curlを介してWebページを取得する方法を示す例です。

 $handle = popen("curl -s http://m66.net", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        echo $line;
    }
    fclose($handle);
} else {
    echo "プロセスを開くことができません";
}

上記のコードは、 http://m66.netをcurlで要求し、返されたコンテンツを行ごとに出力します。

注意すべきこと

  1. プロセスライフサイクルPopenが開始したプロセスは、PHPスクリプトが実行された後に自動的に閉じられます。リソースの正しいリリースを確保するには、ファイルポインターを閉じるためにスクリプトが終了する前にfcloseを呼び出す必要があります。

  2. セキュリティPopenを使用する場合は注意してください。着信コマンドまたはパラメーターが悪意のあるユーザーによって操作されないことを確認し、コマンドの一部としてユーザー入力を直接使用しないようにしてください。

  3. パフォーマンスPopenはプロセス間通信を促進できますが、特に大量のデータを扱う場合、外部プロセスの頻繁なスタートアップがパフォーマンスに影響を与える可能性があります。

要約します

Popenは、PHPの強力なツールであり、外部プロセスと対話し、出力または入力データを取得できます。さまざまなモードを使用することにより、入力操作と出力操作を同時に読み取り、書き込み、さらには実行することもできます。実際のアプリケーションでは、外部コマンドの実行、ネットワークリクエストの作成、他のプログラムとの通信に特に適しています。