如何调试内存不足的问题

时间:2011-03-14 21:10:35

标签: php

您好 我有一个脚本,它返回存储在mysql表中的所有记录。这个脚本在我的xampp服务器上工作得非常好,它有一个标准的128MB内存限制。

致命错误:第37行的/websites/LinuxPackage02/nw/cc/_u/nwcc-uk.org/public_html/code/Article.php内存不足(分配524288)(试图分配4294967294字节)

但是当它上传到网络融合myserverworld平台时,它会崩溃。我该如何调试这样的问题?为什么要分配4GB的内存?奇怪的是,我的开发服务器只有2GB,所以怎么能分配4.

  public function getActivity($id,$language='ch')
    {

    $mysqli = new Database();
        $mysqli->connect();

    $mysqli->query("SET character_set_results=utf8");   
    $sql = ($language == 'ch') ? 'SELECT id,title,text,date,author FROM article_chinese WHERE id=?': 'SELECT id,title,text,date,author FROM article_english WHERE id=?';
      if ($stmt = $mysqli->prepare("$sql")) {
          $stmt->bind_param("i", $id);
              /* execute query */
          $stmt->execute();

          /* bind result variables */
          $stmt->bind_result($id,$title,$text,$date,$author);

          /* fetch value */
          $stmt->fetch();
          $results = array($id,$title,$text,$date,$author);
          $stmt->close();
          $mysqli->close();
          return $results;
    /* close statement */


      }
    }

2 个答案:

答案 0 :(得分:0)

它试图准确分配4GB(4294967294/1024/1024/1024 = 4)的内存这一事实令人怀疑。 Article.php中第37行的内容是什么,以及它尝试从数据库中获取多少行?

答案 1 :(得分:0)

我偶尔会遇到同样的问题,我偶然发现了这个帖子在php.net:

  

andrey在php dot net 07-Oct-2005 12:38

     

如果您选择LOB,请使用以下执行顺序,否则您将面临风险   mysqli分配更多实际使用的内存

     

1)prepare()2)execute()3)store_result()4)bind_result()

     

如果你跳过3)或交换3)和4)那么mysqli将分配内存   对于最小长度的列,255为tinyblob,64k   对于blob(仍然可以),对于MEDIUMBLOB来说是16MByte - 非常多,4G用于   LONGBLOB(如果你有这么多记忆,那就好了)。使用此查询   当有LOB时订购有点慢,但这不是价格   在几秒钟内内存耗尽。

这解释了为什么它试图分配如此多的内存;我猜你的一个领域是一个blob?然后解决方案(正如您自己写的那样)是在绑定结果之前使用store_result()