Web サーバーに問題があります。
/tmp ディレクトリに大きなファイルが作成されることが多いことに気付きました。ファイルは /tmp/phpUNIQUECODE のようなものですが、これらはアップロードではありません。私のphp.ini設定の構成は
upload_tmp_dir = /backup/tmp
upload_max_filesize = 300M
post_max_size = 300M
/tmp 内のファイルは、ファイルのダウンロード中に PHP プロセスによって書き込まれることがわかりました (PHP プロセスは TCP ソケットからファイルを読み取り、出力に書き込みます)。
PHP のマニュアルをいくつか読んだところ、PHP 関数 tmpfile() であることがわかりました。/tmp フォルダーに一時ファイルを作成します (upload_tmp_dir が異なっていても)。しかし、この関数は私のコードでは使用されていません。私のコードでは、ディスクには何も保存されません。
これは何ですか?/tmp フォルダーに一時ファイルを作成できる他の PHP 拡張機能は何ですか?
ありがとう。
更新 1. ダウンロード関数で、ob_start および ob_flush 関数を使用します。ob_flush は、4kb のデータがブラウザにポストされるたびに呼び出されます。
この問題は ob_* 関数に関連していますか?
更新 2. ファイルをダウンロードするために同じ PHP コードを実行する他のサーバーでは、/tmp フォルダーに一時ファイルがないことがわかりました。したがって、これは php.ini 設定または apache 設定に関連している必要があります。また、一時ファイルはダウンロード中のファイルのコピーであることがわかりました。ダウンロードが完了すると、一時ファイルが /tmp フォルダーから削除されます。
更新 3. この問題を切り分けました。これはダウンロードの問題ではないことがわかりました。これは、PHP HTTP ラッパーでファイルを読み取る際の問題です。私のファイルは amazon s3 に保存されています。ファイルをダウンロードするためにソケットを開きます
$fh=fopen('http://s3.amazonaws.com/.....');
次に、ファイルを読み取り、ユーザーのブラウザーに送信します。いくつかのテストを行ったところ、ローカル ソースからの実際のファイルであれば、すべて問題ないことがわかりました。一時ファイルは作成されません。また、他のラッパー - ftp といくつかのカスタム ラッパー (たとえば、ドロップボックスのカスタム ラッパー) でテストしました。そして、すべて問題ありません。
したがって、問題はphp httpラッパーのみであり、私のサーバーの1つだけです(他のサーバーの同じコードは問題ありません)。
この簡単なコードは私の問題を示しています:
$filepath='http://bucket.s3.amazonaws.com/.....';
$_fp=fopen($filepath,'r');
if ($_fp) {
$i=1;
$total=0;
while (!feof($_fp)) {
$tmpbuf=fread($_fp, 4096);
$total+=strlen($tmpbuf);//this is done only to make downloading slower
if($total>=$i*4194304){
$i++;
sleep(1);//just to make downloading slower
}
}
fclose($_fp);
}
最初の行を
$filepath='/path/to/local/file';
その後、すべて問題ありません。/tmp フォルダーに一時ファイルが作成されない
この奇妙な問題についてのアイデアはありますか?