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

时间:2015-10-28 15:09:54

标签: php codeigniter

我偶尔遇到一个问题,让网页浏览器显示消息"零大小的回复" (火狐)。 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 - 它永远不会让我感到惊讶。

3 个答案:

答案 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包含两个不同的文件/方法。

  1. 电子邮件助手(我们加载$this->load->library('email');
  2. lang文件支持(我们加载lang.php
  3. 所以这两者结合起来给我们提供了一项服务。

    这是否会影响我的CI项目?

    没有。 Bcz这将加载我们只使用库。

    您可能会问使用图书馆时会挂起吗? 哦,永远不会。打开文件时,您可以看到只有某种错误消息。没有功能, 没有算术的operetions等等。只是和数组值有某种错误。

    不要使用

      var_dump($this->is_loaded);
      var_dump($langfile);
    
    1. 当你有时浏览器挂起时。 Bcz你正在加载一个对象。
    2. 除了不使用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错误日志吗?