零大小的回复:PHP在变量赋值时崩溃

Flo*_*ler 6 php codeigniter

我偶尔遇到一个问题,它让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_errors0.当我再次评论该行时,错误再次发生.此外,当我删除error_reporting(E_ALL),错误发生,尽管ini_set .....

我完全不知道用这些行改变了什么,但是看起来像是调用了ini_set()和error_reporting,有些例程可能会被包含在内,否则就会丢失 - 我不知道.

它再一次说明了PHP有时可能是多么神奇 - 它永远不会让我感到惊讶.

smc*_*nes 2

听起来您的日志级别不够高,无法接收非致命错误。如果出现未设置显示的错误,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 配置相关,这是特定于主机的。因为您无法处理您的房东,所以我建议您更换房东(有很多价格实惠的优质房东选择),或者至少告诉您的房东您将无法继续与他们呆在一起,除非他们解决任何问题。