1

非常に大きなデータ ファイル内から値を返す exec() を使用してコマンドを実行しましたが、何百万回も実行する必要があります。ファイルがループで毎回開かれるのを避けるために、proc_open効率のためにファイルポインタが一度作成されるベースのソリューションに移行したいのですが、これを行う方法がわかりません。

これは、おそらく各反復でファイルを開く必要があるため、機能しますexecが遅いバージョンです。

foreach ($locations as $location) {
    $command = "gdallocationinfo -valonly -wgs84 datafile.img {$location['lon']} {$location['lat']}";
    echo exec ($command);
}

ベースのコードでの私の試みproc_openは次のとおりです。

$descriptorspec = array (
    0 => array ('pipe', 'r'),  // stdin - pipe that the child will read from
    1 => array ('pipe', 'w'),  // stdout - pipe that the child will write to
    // 2 => array ('file', '/tmp/errors.txt', 'a'), // stderr - file to write to
);

$command = "gdallocationinfo -valonly -wgs84 datafile.img";
$fp = proc_open ($command, $descriptorspec, $pipes);

foreach ($locations as $location) {
    fwrite ($pipes[0], "{$location['lon']} {$location['lat']}\n");
    fclose ($pipes[0]);
    echo stream_get_contents ($pipes[1]);
    fclose ($pipes[1]);
}

proc_close ($fp);

これは最初の値を正しく取得しますが、その後の反復ごとにエラーを生成します。

3.3904595375061 

Warning: fwrite(): 6 is not a valid stream resource in file.php on line 11
Warning: fclose(): 6 is not a valid stream resource in file.php on line 12
Warning: stream_get_contents(): 7 is not a valid stream resource in file.php on line 13
Warning: fclose(): 7 is not a valid stream resource in file.php on line 14

Warning: fwrite(): 6 is not a valid stream resource in file.php on line 11
...
4

1 に答える 1

0
  1. プロセスを実行している「ファイルを開く」のではありません。そのプロセスが単一の実行の範囲内で複数のリクエストを処理するように設計されていない場合、それを回避することはできませproc_open()ん。
  2. 次のブロックでは、プロセスの入力パイプと出力パイプの両方を閉じていますが、読み書きができなくなって驚いていますか?

    foreach ($locations as $location) {
        fwrite ($pipes[0], "{$location['lon']} {$location['lat']}\n");
        fclose ($pipes[0]); // here
        echo stream_get_contents ($pipes[1]);
        fclose ($pipes[1]); // and here
    }
    

    そうしないようにしてください。

于 2015-09-25T20:18:45.167 に答える