3

通常の PHP 画像アップロード機能 (AJAX を使用しない) を考えてみると、大規模な画像のアップロードがときどき失敗するというこの問題が発生します。あるテスト サーバーではそれほど頻繁ではなく、別のテスト サーバーではより頻繁に失敗します。デバッガーがまだ問題のデバッグを開始しておらず、ファイル/フォルダーのアクセス許可の問題がないと仮定すると、どのように処理を進めればよいでしょうか?

私は持っていると確信していfile_uploadsます。やみくもに安全な値を設定したり、機能するまで値を増やしたりしたくありません。基本的に、関連するモジュールとまったく同じ値にしたいと考えています。それが最善の方法である場合、関連するモジュールの設定を上書きする準備ができています。

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

  1. 関連するスクリプトのパラメーター/値の検索-スクリプト
    によって実際に違反され、失敗の原因となっているパラメーター/値を見つけるには、まずスクリプトに対応する値を見つける必要があります。私のスクリプトの次の値を見つける方法:

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

    同じ目的で使用できるツール。PHP コードを使用すると、いくつかのことがわかると思います。

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

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

  2. どこで/どのようにオーバーライドするか
    最後に、違反している設定を見つけたら、2 つの設定の値を増やす/オーバーライドする必要があるとします。オーバーライドを適用する場所 memory_limithtaccessやPHPスクリプトで全てのモジュールに対してetc.を設定するのは正しくないと思います。むしろ、該当するモジュールのみに適用する方がよいでしょう。私は正しいですか?

  3. 要求の少ないモジュールの設定
    また、多くのリソースを必要としない他のモジュールについては、モジュールのリソース要件を慎重に検討した後、それらを削減するために設定をオーバーライドすることは良い/賢明ですか? 不要なリソース消費を削減できますか? もしそうなら、これらの設定の 2 つまたは 3 つの組み合わせ (プロジェクトの要件に応じて、通常のスクリプト、重いファイルのアップロードと名付けます) を用意し、単一の関数を呼び出して、すべてのモジュールの任意の組み合わせをロードするのはどうですか?

  4. memory_limit 注意事項
    ここで言及されていること についてmemory_limit-

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

これについてどのような一般的な予防措置を講じますか?

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

4

1 に答える 1

1

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

手動でテストするには、正味サイズ (幅 x 高さ) が 100 x 100、100 x 200、100 x 300 .... のように少しずつ大きくなるさまざまなサイズの一連の画像を用意して試してみます。問題がメモリ制限である場合、ある時点で失敗し始める可能性があります。自分でのみ有効にすることができるerror_reporting()ので (おそらく何らかのデバッグ Cookie を使用して)、正確に何が失敗するかを確認できます。

$_FILESそれができない場合は、サイズ変更が開始される前に画像のサイズと配列の内容をログ ファイルまたはテーブルに保存する、長期的なログ記録のための何らかのメカニズムをセットアップします。スクリプトが正常に終了したら、そのエントリに「OK」を追加します。そうすれば、失敗したアップロードがスクリプトに到達した場合に、失敗したアップロードについて詳しく知ることができます (タイムアウト設定のために事前に失敗することはありません)。

また、多くのリソースが必要とされない他のモジュールの場合、設定をオーバーライドしてそれらを削減することは良い/賢明ですか

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

ただし、システムの一部 (画像リサイザなど) が非常に高いメモリ制限を必要とする場合は、設定などを使用して特定の設定をそれらにのみ適用することを勧めmemory_limitします。.htaccess

于 2010-10-19T11:11:22.203 に答える