15

我正在为我的 php 应用程序(使用 CodeIgniter)实现一个 ajax 文件上传。

我根据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 标头并从 javascript 中检查 json 输出和加载页面时检查错误日志或在屏幕上显示错误(如果您愿意),我仍然强烈建议您禁用显示代码的错误生产环境。

有关此问题的更深入讨论,请查看这篇文章

于 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等。

但是,最好在生产系统中error_reporting设置PHP 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 回答