2012-10-13 54 views
12

我正在爲我的php應用程序(使用CodeIgniter)實現ajax文件上傳。PHP警告拆除JSON響應

我根據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響應中?

+3

無論如何,您應該在生產環境中關閉錯誤... – lonesomeday

+1

@lonesomeday我同意,但指定的行爲「向用戶提供反饋,如果他嘗試上傳過大的文件」應該與生產中的相同開發/測試環境。我不是「是的,但在生產模式下它的作品!」的粉絲! ;) –

+1

第0行的錯誤通常是啓動錯誤,在您的.htaccess中添加'php_flag display_startup_errors off'應該禁用它......將其添加到我的答案中。 – xception

回答

12

在生產服務器上:始終禁用php警告。

在開發計算機: 禁用所有警告該頁面進行測試的宗旨和重新啓用測試完成和功能確認工作後。

提示:我寧願有一個變量全局設置,並取決於啓用或禁用所有PHP和數據庫警告通知。例如,如果你使用apache,你可以在.htaccess中設置它。 我有這樣的.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頭,並檢查從JavaScript既爲JSON輸出和加載你的頁面,並採取一看時,錯誤日誌或在屏幕上顯示錯誤(如果您願意),仍然強烈建議您禁用生產環境中顯示代碼的錯誤。

欲瞭解更多關於此的深入討論,請看this article

+0

我完全同意,但代碼最終應該在'display_errors'設置爲'on'時正常工作。而在這個特定的情況下,這似乎不可能。 –

+0

@BartFriederichs禁用來自php.ini或.htaccess的錯誤報告。這必須工作。在我的答案中添加了代碼。 – xception

+0

@BartFriederichs我建議的兩種方法之一應該工作,檢查我的答案的最後一部分的方式都有一些類型的錯誤報告,它不直接影響您的輸出! – xception

2

可以設置一個用戶定義的錯誤處理程序:http://www.php.net/manual/en/function.set-error-handler.php

還可以使用的輸出緩衝功能,以包裹。 ob_start,ob_end_flush等。

但是,最好在生產系統中將PHP error_reporting設置爲false,然後捕獲錯誤並將其包裝到您的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 

這解決了我的問題。