ストリーム処理の実装でstream_filter_appendを使った際に環境によって動きが異なる現象が起こりました。
解決法は色々試した結果見つかりましたが、コードの意味が理解できませんでした。
S3からgzファイルを取得し、ストリーム処理を行おうとした時に発生した現象です。下記のコードのように実装した際にローカル環境(docker)上では正常に全行処理することができました。しかし、EC2上に作った同じバージョンのPHPで実行した時に10行ほど処理した後にfgetsでfalseが帰ってくるようになり、処理が終わるという現象にぶつかりました。
リンクを参考に["window" => 31]にするとEC2上でも動くようになりましたが、そもそもstream_filter_appendの第4引数の役割がドキュメントの説明で理解できていません。
PHP:圧縮フィルタにも書いてありますが、圧縮用ループバックウィンドウが32で動かず、31で動いた理由。また、環境によってはwindow=32でも動いた理由がわかる方がいましたら、ご教授願いたいです。
よろしくお願いいたします。
実装
$s3 = new Aws\S3\S3Client([ 'credentials' => [ 'key' => $_ENV['AWS_ACCESS_KEY_ID'], 'secret' => $_ENV['AWS_SECRET_ACCESS_KEY'], ], 'version' => 'latest', 'region' => 'ap-northeast-1', ]); $s3->registerStreamWrapper(); $key = "key.gz"; $stream = fopen('s3://'.$_ENV['S3_BUCKET'].'/'.$key, "r"); stream_filter_append( $stream, 'zlib.inflate', STREAM_FILTER_READ, ["window" => 32] ); while ($line = fgets($stream)) { var_dump($line); }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/21 02:54
2021/07/21 03:12 編集
2021/07/21 03:36
2021/07/21 05:16