4

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 フォルダーに一時ファイルが作成されない

この奇妙な問題についてのアイデアはありますか?

4

1 に答える 1

2

cryptic が言ったように、php セッションのように聞こえるので、php.ini チェックで次の値を確認します。

session.save_path

追加 - -

おそらくセッションファイルではありません。OPと追加のコメントを読み直しました。ファイルがデータをダウンロードするスクリプトによって作成され、スクリプトが完了するとクリーンアップされる場合、問題は何ですか?

また、upload_tmp_dir の設定は HTTP 経由でファイルをアップロードするためのものであるため (デフォルトの php.ini のコメントによると)、おそらくダウンロードとは関係がないことを指摘します。ダウンロードに使用するコードは何ですか? そのコマンドの設定はありますか?

更新しました

/tmp ファイルはダウンロードされたファイルのサイズとタイミングと一致するため、データの照合中にオペレーティング システムがファイルを保存する方法のように見えます。特にファイルが日常的に数ギグである場合は、心配する必要はないと思います。システムRAMを保持するためにディスクにスプールする可能性があります

更新 2

OSが正しくないので、名前を選択したり、tmpファイルを作成したりするのは、PHPの内部のどこかにあるのかもしれません。あなたが言ったことすべてに基づいて、私が見た結論は、ここには問題がないということです。それがPHPの仕組みです。

他のサーバーは tmp ファイルを別の場所に書き込むように設定されている可能性がありますが、検査に使用しているコード スニペットを実際に提供しないと、詳細について誰かがどのように手助けできるかわかりません。

これらの tmp ファイルはどのような問題を引き起こしていますか?

于 2013-01-08T16:40:55.117 に答える