我偶尔遇到一个问题,让网页浏览器显示消息"零大小的回复" (火狐)。 Chrome显示" ERR_EMPTY_RESPONSE"。我正在使用CodeIgniter(仍然是版本2.xx)。
在通话中,我验证了一些帖子变量,插入数据库记录并发送电子邮件。但是,电子邮件方法会加载日志消息的语言文件。在此调用结束时,在类system / core / Lang.php中,包含文件并扩展类数组。
以下行(Lang.php,第126行)执行以下语句:
$this->is_loaded[] = $langfile;
数组已初始化,通常运行正常。但在这种特殊情况下,这是导致PHP服务器崩溃的确切行(我对空转响应的解释)。
我现在正在运行强制PHP 5.5.19,但错误也显示为5.2.17。
有人解释为什么会这样吗?如果我尝试通过以类似方式分配变量来重现错误,我永远不会收到相同的消息。此外,我收到此错误的唯一相似之处是我之前发过邮件。
更新:这是PHP_INFO:http://awesumgrades.ch/phpinfo.php
更新2 :这是我完全尝试的内容:
我试图在该行之前转储所有内容:
var_dump($this->is_loaded);
var_dump($langfile);
exit("I reached here");
$this->is_loaded[] = $langfile;
收到此输出:
array(0) { } string(14) "email_lang.php" I reached here
现在我执行此操作(将数组赋值放在前面):
$this->is_loaded[] = $langfile;
var_dump($this->is_loaded);
var_dump($langfile);
exit("I reached here");
我得到ERR_EMPTY_RESPONSE
(chrome)。
当我转储$this
时,这是对象:
object(CI_Lang)#11 (2) { ["language"]=> array(0) { } ["is_loaded"]=> array(0) { } }
当我回到调用函数时,我得到以下行(在core / libraries / Email.php):
protected function _set_error_message($msg, $val = '')
{
$CI =& get_instance()
$CI->lang->load('email'); // <-- this is the call which gets to the other method
我在电子邮件加载器前放了以下几行:
$CI =& get_instance();
var_dump($this);
var_dump($CI);
exit();
$CI->lang->load('email');
这会输出整个对象,由于我网站的安全原因,我无法在此处发布。如果您需要特定属性或对象的一部分,我将在此处提供。
我目前还在等待来自我的主机的Apache日志,如果它在这里我会发布它。
更新3 :我只是想再次单独注释掉该行,但随后脚本在以下行崩溃,这澄清了崩溃与此完全无关类Lang.php的逻辑,但它似乎是一个更大的类的错误(我试图打印出记忆但我没有memory_get_usage()
的许可......
我终于到达了我的主机,它为我提供了apache错误日志,但没有任何线索说明错误。
然而,魔术现在已经完成:在smcjones' answer之后,我添加了一行
ini_set('display_errors', 1);
在CI的index.php的第一行,并将error_reporting再次设置为E_ALL。但是,只要我使用此行设置运行代码,错误就不会再次发生 - 即使我将display_errors
设置为0
也是如此。当我再次评论该行时,错误再次发生。此外,当我删除error_reporting(E_ALL)
时,错误发生,尽管有ini_set .....
我完全不知道这些线路有什么变化,但似乎有ini_set()和error_reporting的调用,有些例行程序可能会被包括在内,但是我不知道。
它再次说明了magic PHP sometimes can be - 它永远不会让我感到惊讶。
答案 0 :(得分:2)
听起来您的日志级别不足以接收非致命错误。如果存在未设置为显示的错误,PHP可以正常关闭。
我了解您应该根据CI配置收到错误,但您可能没有收到警告。你得到的任何警告都可以作为线索。
请尝试将其放在文件的顶部(在任何输出和标题之前):
ini_set('display_errors', 1);
error_reporting(E_ALL);
刷新浏览器时,不应该收到空白页面。
你可以尝试另一件事,作为一个稍微好一点的长期补丁,是:
ini_set('display_errors', 0);
error_reporting(E_ERROR);
如果这样可行,那么现在就坚持使用它,因为它不太可能向用户显示你不希望他们看到的内容。
最终,基于使用PHP配置函数时(不正确)更改行为,这与Apache相关或PHP配置相关,这是特定于主机的。因为您无法处理您的主机,我建议您切换主机(有很多经济实惠的主机选项),或者至少告诉您的主机,除非他们解决了任何错误,否则您将无法继续使用它们。
答案 1 :(得分:0)
Lang.php
文件用于加载属于我们加载的库和帮助程序的错误消息。
为什么?
Path - `system/language/english`
在上面的路径中(转到email_lang.php
),您会看到有一些错误消息。所以当我们使用图书馆时,
我们使用echo $this->email->print_debugger();
来打印我们能够在浏览器上看到的错误消息。
实际上所有这些错误信息都来自这里。
如何?? 强>
Path - `system/language/english`
在上述路径中,您可以检查是否有多个文件以后缀_lang.php
结尾。所以在lang.php
文件中(您可以在lang.php
- 第65-132行查看)
他们会删除所有后缀_lang
和.php
。所以最后它只用帮助名称加载文件。如果email_lang.php
它将仅返回email
。
最后它会将文件加载到$this->is_loaded[] = $langfile;
,这将设置为print_debugger
任何原因??
作为简单的CI技巧,我们使用$this->email
作为我们的填充目的。实际上在这里email
包含两个不同的文件/方法。
$this->load->library('email');
)lang.php
)所以这两者结合起来给我们提供了一项服务。
这是否会影响我的CI项目?
没有。 Bcz这将加载我们只使用库。
您可能会问使用图书馆时会挂起吗? 哦,永远不会。打开文件时,您可以看到只有某种错误消息。没有功能, 没有算术的operetions等等。只是和数组值有某种错误。
不要使用
var_dump($this->is_loaded);
var_dump($langfile);
dump()
之外,它一点也不好。答案 2 :(得分:-1)
没有太多线索可以解决你的问题:S无论如何,我认为可能你得到了一个PHP错误,并且因为这条线很小我认为问题的原因是你试图添加一个item为不存在的数组。我应该试试:
value = " something like blank or a single space in here "
尝试查找有关该问题的更多信息:
您可以在顶级index.php中启用开发环境吗?
if (is_array($this->is_loaded)) {
$this->is_loaded[] = $langfile;
}
您能启用CodeIgniter探查器吗?
define('ENVIRONMENT', 'development');
你能看看apache错误日志吗?