【问题标题】:Simple HTML DOM causes memory exhaustion when included简单的 HTML DOM 包含时会导致内存耗尽
【发布时间】:2013-07-24 16:59:42
【问题描述】:

我有一个包含几个包含的模板,并将Simple HTML DOM 用于各种任务。

当我包含库时,在某些页面上出现以下错误:

致命错误:允许的内存大小为 134217728 字节已用尽(已尝试 在 C:\xampp\htdocs\aa\template.php 中分配 28672 字节)在线 142

这是我在模板中的 php 代码:

<?php
$currentFile = $_SERVER["PHP_SELF"];
$parts = Explode('/', $currentFile); 
$page = $parts[count($parts) - 1];
$parent = basename(dirname($_SERVER['PHP_SELF']));
$both = $parent.'/'.$page;
$content = $filename.".html";
$sidebar = $filename. "-sidebar.html";

?>
<?php include('dom.php'); ?>
<?php 

if (!isset($title)) {
$html = file_get_html($_SERVER['DOCUMENT_ROOT'].'/aa/content/'.$content);

$element = $html->find('h1'); 
if ($element) {
$titletag = $element[0]->plaintext . ' | about-berlin.com';
}

    }
else {
$titletag = $title; 
}
$html->__destruct();
?>
<!DOCTYPE html>

奇怪的是,即使我只包含这样的库,而没有任何代码使用它,我也会遇到同样的内存错误:

<?php include('dom.php'); ?>

如果我不包含它,一切都会正常运行。

即使不使用似乎是造成大多数问题的原因的file_get_html(),怎么可能得到这个错误?我可以在不更改 php.ini 的情况下尝试解决此问题吗?

编辑

一些澄清。我的模板是这样工作的:

somepage.php 被请求。 里面是如下代码:

<?php 
$path_parts = pathinfo(__FILE__);
$filename = $path_parts['filename'];

include ($_SERVER['DOCUMENT_ROOT'].'/aa/template.php');
?>

在模板中,同名的内容文件 (somepage.php) 包含在名为 content 的文件夹中。

【问题讨论】:

  • template.php 的第 142 行是什么代码?首先你应该尝试 include_once 或 require_once 文件,所以它不会被双重包含。
  • 第 142 行是结束 li 标签。但是 dom.php 被包含在那里,所以实际上可能第 142 行在里面?
  • 您是否在循环中调用该脚本?你在哪里定义 $content?请更新您的第一篇文章,让我们看看更多代码...
  • 我更新了我的问题,脚本不在循环内,但模板包含在请求的文件中。在模板内包含 dom 和内容
  • 问题仅出现在其中一个文件夹中,但在我的其他文件夹中均未出现...该文件夹似乎有问题?!

标签: php memory-leaks simple-html-dom


【解决方案1】:

试试

$html->clear(); 
unset($html);

内存泄漏是由于 php5 循环引用内存泄漏造成的

 ?>
<?php include('dom.php'); ?>
<?php 

可以替换为

include('dom.php');

只是为了保持清洁:)

【讨论】:

    【解决方案2】:

    更换你的

    include(…);
    

    include_once(…);
    

    将阻止您的脚本包含多个脚本。如果你需要一个脚本来让它工作,你应该使用

    require_once(…);
    

    我认为您的 dom.php 还包含其他内容。也许在包含显示代码的脚本中。 另一件事是您应该删除从 opening-php-tags 跟随的关闭 php-tags 以使代码更具可读性。类似的东西

    ?>
    <?php
    

    不是必需的。

    【讨论】:

      【解决方案3】:

      你可以在.htaccess中试试

      <IfModule mod_php5.c>
      php_value memory_limit 64M
      </IfModule>
      

      【讨论】:

      • 我认为允许的 128MB 内存对于脚本来说应该足够了 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 2012-12-09
      • 2019-05-16
      • 1970-01-01
      • 2010-09-15
      相关资源
      最近更新 更多