Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Fatal error
Forum PHP.pl > Forum > PHP
masterix
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ę:
  1. <?php
  2.  
  3.  
  4. require_once( '../inc/config.php' );
  5.  
  6.  
  7.  
  8. echo '<?xml version="1.0" encoding="utf-8"?>
  9.  
  10. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  11.  
  12. <html xmlns="http://www.w3.org/1999/xhtml">
  13.  
  14. <head>
  15.  
  16. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  17.  
  18. <title>Instalator</title>
  19.  
  20. </head>
  21.  
  22. <body xml:lang="pl">'; 
  23.  
  24. try
  25.  
  26. {
  27.  
  28. $pdo = new PDO('mysql:host=localhost;dbname='.$db, $user, $pass);
  29.  
  30.  
  31.  
  32. $pdo -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
  33.  
  34.  
  35.  
  36. }
  37.  
  38. catch( PDOException $error )
  39.  
  40. {
  41.  
  42. die ( 'Error: '. $error -> getMessage() );
  43.  
  44. }
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  ?>
  51.  
  52. <p>Witam w instalatorze skryptu.<br /><br />
  53.  
  54. 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>
  55.  
  56. <form action="get_du_mp.php" method="post">
  57.  
  58. <input type="submit" name="go" value="Dalej">
  59.  
  60. </form>
  61.  
  62.  <?php
  63.  
  64. }
  65.  
  66. else
  67.  
  68. {
  69.  
  70. try
  71.  
  72. {
  73.  
  74. $pdo = new PDO('mysql:host=localhost;dbname='.$db, $user, $pass);
  75.  
  76.  
  77.  
  78. $pdo -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
  79.  
  80.  
  81.  
  82. }
  83.  
  84. catch( PDOException $error )
  85.  
  86. {
  87.  
  88. die ( 'Error: '. $error -> getMessage() );
  89.  
  90. }
  91.  
  92. if ( isset( $_GET['from'] ) ) $from = $_GET['from'];
  93.  
  94. else $from = 0;
  95.  
  96. if ( !isset( $_GET['max'] ) )
  97.  
  98. {
  99.  
  100. $stmt_tmp = $pdo -> prepare( 'SELECT id FROM `tmp_mp_du` WHERE type = "du"');
  101.  
  102. $stmt_tmp -> execute();
  103.  
  104. $max = $stmt_tmp -> rowCount();
  105.  
  106. $stmt_tmp -> closeCursor();
  107.  
  108. }
  109.  
  110.  
  111.  
  112. $stmt = $pdo -> prepare( 'SELECT `url`, `year` FROM `tmp_mp_du` WHERE `type` = "du" LIMIT '.$from.', 500' );
  113.  
  114. //$stmt -> bindValue( ':from', $from, PDO::PARAM_INT );
  115.  
  116. $stmt -> execute();
  117.  
  118. $results = array();
  119.  
  120. $years = array();
  121.  
  122. while ( $row = $stmt -> fetch() )
  123.  
  124. {
  125.  
  126. $results[] = $row['url'];
  127.  
  128. $years[] = $row['year'];
  129.  
  130. }
  131.  
  132. $stmt -> closeCursor();
  133.  
  134.  
  135.  
  136. $stmt = $pdo -> prepare( 'INSERT INTO `documents`( id, type, name, year, number, text ) VALUES( null, "Dziennik Ustaw", :name, :year, :number, :text ) ' );
  137.  
  138. $stmt -> bindParam( ':name', $name, PDO::PARAM_STR );
  139.  
  140. $stmt -> bindParam( ':year', $year, PDO::PARAM_INT );
  141.  
  142. $stmt -> bindParam( ':number', $number, PDO::PARAM_INT );
  143.  
  144. $stmt -> bindParam( ':text', $text );
  145.  
  146. if ( isset( $_GET['number'] ) ) $number = $_GET['number'];
  147.  
  148. else $number = 1;
  149. $i = 0;
  150.  
  151. foreach( $results as $match )
  152.  
  153. {
  154.  
  155. $cr_tmp = curl_init( $match );
  156.  
  157. curl_setopt( $cr_tmp, CURLOPT_RETURNTRANSFER, TRUE );
  158.  
  159. $docs_data = curl_exec( $cr_tmp );
  160.  
  161. curl_close( $cr_tmp );
  162.  
  163. //preg_match( '%<table[^>]class="txs">(.*?)<div[^>]class="nagl">%i', $docs_data, $match );
  164.  
  165. if ( strpos( $docs_data, 'PDF' ) !== false )
  166.  
  167. {
  168.  
  169. $text = substr( $docs_data, strpos( $docs_data, '<div class="dopisek">' ) );
  170.  
  171. $text = strip_tags( $text, '<div><a>' );
  172.  
  173. $text = preg_replace( '%href="../../pdf/(.*?).pdf%i', "href='http://bap-psp.lex.pl/serwis/pdf/$1.pdf'", $text );
  174.  
  175. preg_match( '%<title>(.*?)</title>%i', $text, $name );
  176.  
  177. $text = iconv( "CP1250", "UTF-8", $text );
  178.  
  179. $year = $years[ $i ];
  180.  
  181. $name = iconv( "CP1250", "UTF-8", 'Dziennik Ustaw '.$year.' '.$name[0] );
  182.  
  183. $stmt -> execute();
  184.  
  185. ++$number;
  186.  
  187. }
  188.  
  189. else
  190.  
  191. {
  192.  
  193. $text = substr( $docs_data, strpos( $docs_data, '<table class="txs">') );
  194.  
  195. $text = preg_replace( '%<script(.*?)</html>%i', '', $text );
  196.  
  197. preg_match( '%Dz.U.[0-9]+.[0-9]+.[0-9]+%', $text, $name );
  198.  
  199. $text = iconv( "CP1250", "UTF-8", $text );
  200.  
  201. $year = $years[ $i ];
  202.  
  203. $name = iconv( "CP1250", "UTF-8", 'Dziennik Ustaw '.$year.' '.$name[0] );
  204.  
  205. $stmt -> execute();
  206.  
  207. ++$number;
  208.  
  209. }
  210. ++$i;
  211.  
  212. }
  213.  
  214. $stmt -> closeCursor();
  215.  
  216. $from = $from + 500;
  217.  
  218. //$_GET['number'];
  219.  
  220. if ( $max < $from )
  221.  
  222. {
  223.  
  224. //unset( $_GET['max'] );
  225.  
  226. header( "Location:get_du_mp2.php" );
  227.  
  228. }
  229.  
  230. else 
  231.  
  232. {
  233.  
  234. //print_r( $_GET );
  235.  
  236. //header("Location:get_du_mp.php?go=1&max=$max&from=$from&number=$number");
  237. echo "<a href='get_du_mp.php?go=1&max=$max&from=$from&number=$number'>Dalej</a>";
  238.  
  239. }
  240.  
  241.  
  242.  
  243. }
  244.  
  245. ?>
  246.  
  247. </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.
zibra
Nie zagłębiałem isę w Twój kod, ale miałem ten sam błąd przy uploadowaniu obrazków przez php i u mnie pomogło dodanie funkcji imagedestroy(); może spróbuj powywalać na końcu pętli niepotrzebne dane w zmiennych czy tablicach?
masterix
Nie pomogło, nadal dokłądnie ten sam błąd.
thornag
W php.ini zwieksz maksymalna pamiec jaka skrypt moze wykorzystac. Jesli nie masz dostepu do php.ini popros administratora. Z drugiej strony jesli to jednorazowa operacja moze odpal z konsoli ?
masterix
Nie mogę limitu zmienić, już próbowałem.

Jeśli odpalę z konsoli to ten limit mnie nie obowiązuje? Jeśli tak to możesz mnie krótko poinstruować jak to zrobić? Dostęp do shella mam.

pzdr.
thornag
E tego rozwiazania nie jestem pewien, aczkolwiek jesli odpalasz skrypt z konsoli to robisz to bez posrednictwa serwera http,

man php

o ile dobrze pamietam
# php -e plik.php

Moge sie mylic nie mam teraz jak sprawdzic sad.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.