Witam,
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ę:
<?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 )
{
die ( 'Error: '. $error -> getMessage
() );
}
?>
<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 )
{
die ( 'Error: '. $error -> getMessage
() );
}
if ( isset( $_GET['from'] ) ) $from = $_GET['from'];
else $from = 0;
if ( !isset( $_GET['max'] ) )
{
$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 );
if ( isset( $_GET['number'] ) ) $number = $_GET['number'];
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 );
if ( strpos( $docs_data, 'PDF' ) !== false )
{
$text = substr( $docs_data, strpos( $docs_data, '<div class="dopisek">' ) );
$text = preg_replace( '%href="../../pdf/(.*?).pdf%i', "href='http://bap-psp.lex.pl/serwis/pdf/$1.pdf'", $text );
preg_match( '%<title>(.*?)</title>%i', $text, $name );
$text = iconv( "CP1250", "UTF-8", $text );
$year = $years[ $i ];
$name = iconv( "CP1250", "UTF-8", 'Dziennik Ustaw '.$year.' '.$name[0] );
$stmt -> execute();
++$number;
}
else
{
$text = substr( $docs_data, strpos( $docs_data, '<table class="txs">') );
$text = preg_replace( '%<script(.*?)</html>%i', '', $text );
preg_match( '%Dz.U.[0-9]+.[0-9]+.[0-9]+%', $text, $name );
$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'] );
header( "Location:get_du_mp2.php" );
}
else
{
//print_r( $_GET );
//header("Location:get_du_mp.php?go=1&max=$max&from=$from&number=$number");
echo "<a href='get_du_mp.php?go=1&max=$max&from=$from&number=$number'>Dalej</a>";
}
}
?>
</body></html>
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?
Z góry dziękuję za wszelkie odpowiedzi.
pzdr.
Ten post edytował masterix 25.05.2007, 12:54:03