我偶尔遇到一个问题,它让webbrowser显示消息"Zero size reply"(Firefox).Chrome显示"ERR_EMPTY_RESPONSE".我正在使用CodeIgniter(仍然是版本2.xx).
在通话中,我验证一些帖子变量,插入数据库记录,并发送电子邮件.但是,电子邮件方法会加载日志消息的语言文件.在此调用结束时,在类system/core/Lang.php中,包含文件并扩展类数组.
以下行(Lang.php,第126行)执行以下语句:
$this->is_loaded[] = $langfile;
Run Code Online (Sandbox Code Playgroud)
数组已初始化,通常运行正常.但在这种特殊情况下,这是导致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;
Run Code Online (Sandbox Code Playgroud)
收到此输出:
array(0) { } string(14) "email_lang.php" I reached here
Run Code Online (Sandbox Code Playgroud)
现在,当我执行此操作时(将数组赋值放在前面):
$this->is_loaded[] = $langfile;
var_dump($this->is_loaded);
var_dump($langfile);
exit("I reached here");
Run Code Online (Sandbox Code Playgroud)
我得到了ERR_EMPTY_RESPONSE
(铬).
当我转储时$this
,这是对象:
object(CI_Lang)#11 (2) { ["language"]=> array(0) { } ["is_loaded"]=> array(0) { } }
Run Code Online (Sandbox Code Playgroud)
当我回到调用函数时,我得到以下行(在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
Run Code Online (Sandbox Code Playgroud)
我在电子邮件加载器前放了以下几行:
$CI =& get_instance();
var_dump($this);
var_dump($CI);
exit();
$CI->lang->load('email');
Run Code Online (Sandbox Code Playgroud)
这会输出整个对象,由于我网站的安全原因,我无法在此处发布.如果您需要特定属性或对象的一部分,我将在此处提供.
我目前还在等待来自我的主机的Apache日志,如果它在这里我会发布它.
更新3:我只是试图简单地再次注释掉该行,但随后脚本在下一行崩溃,这澄清了崩溃与Lang.php类的逻辑完全无关,但似乎是一个更大的阶级的错误(我试图打印出来的内存,但我没有获得许可memory_get_usage()
....
我终于到达了我的主机,它为我提供了apache错误日志,但是没有任何线索说错误.
然而,魔法现在已经完成:在smcjones 回答之后,我添加了这条线
ini_set('display_errors', 1);
Run Code Online (Sandbox Code Playgroud)
在CI的index.php的第一行,并将error_reporting再次设置为E_ALL.但是,只要我使用此行设置运行代码,错误就不会再次发生 - 即使我设置display_errors
为0
.当我再次评论该行时,错误再次发生.此外,当我删除error_reporting(E_ALL)
,错误发生,尽管ini_set .....
我完全不知道用这些行改变了什么,但是看起来像是调用了ini_set()和error_reporting,有些例程可能会被包含在内,否则就会丢失 - 我不知道.
听起来您的日志级别不够高,无法接收非致命错误。如果出现未设置显示的错误,PHP 可以正常关闭。
据我了解,根据您的 CI 配置,您应该会收到错误,但您可能不会收到警告。您收到的任何警告都可以作为线索。
请尝试将其放在文件的顶部(在任何输出和标题之前):
ini_set('display_errors', 1);
error_reporting(E_ALL);
Run Code Online (Sandbox Code Playgroud)
当您刷新浏览器时,您不应收到空白页面。
您可以尝试的另一件事(作为稍微好一点的长期补丁)是:
ini_set('display_errors', 0);
error_reporting(E_ERROR);
Run Code Online (Sandbox Code Playgroud)
如果这有效,那么现在就坚持这样做,因为它不太可能向用户显示您不希望他们看到的内容。
最终,根据使用 PHP 配置函数时的行为变化(不正确),这要么与 Apache 相关,要么与 PHP 配置相关,这是特定于主机的。因为您无法处理您的房东,所以我建议您更换房东(有很多价格实惠的优质房东选择),或者至少告诉您的房东您将无法继续与他们呆在一起,除非他们解决任何问题。