我用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
如何解决此错误或如何opti,ize此代码以从网站获取所有图像?
答案 0 :(得分:1)
您是否尝试使用ini_set()增加内存:
ini_set("memory_limit","256M");
答案 1 :(得分:1)
你应该同时做两件事: 设置内存限制非常高:
在php.ini中:
memory_limit = 512M
或/和在php文件中:
ini_set("memory_limit","512M");
同时你应该删除大变量以释放一些内存,通常是通过:
unset($var);
顺便说一下,您可以通过
检查已用内存的数量echo memory_get_usage();
我会尝试演示并在代码的每行中检查内存使用情况,这样你就可以看到这里发生了什么,以及从哪里开始修复
答案 2 :(得分:0)
好像你正试图分配太多的内存。您可以尝试增加php.ini中的可用内存(查找memory_limit=
指令)。然而,如果你要分配A LOT,你仍然可以超过它。您可以动态检查可用的内容和使用量:
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();
并且,如果还不够,请不要尝试分配它并优雅地关闭您的流程。