Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Maksymalny rozmiar tablicy
Forum PHP.pl > Forum > PHP
Largo
Witam,

Od pewnego czasu mam pewien kłopot z zachowaniem w skrypcie.
Opisze syuację po krótce - pobieramy dane z MySQL, które pochłaniają jakieś 1.5GB RAM, dużo danych i wiele łączeń, ale zapytanie SQL będzie optymalizowane.

Dodajemy je do tablicy dwuwymiarowej, oto jej struktura:

  1. $array[$block][] = $string;


Dane to HTML.
Problem pojawia się taki, że nagle cały kod się wykonuje, ale giną dane z tej tablicy w klasie. Czy PHP ma jakieś restrykcje w tym temacie? Może brak pamięci RAM czyści tą tablicę i wtedy przez uwolnienie zasobów pamięci skrypt nie kończy błędem 'Out of Memory'?
Może ktoś miał podobną sytuację i coś o tym wie?
aniolekx
a jak kończy twój skrypt? blank screen? Ile pamięci masz ustawionej w php.ini ?

zobacz ten artykuł
Largo
Cytat(aniolekx @ 21.11.2014, 09:39:17 ) *
a jak kończy twój skrypt? blank screen? Ile pamięci masz ustawionej w php.ini ?

zobacz ten artykuł


Wcześniejszy, zapisany blok string'ów jest wyświetlany, ale pozostałe dodane bloki się poddają... Widziałem ten artykuł, spróbuję go zastosować zamiast zwykłych tablic, może się uda. Tylko co może powodować, że wywala wszystko pozostałe? Nagle zwalania 1.5GB RAM, może wtedy wykonuje dalsze operacje?
Dziwi mnie po prostu zachowanie kodu, że wykonuje się, ale jakby się czyści...
ikssde
Pokaż trochę więcej tego kodu bo po jednej linijce to niewiele można wnioskować.
Largo
Cytat(ikssde @ 21.11.2014, 10:22:06 ) *
Pokaż trochę więcej tego kodu bo po jednej linijce to niewiele można wnioskować.


