迅速なデバッグと大規模な画像ファイルの効率的な修正のための最良のアプローチアップロード障害

StackOverflow https://stackoverflow.com/questions/3966365

質問

通常のPHPイメージのアップロード機能(AJAXを使用しない)を考えてみると、大きな画像のアップロードが時々故障するという問題が発生します。1つのテストサーバーでは、別のテストサーバーでより頻繁に頻繁に発生します。デバッガーがまだ問題のデバッグを開始していないと仮定し、ファイル/フォルダーの許可の問題はありませんが、どのように進むか?

私が持っていると確信しています file_uploads の上。安全な値を盲目的に設定したり、それが機能するまで値を増やしたりしたくありません。基本的に、私は関係するモジュールに従って、値を正確にすることを望んでいます。それが最良のアプローチである場合、私は関係するモジュールの設定をオーバーライドする準備ができています。

によると ファイルアップロードに関連する設定, 、これらはすべて関連/関連する設定です -
* file_uploads
* upload_max_filesize
* max_input_time
* memory_limit
* max_execution_time
* post_max_size

  1. 関係するスクリプトのパラメーター/値を見つける -
    それらのいずれがどちらであるか/それらの数が実際に私のスクリプトによって違反され、失敗を引き起こしていることを知ることができるように、最初に私のスクリプトの対応する値を見つける必要があります。私のスクリプトの次の値を見つける方法:

    • 合計アップロードされたファイルサイズ
    • 入力時間
    • メモリ使用量
    • スクリプト実行時間
    • 投稿されたデータサイズ

    どのツールを使用できますか。 PHPコードを使用して、いくつかを知ることができると思います。

    • スクリプト実行時間 - 差 microtime(true) スクリプトの開始時と終了時。
    • 合計アップロードされたファイルサイズ-EECHループをオンにします $_FILES の合計を見つける ['size'] 属性

    メモリの使用状況、入力時間などの残りを見つける方法は?

  2. どこ/オーバーライドする方法
    最後に、違反の設定を見つけたら、2つの設定の値を増加/オーバーライドする必要があると仮定します。オーバーライドをどこに適用しますか?設定するのは正しくないと思います memory_limit など。HTACCESSまたはPHPスクリプトのすべてのモジュールについて。むしろ、関係するモジュールにのみ適用する方が良いです。私は正しいですか?

  3. 要求の少ないモジュールの設定
    また、多くのリソースが必要ない他のモジュールの場合、モジュールのリソース要件を慎重に調査した後、設定を削減するために設定をオーバーライドすることは良い/賢明ですか?不必要なリソース消費を削減しますか?もしそうなら、これらの設定の2つまたは3つの組み合わせ(プロジェクトの要件に応じて、通常のスクリプト、ヘビーファイルアプロードの名前に応じて)を持ち、すべてのモジュールに1つの組み合わせをロードするための単一の関数を呼び出してみてください。

  4. Memory_limit注意事項
    それにかんする memory_limit ここで言及されています -

    高すぎる値の設定は非常に危険です。複数のアップロードが同時に処理されている場合、利用可能なメモリはすべて使用され、多くのメモリを消費する他の無関係なスクリプトがサーバー全体にも影響を与える可能性があるためです。

これについてどのような一般的な予防策を講じるべきですか?

ありがとう、
サンディパン

役に立ちましたか?

解決

デバッグのためのいくつかのアイデア:

手動テストのために、ネットサイズ(幅x高さ)が小さなステップで増加するさまざまな寸法の一連の画像を準備します:100 x 100、100 x 200、100 x 300 ....そしてそれらを試してください。ある時点で、問題がメモリの制限である場合、彼らは失敗する可能性があります。オンにすることができます error_reporting() 自分のみ(ある種のデバッグクッキーを使用しているかもしれません)ので、正確に失敗するものがわかります。

それがオプションではない場合、サイズが開始される前に画像の寸法をログファイルまたはテーブルに保存する長期ロギングのために、ある種のメカニズムを設定します。 $_FILES 配列。スクリプトの成功した終わりに、そのエントリに「OK」を追加します。そうすれば、スクリプトに到達した場合、アップロードに失敗したアップロードについて詳しく知ることができます(そして、タイムアウト設定のために事前に失敗しないでください)。

また、多くのリソースが必要ない他のモジュールの場合、設定を削減するために設定をオーバーライドするのが良い/賢明ですか?

答えは常に「いいえ」だと思います。私の知る限り、メモリの制限は、割り当てることができるメモリの最大制限ですが、その量はすべてのリクエストで予約されていません。このようにメモリの制限を微調整している人のことを聞いたことがありません。

ただし、システムの一部(例:画像のリサイザーなど)に非常に高いメモリ制限が必要な場合、特定の適用が賢明かもしれません memory_limit たとえば、それらにのみ設定 a .htaccess 設定.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top