2012-10-13 18 views
12

私はPHPアプリケーション(CodeIgniterを使用)にajaxファイルアップロードを実装しています。PHP警告でJSON応答が破棄されます

アップロードされたPOSTデータがhttp://andrewcurioso.com/2010/06/detecting-file-size-overflow-in-php/に基づいて大きい(> post_max_size)かどうかを検出し、適切なJSONエンコードエラー応答を送信しようとします。

しかし、出力に含まれている対応するPHP警告は、私のJSON応答を完全に破壊します!

<br /> 
<b>Warning</b>: POST Content-Length of 105906405 bytes exceeds the limit of 8388608 bytes in <b>Unknown</b> on line <b>0</b><br /> 
[{"error":"Posted data is too large. 105906405 bytes exceeds the maximum size of 8388608 bytes."}] 

私はクライアント側で警告を解析してフィルタリングしたくないと思っています。それは醜いようです。 すべてのphp警告をグローバルに無効にするのは不適切です。

php関数のコンテキストで特定のPHP警告を無効にすることはできますか?それとも有効なjsonレスポンスの中にラップしますか?

+3

とにかくプロダクション環境でエラーがオフになっているはずです... – lonesomeday

+1

@lonesomeday私は同意しますが、指定された動作は「ユーザーにフィードバックしても大きすぎるファイルをアップロードしようとすると、プロダクションと開発/テスト環境私は「さようなら」のファンではないが、プロダクションモードでは機能する! ;) –

+1

通常、0行目のエラーはスタートアップエラーです。.htaccessに 'php_flag display_startup_errors off'を追加すると、それを無効にする必要があります。 – xception

答えて

12

プロダクションサーバの場合:常にPHPの警告を無効にします。

開発マシン上で: 無効化テストの目的のためにそのページのすべての警告およびテストが完了し、作業であることが確認された機能である後に再度有効にします。

ヒント:変数をグローバルに設定し、それに応じてすべてのPHPとデータベースの警告通知を有効または無効にすることをお勧めします。たとえば、Apacheを使用している場合は、.htaccessに設定できます。 私は.htaccessでこれを持っている:

  • 生産:SetEnv DEVELOPMENT Off
  • 開発:

    if(strtolower(getenv('DEVELOPMENT')) == "on") { 
         ini_set("display_errors",2); 
         ini_set('error_reporting', E_ALL | E_STRICT); 
    } 
    

    は.htaccessの使用

    からすべてのエラーを無効にするには:

とPHPコードでSetEnv DEVELOPMENT On

php_flag display_startup_errors off 
php_flag display_errors off 
php_flag html_errors off 
php_value docref_root 0 
php_value docref_ext 0 

あなたが本当にトリッキー取得したい場合は以下のようにチェックを追加することができます。

if(error_get_last() !== null) 

とHTTPヘッダを設定し、JavaScriptからJSON出力用とするとき、ページをロードの両方いることを確認して見てみましょうエラーログを表示したり、エラーを画面に表示したりすることはできますが、運用環境ではエラーを表示しないようにすることを強くお勧めします。

この詳細については、this articleをご覧ください。

+0

私は完全に同意しますが、コードは最終的に 'display_errors'が' on'に設定された状態で正常に動作するはずです。そして、この特定のケースでは、それは可能ではないようです。 –

+0

@BartFriederichs php.iniまたは.htaccessからのエラー報告を無効にします。それはうまくいきます。私の答えにそのコードを追加しました。 – xception

+0

@BartFriederichs私が提案した2つの方法のうちの1つは、何らかのエラー報告をし、直接あなたの出力に影響を与えない方法のために、私の答えの最後の部分をチェックしてください! – xception

2

あなたは、ユーザー定義のエラーハンドラを設定することができます。http://www.php.net/manual/en/function.set-error-handler.php

あなたはまた、それをラップするために出力バッファリング機能を使用することができます。 ob_start,ob_end_flushなどが挙げられる。

しかし、本番システムではPHP error_reportingfalseに設定し、エラーを捕捉してJSONでラップするのが最善の方法です。

+0

私はカスタムイベントハンドラを使用したいと思いますが、投稿されたリンクのドキュメントは次のように書かれています: >スクリプトが実行される前にエラーが発生した場合(ファイルのアップロードなど)、カスタムエラーハンドラはその時。 –

+0

良い。あなたの特定の問題は、スクリプトの問題よりもサーバー中心の問題であるようです。私が今考えることのできる唯一の素早いことは、スクリプト内の警告を無効にすることです。 –

0

それとも、ただphp.iniファイルにポストの最大サイズを変更することができます。

post_max_size = 10M //change this line to whatever fits your needs 

しかし、ユーザーがアップロードしなければならないものに応じて、あなたはまた、彼らは「ファイルのファイルサイズをチェックしてみてください再アップロードする。

+2

しかし、これは、ユーザーが "post_max_size + 1"のサイズのファイルを送信することを妨げるものではありません。 –

2

私はちょうど同じ問題を呼び出しスクリプトに通信を必要とアップロードスクリプトを実装していた。いくつかのPHP警告は、出力応答を破損していました。

私はphp出力のバッファリング機能に頼っています。これは私が警告出力メッセージを取り除く方法です:

ob_start(); // start output buffering (we are at the beginning of the script) 

[ ... ] // the script actual functionality is unchanged 

ob_end_clean(); // this clears any potential unwanted output 

exit($my_json_encoded_response); // and this just outputs my intended response 

これは私の問題を解決しました。

関連する問題