W tym momencie po przypisaniu zmiennych do składowej klasy parsuje się kod do bloku HTML, który zostaje dodany do tablicy. W którymś z tych momentów gubi sie cała tablica z danego $block_path w tablicy.

  1. function parse( $block_path = NULL ) {
  2. // inicjacja zmiennej block_path
  3. $block_path = $block_path ? $block_path : $this->root;
  4.  
  5. // znajdzmy pattern potrzebny do wydobycia poszukiwanego bloku
  6. $pattern = $this->__gen_pattern( $block_path );
  7. // sprawdzam, czy w/g takiego wzoru znajdziemy blok
  8. if ( !preg_match( $pattern, $this->source, $matches ) ) {
  9. $this->__set_error( "Błąd w strukturze szablonu, nie mogę sparsować bloku ( ścieżka: '$block_path' )." );
  10. } else {
  11. // znaleziono blok o podanej sciezce, jego zawartosc to $matches[1];
  12. //sprawdzam czy bylo cos wczesniej parsowane dla tego bloku
  13. if ( empty( $this->blocks[$block_path] ) ) {
  14. // ten blok nie ma w sobie sparsowanych blokow
  15. $this->parsed_string = ( $matches[1] );
  16. } else {
  17. //if ( $block_path == 'table' ) print_r($this->blocks[$block_path] );
  18. // posiada juz jakas zawartosc
  19. // dla wszystkich subblokow tego bloku trzeba wymienic to co miedzy komentarzami na wczesniej sparsowaną zawartosc
  20. foreach ( $this->blocks[$block_path] as $subblock_name => $value ) {
  21. // zamien to co dostalem z matches na sparsowany string wg nazwy dziecka ( $key )
  22. $pattern2 = "/<!--\s+BEGIN\s+BLOCK:\s*" . $subblock_name . "\s+-->(.*)<!--\s+END\s+BLOCK:\s*" . $subblock_name . "\s+-->/s";
  23. $matches[1] = preg_replace( $pattern2, $value, $matches[1] );
  24. // ta zawrtosc jest juz przypisana, nalezy sie jej pozbyc aby sie nie zdublowala
  25. unset( $this->blocks[$block_path][$subblock_name] );
  26. }
  27. // wszystkie wewn bloki zostaly włączone do tego bloku
  28. $this->parsed_string = ( $matches[1] );
  29. }
  30. // czyscimy z blokow ktore w tej iteracji nie beda parsowane
  31. $this->__clear_string( );
  32. // przypisuje zmienne
  33. $this->__assign_vars( );
  34. // tak przygotowany blok zapisuje do tabeli blokow
  35. $this->__save_block( $block_path );
  36. }
  37. }


  1. function __clear_string( ) {
  2. // sprawdzam czy w sparsowanym ciągu są jakieś szablonowe wpisy
  3. preg_match_all( "/<!--\s+BEGIN\s+BLOCK:(.*?)-->/s", $this->parsed_string, $m ) ;
  4. // jesli coś jest, należy je usunąć
  5. if ( !empty( $m[1] ) ) {
  6. foreach ( $m[1] as $block_name ) {
  7. // tworze wzor do usuniecia
  8. $pattern = "/<!--\s+BEGIN\s+BLOCK:\s*" . trim($block_name). "\s+-->.*?<!--\s+END\s+BLOCK:\s*" . trim($block_name) . "\s+-->/s";
  9. $this->parsed_string = trim( preg_replace( $pattern, '', $this->parsed_string ) );
  10. }
  11. }
  12. }


  1. function __assign_vars( ) {
  2. // jesli w parsowanym tekscie są jakies zmienne
  3. // zmienne bez spacji, hotfix dla jquery glownie
  4. if ( preg_match_all( "/{([^\s]*?)}/s", $this->parsed_string, $block_vars ) ) {
  5. // przypisz te z tablicy zmiennych jesli sie zgadaja, lub gdy nie mają
  6. // odpowiednika przypisz ''
  7. foreach ( $block_vars[1] as $var ) {
  8. // wyczysc quote
  9. $pattern = preg_quote( "/{" . trim($var) . "}/" );
  10. // inicializacja
  11.  
  12.  
  13. // przypisuje wartosci z tablicy zmiennych lub ''
  14. if (!preg_match('/\./', trim($var)))
  15. {
  16. // nie ma kropki w nazwie
  17. if ( !isset( $this->vars[$var] ) ) $this->vars[$var] = '';
  18. $this->parsed_string = preg_replace( $pattern, $this->vars[$var], $this->parsed_string );
  19. }
  20. else
  21. {
  22. // jest kropka w nazwie
  23. $exp = explode('.', trim($var));
  24. if ($exp[0] == '_inc')
  25. {
  26. $inc = new rs_template(TPL_INC . $exp[1] . '.tpl');
  27. $this->parsed_string = preg_replace( $pattern, $inc->out(), $this->parsed_string );
  28. } else if ($exp[0] == '__inc')
  29. {
  30. $inc = new rs_template(TPL_INC . $exp[1] . '.tpl');
  31. $this->parsed_string = preg_replace( $pattern, $inc->source, $this->parsed_string );
  32. } else if( $exp[0] == '__ext' )
  33. {
  34. $inc = new rs_template(TPL_EXT . $exp[1] . '.tpl');
  35. $this->parsed_string = preg_replace( $pattern, $inc->source, $this->parsed_string );
  36. } else {
  37. $this->parsed_string = preg_replace( $pattern, $this->vars[$exp[0]][$exp[1]], $this->parsed_string );
  38. }
  39. }
  40. }
  41. }
  42. }



  1. function __save_block( $block_path ) {
  2. // potrzebujemy odzielic rodzica parsowanego bloku
  3. if ( $block_path == $this->root ) {
  4. $this->root_parsed = TRUE;
  5. // okazuje sie ze jest to glowny blok
  6. $this->blocks[$this->root] = ( $this->parsed_string );
  7. } else {
  8. // odzielamy nazwy blokow od siebie
  9. $expath = explode( '.', $block_path );
  10. // zapisuje nazwe dziecka i zdejmuje z ja konca tablicy
  11. $kid = array_pop( $expath );
  12. //
  13. $parent_path = implode( '.', $expath );
  14. // inicjalizacja indexów aby nie bylo NOTICE!
  15. if ( !isset( $this->blocks[$parent_path] ) )
  16. $this->blocks[$parent_path] = '';
  17. if ( !isset( $this->blocks[$parent_path][$kid] ) )
  18. $this->blocks[$parent_path][$kid] = '';
  19. // przypisujemy dzieciaka do tablicy blokow od rodzica
  20. $this->blocks[$parent_path][$kid] .= ( $this->parsed_string );
  21. }
  22. // zmienna przygotowana do nastepnego bloku
  23. $this->parsed_string = '';
  24. }
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.