0

simple_html_domライブラリを使用して画像クローラーを作成しました。このコードを使用して、Webサイト内のすべての画像を取得しました。

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

このエラーを修正する方法、またはWebサイトからすべての画像をフェッチするためにこのコードを最適化する方法は?

4

3 に答える 3

1

同時に2つのことを行う必要があります。メモリ制限を非常に高く設定します。

php.iniの場合:

memory_limit = 512M

または/およびphpファイル:

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

同時に、大きな変数を削除してメモリを解放する必要があります。通常は次の方法で行います。

unset($var);

ちなみに使用メモリ量は

echo memory_get_usage();

デモを実行して、コードの各行のメモリ使用量を確認します。これにより、ここで何が起こっているのか、どこから修正を開始できるのかを確認できます。

于 2012-06-21T13:22:12.167 に答える
1

ini_set()を使用してメモリを増やしてみましたか?

ini_set("memory_limit","256M");
于 2012-06-21T12:56:16.577 に答える
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 に答える