Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Maksymalny rozmiar tablicy
Largo
post 21.11.2014, 09:26:16
Post #1





Grupa: Zarejestrowani
Postów: 203
Pomógł: 6
Dołączył: 11.09.2005

Ostrzeżenie: (0%)
-----


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?

Ten post edytował Largo 21.11.2014, 09:26:36
Go to the top of the page
+Quote Post
aniolekx
post 21.11.2014, 09:39:17
Post #2





Grupa: Zarejestrowani
Postów: 340
Pomógł: 46
Dołączył: 31.07.2009
Skąd: A

Ostrzeżenie: (0%)
-----


a jak kończy twój skrypt? blank screen? Ile pamięci masz ustawionej w php.ini ?

zobacz ten artykuł
Go to the top of the page
+Quote Post
Largo
post 21.11.2014, 09:56:56
Post #3





Grupa: Zarejestrowani
Postów: 203
Pomógł: 6
Dołączył: 11.09.2005

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
ikssde
post 21.11.2014, 10:22:06
Post #4





Grupa: Zarejestrowani
Postów: 217
Pomógł: 40
Dołączył: 20.08.2008

Ostrzeżenie: (0%)
-----


Pokaż trochę więcej tego kodu bo po jednej linijce to niewiele można wnioskować.
Go to the top of the page
+Quote Post
Largo
post 21.11.2014, 10:46:16
Post #5





Grupa: Zarejestrowani
Postów: 203
Pomógł: 6
Dołączył: 11.09.2005

Ostrzeżenie: (0%)
-----


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. }
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 15.06.2025 - 07:14