Я выполняю загрузку файла ajax для моего приложения php (используя CodeIgniter).
Я обнаруживаю, что загруженные данные POST имеют большой (> post_max_size) в соответствии с http://andrewcurioso.com/2010/06/detecting-file-size-overflow-in-php/ и пытаются отправить соответствующую 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?
На рабочем сервере: всегда отключите 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 и проверьте, что из javascript как для вывода json, так и при загрузке вашей страницы, и посмотрите на журнал ошибок или отобразите ошибку на экране, если вы этого предпочтете, я настоятельно рекомендую вам отключить ошибку, отображающую код в производственной среды.
Более подробные сведения об этом см. В этой статье .
Вы можете установить пользовательский обработчик ошибок: http://www.php.net/manual/en/function.set-error-handler.php
Вы можете также использовать функции буферизации вывода для ее переноса. ob_start
, ob_end_flush
и другие.
Тем не менее, всегда лучше, чтобы PHP error_reporting
устанавливался в false
в производственных системах, затем ломал ошибки и завернул их в ваш JSON.
У меня была такая же проблема с реализацией сценария загрузки, который требует обратной связи с вызывающим скриптом. Некоторые предупреждения 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
Это решило мою проблему.
Или вы можете просто изменить размер сообщения max в файле php.ini:
post_max_size = 10M //change this line to whatever fits your needs
Но в зависимости от того, что пользователи должны загружать, вы также должны попробовать проверить размер файлов, которые они загружают.