0

我用 simple_html_dom 库编写了一个图像爬虫,我使用这段代码来获取网站中的所有图像;

include 'simple_html_dom.php';
$img_array = array();
if (isset($_POST['url'])) {
    $url = $_POST['url'];
    $html = file_get_html($url);
    echo $html->getElementByTagName('title')->innertext();
    foreach ($html->find('a') as $a) {

        if (strpos($a->href, $url) !== FALSE) // only images from this site
        {
            //
            //    find_images($a->href);
            $imgs = file_get_html($a->href);
            foreach ($imgs->find('img') as $img) {
                if(!in_array($img->src, $img_array))
                {
                    echo '<img src="' .$img->src. '" class="thumb">';
                    $img_array[] = $img->src;
                }
            }
            echo '<hr>';
        }
    }
}

但是当我执行这段代码时,我得到了Fatal error: Allowed memory size of 209715200 bytes exhausted (tried to allocate 71 bytes) in /home/iphotosh/public_html/test/simple_html_dom.php on line 122

测试和演示:test.iphotoshop.ir

如何修复此错误或如何优化此代码以从网站获取所有图像?

4

3 回答 3

1

您是否尝试过使用 ini_set() 增加内存:

ini_set("memory_limit","256M");
于 2012-06-21T12:56:16.577 回答
1

您应该同时做两件事: 将内存限制设置得非常高:

在 php.ini 中:

memory_limit = 512M

或/和在 php 文件中:

ini_set("memory_limit","512M");

同时,您应该删除大变量以释放一些内存,通常通过:

unset($var);

顺便说一句,您可以通过以下方式检查已用内存量

echo memory_get_usage();

我会尝试运行演示并检查代码的每一行中的内存使用情况,这样你就可以看到这里发生了什么,以及从哪里开始修复

于 2012-06-21T13:22:12.167 回答
0

好像你试图分配太多的内存。您可以尝试增加 php.ini 中的可用内存(查找memory_limit=指令)。然而,如果你分配了很多,你仍然可以超过它。您可以动态检查可用的内容和使用的数量:

function get_available_memory() {
    $ini_mem = ini_get('memory_limit');
    $m = substr($ini_mem, strlen($ini_mem) - 1;
    if($m == 'k' || $m == 'K') {
        $max_mem = 1024 * substr($ini_mem, 0, strlen($ini_mem) - 1);
    }
    elseif($m == 'm' || $m == 'M') {
        $max_mem = 1024 * 1024 * substr($ini_mem, 0, strlen($ini_mem) - 1);
    }
    elseif($m == 'g' || $m == 'M') {
        $max_mem = 1024 * 1024 * 1024 * substr($ini_mem, 0, strlen($ini_mem) - 1);
    }
    else {
        $max_mem = $ini_mem;
    }

    $used_mem = memory_get_usage(true);

    return $max_mem - $used_mem;
}

现在你可以做

$available_memory = get_available_memory();

并且,如果没有足够的可用空间,请不要尝试分配它并优雅地关闭您的进程。

于 2012-06-21T13:01:40.950 回答