15

PHP アプリケーションに ajax ファイルアップロードを実装しています (CodeIgniter を使用)。

http://andrewcurioso.com/2010/06/detecting-file-size-overflow-in-php/に従って、アップロードされた POST データが大きすぎる (>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 応答内にラップしますか?

4

4 に答える 4

16

本番サーバー: php 警告を常に無効にします。

開発マシン上: テスト目的でそのページのすべての警告を無効にし、テストが完了して機能が動作していることを確認したら再度有効にします。

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

  • 製造:SetEnv DEVELOPMENT Off
  • 発達:SetEnv DEVELOPMENT On

そしてphpコードで:

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

.htaccess 使用からのすべてのエラーを無効にするには

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ヘッダーを設定し、json出力とページの読み込みの両方でjavascriptから確認し、エラーログを確認するか、必要に応じて画面にエラーを表示します。それでも、コードを表示するエラーを無効にすることを強くお勧めします本番環境。

これについての詳細な説明については、この記事をご覧ください。

于 2012-10-13T11:12:08.617 に答える
3

呼び出し元のスクリプトへの通信を必要とするアップロード スクリプトの実装と同じ問題が発生しました。一部の 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

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

于 2014-07-28T12:56:12.413 に答える
2

ユーザー定義のエラー ハンドラを設定できます: http://www.php.net/manual/en/function.set-error-handler.php

出力バッファリング関数を使用してラップすることもできます。ob_startob_end_flushおよびその他。

ただし、運用システムでは PHPerror_reportingを設定しfalse、エラーをキャッチして JSON にラップすることをお勧めします。

于 2012-10-13T11:13:10.930 に答える
0

または、php.ini ファイルで投稿の最大サイズを変更することもできます。

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

ただし、ユーザーが何をアップロードする必要があるかによって、アップロードするファイルのファイル サイズも確認する必要があります。

于 2012-10-13T11:14:54.713 に答える