Przy wykonywaniu skryptu dostaję taki błąd:
Cytat
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 7577913 bytes)
Widziałem na forum już podobne tematy i problemy z tym jednak nie pomogło mi ich przeczytanie. Pobieram dane ze zdalnej strony i zawsze po ponad 700 stronach wywala mi się:
Wszystko się wykonuje w pętli, stron jest około 20000 jednak już przed tysiącem się sypie. W inym skrypcie podobnie pobierałem dane, rekordów było 7000 i pobrało. W czym jest problem? A może trzeba do tego zagadnienia zupełnie inaczej podeść? Jeśli tak to jak?
<?php require_once( '../inc/config.php' ); echo '<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Instalator</title> </head> <body xml:lang="pl">'; try { $pdo = new PDO('mysql:host=localhost;dbname='.$db, $user, $pass); $pdo -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); } catch( PDOException $error ) { } ?> <p>Witam w instalatorze skryptu.<br /><br /> Pobieranie danych ze zdalnego serwera może potrwać długo, mimo że zostało podzie
lone na kilka etapów. Każdy etap może potrwać nawet kilkadzisiąt minut dlatego pr
oszę o uzbrojenie się w cierpliwość a następnie naciśnięcie przycisku DALEJ.</p> <form action="get_du_mp.php" method="post"> <input type="submit" name="go" value="Dalej"> </form> <?php } else { try { $pdo = new PDO('mysql:host=localhost;dbname='.$db, $user, $pass); $pdo -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); } catch( PDOException $error ) { } else $from = 0; { $stmt_tmp = $pdo -> prepare( 'SELECT id FROM `tmp_mp_du` WHERE type = "du"'); $stmt_tmp -> execute(); $max = $stmt_tmp -> rowCount(); $stmt_tmp -> closeCursor(); } $stmt = $pdo -> prepare( 'SELECT `url`, `year` FROM `tmp_mp_du` WHERE `type` = "du" LIMIT '.$from.', 500' ); //$stmt -> bindValue( ':from', $from, PDO::PARAM_INT ); $stmt -> execute(); while ( $row = $stmt -> fetch() ) { $results[] = $row['url']; $years[] = $row['year']; } $stmt -> closeCursor(); $stmt = $pdo -> prepare( 'INSERT INTO `documents`( id, type, name, year, number, text ) VALUES( null, "Dziennik Ustaw", :name, :year, :number, :text ) ' ); $stmt -> bindParam( ':name', $name, PDO::PARAM_STR ); $stmt -> bindParam( ':year', $year, PDO::PARAM_INT ); $stmt -> bindParam( ':number', $number, PDO::PARAM_INT ); $stmt -> bindParam( ':text', $text ); else $number = 1; $i = 0; foreach( $results as $match ) { $cr_tmp = curl_init( $match ); curl_setopt( $cr_tmp, CURLOPT_RETURNTRANSFER, TRUE ); $docs_data = curl_exec( $cr_tmp ); curl_close( $cr_tmp ); //preg_match( '%<table[^>]class="txs">(.*?)<div[^>]class="nagl">%i', $docs_data, $match ); { $text = preg_replace( '%href="../../pdf/(.*?).pdf%i', "href='http://bap-psp.lex.pl/serwis/pdf/$1.pdf'", $text ); $text = iconv( "CP1250", "UTF-8", $text ); $year = $years[ $i ]; $name = iconv( "CP1250", "UTF-8", 'Dziennik Ustaw '.$year.' '.$name[0] ); $stmt -> execute(); ++$number; } else { $text = iconv( "CP1250", "UTF-8", $text ); $year = $years[ $i ]; $name = iconv( "CP1250", "UTF-8", 'Dziennik Ustaw '.$year.' '.$name[0] ); $stmt -> execute(); ++$number; } ++$i; } $stmt -> closeCursor(); $from = $from + 500; //$_GET['number']; if ( $max < $from ) { //unset( $_GET['max'] ); } else { //print_r( $_GET ); //header("Location:get_du_mp.php?go=1&max=$max&from=$from&number=$number"); } } ?> </body></html>
Z góry dziękuję za wszelkie odpowiedzi.
pzdr.