Podstawy debugowania sklepu Magento

81

Jak mogę debugować mój sklep Magento

To pytanie nie jest dla nas zbyt istotne, ale gdyby strona Magento SE istniała 5 lat temu, prawdopodobnie byłaby to nasze pierwsze pytanie. Dla tych, którzy dopiero zaczynają przygodę z Magento lub go nie znają - znajomość podstaw debugowania może być kluczem do wykluczenia przyczyny problemów. I pomimo tego, że teraz jest dla nas nieistotny, przeczymy temu pytaniu, które pojawia się samo z siebie.

Pomóż mojej stronie nie działa!

  1. Czy mój projekt jest winny?
  2. Czy wystąpił błąd modułu zewnętrznego?
  3. Dlaczego nie widzę błędu?

Na każde z tych pytań można łatwo odpowiedzieć, stosując standardowe podejście do debugowania, które może wykonać nawet najbardziej podstawowy użytkownik. Za pomocą procesu eliminacji podstaw debugowania sklepu Magento.

Ben Lessani - Sonassi
źródło
5
Użyj dobrego debuggera i swojej inteligencji ...
Sylvain Rayé
4
Czy to jest poważne pytanie?
davidalger
5
Nie, to celowe udzielenie odpowiedzi na pytanie, aby pomóc w rzucie piłką na tę wersję BETA. Wymiana stosu nie tylko pozwala na pytania, na które udzielono odpowiedzi, ale również aktywnie zachęca go blog.stackoverflow.com/2012/05/encyclopedia-stack-exchange . @sylvain To pytanie jest skierowane do nowych / niedoświadczonych użytkowników, którzy pomagają w rozpoczęciu procesu debugowania
Ben Lessani - Sonassi
@sonassi Nie przegłosowałem, a ty przeredagowałeś swoje pytanie w jaśniejszy sposób. Prawdopodobnie mogłem w tym pomóc :) Nie wiedziałem, że SE to nie tylko pytania i odpowiedzi, dobrze wiedzieć. Jeśli chodzi o główny temat, odpowiedź tutaj jest powierzchnią większości możliwych głębszych problemów, dlatego mówię, aby użyć debuggera i najpierw zrozumieć, jak działa proces wysyłania stażystów Magento, możesz rozwiązać wiele problemów po ich zrozumieniu. To moje 5 centów. Jak rozwiązać problem z obliczaniem podatków, metodami wysyłki, generowaniem bloków lub jeszcze: debugowaniem! Pomaga także w nauce procesu stażysty.
Sylvain Rayé
2
Zrozumiany. Próbowałem pomóc w bardziej fundamentalnych błędach krytycznych. Oczywiście zakres problemów jest zdecydowanie zbyt szeroki, aby możliwe było rozwiązanie pojedynczego rozwiązania. Dziwactwa / małe błędy są diagnozowane poprzez debugowanie - ale w przypadku błędów krytycznych wymagane jest mniej delikatne podejście, jak poniżej. I tak, poprawiłem pytanie :)
Ben Lessani - Sonassi

Odpowiedzi:

98

Debugowanie to trochę sztuka, ale coś, co można łatwo opanować, wykonując prosty schemat.

Śledź każdy punkt, aż w końcu dojdziesz do rozwiązania.


Włącz błędy PHP

To jest klucz do większości problemów. Ze względów bezpieczeństwa lub z innych powodów wyświetlanie błędów PHP może być domyślnie wyłączone przez konfigurację PHP.

Możesz włączyć błędy za pomocą bardziej trwałego rozwiązania lub po prostu czegoś bardziej tymczasowego.

Stałe rozwiązanie

Dla użytkowników Apache / mod_php

W .htaccesspliku głównym dokumentu - po prostu upuść go na górze.

php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on
php_flag  log_errors on
php_value error_log  /home/path/public_html/var/log/system.log

Dla użytkowników Nginx / FastCGI

W konfiguracji wirtualnego hosta Nginx, albo w ostatecznej location .php {dyrektywie, albo w fastcgi_paramspliku (jeśli masz określony)

fastcgi_param PHP_VALUE  display_startup_errors=on;
fastcgi_param PHP_VALUE  display_errors=on;
fastcgi_param PHP_VALUE  html_errors=on;
fastcgi_param PHP_VALUE  log_errors=on;
fastcgi_param PHP_VALUE  error_log=/home/path/public_html/var/log/system.log;

Rozwiązanie tymczasowe / uniwersalne

Na każdą platformę

Edytuj pasek startowy Magento index.phpw katalogu głównym dokumentu i odkomentuj następujący wiersz:

#ini_set('display_errors', 1);

Włącz tryb programisty

Gdy wystąpił błąd i nagle trafiłeś na stronę „Raport o błędzie” i otrzymałeś pozornie bezużyteczny ciąg błędów, na przykład 1184257287824- masz kilka opcji.

Stałe rozwiązanie

Dla użytkowników Apache / mod_php

W głównym .htaccesspliku dokumentu - po prostu upuść go u góry.

SetEnv MAGE_IS_DEVELOPER_MODE true

Dla użytkowników Nginx / fastcgi

W konfiguracji wirtualnego hosta Nginx, albo w ostatecznej location .php {dyrektywie, albo w fastcgi_paramspliku (jeśli masz określony)

fastcgi_param MAGE_IS_DEVELOPER_MODE true;

Rozwiązanie tymczasowe / uniwersalne

Zmodyfikuj bootstrap Magento index.phpw katalogu głównym dokumentu i spraw, aby ifinstrukcja zawsze była prawdziwa lub włączona dla określonego adresu IP.

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE']) || true) {
  Mage::setIsDeveloperMode(true);
}

lub

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE']) || $_SERVER['REMOTE_ADDR'] == 'my.ip.add.ress') {
  Mage::setIsDeveloperMode(true);
}

Sprawdź swoje uprawnienia

Niepoprawne uprawnienia spowodują wiele problemów, z których wiele nie jest tak łatwo znaleźć na pierwszy rzut oka.

Na przykład.
Jeśli PHP nie może zapisać do ./mediakatalogu, a masz włączoną kombinację JS - Magento nie może wygenerować połączonego pliku i powiązanego unikalnego identyfikatora URI dla nośnika. Zamiast tego w kodzie źródłowym przeglądarki znajdziesz pełną ścieżkę serwera do pliku multimedialnego /home/path/public_html/media/xxx

W przeciwnym razie witryna może wyglądać normalnie - bez widocznych błędów krytycznych.

Należy pamiętać, że ta praktyka jest bezpieczna dla hostingu dedykowanego, ale może stwarzać problemy z bezpieczeństwem hostingu współdzielonego, jeśli proces Apache nie jest chroot'owany na użytkownika.

W naszym przykładzie użytkownik SSH / FTP to sonassiużytkownik Apache, apachea grupa toapache

Dodaj użytkownika FTP / SSH do grupy Apache

Co najważniejsze, musimy upewnić się, że użytkownik FTP / SSH jest częścią grupy Apache, w naszym przykładzie jest to apache(ale często też www-data)

usermod -a -G apache sonassi

Dodawaj do grupy tylu użytkowników, ile masz w przypadku FTP / SSH.

Zresetuj oryginalne uprawnienia

Zanim zaczniemy, upewnijmy się, że wszystkie uprawnienia są prawidłowe.

chown -R sonassi:apache /home/path/public_html/
find /home/path/public_html/ -type d -exec chmod 775 {} \;
find /home/path/public_html/ -type f -exec chmod 664 {} \;

Wprowadzanie zmian na stałe

Listy ACL i bity lepkie

Listy ACL w systemie Linux pozwalają nam zdefiniować określone reguły, w naszym przypadku, jakie pliki uprawnień powinny dziedziczyć po utworzeniu. Lepki bit (wspomniana później) dba o grupie dziedziczenia, ale nie pomaga z uprawnieniami, który jest dlaczego używamy ACL.

Zacznij od włączenia obsługi ACL na aktywnej partycji, upewnij się, że twoje jądro zostało skompilowane z obsługą ACL .

Partycja może być /, /home, /varlub coś innego, wymienić w razie potrzeby.

mount -o remount,acl /home

Teraz listy ACL są włączone, możemy ustawić reguły ACL i grupować bity lepkie:

setfacl -d -m u::rwx,g::rwx,o::rx /home/path/public_html/
chmod g+s /home/path/public_html/

Ale nie mam obsługi ACL

Jeśli twoje jądro nie obsługuje list ACL, możesz również użyć umask(które jest ustawieniem czasu działania BASH, FTP i PHP), aby ustawić domyślne uprawnienia do plików. Magento zwykle ustawia umask(0)się index.phpjednak, że byłoby w swoich zainteresowaniach, aby to zmienić.

W twojej index.phpzmianie umaskpowinna być linia

umask(022);

W środowisku BASH dla SSH ustaw to w swoim .bashrclub.bash_profile

umask 022

W przypadku serwera FTP musisz przeczytać jego dokumentację, ale zasada jest taka sama.


Przywróć motyw do domyślnych

Możliwe, że za ten problem odpowiada Twój motyw lub pakiet. Powrót do waniliowego motywu Magento to szybki sposób na sprawdzenie.

** Jest to związane z zastrzeżeniem, że niektóre moduły mogą być zależne od niektórych funkcji motywu *

Zamiast zmieniać cokolwiek za pomocą panelu administracyjnego, o wiele łatwiej jest po prostu zmienić nazwę katalogów naruszających prawo.

Przez SSH

mv ./app/design/frontend/myBrokenTheme{,.tmp}
mv ./skin/frontend/myBrokenTheme{,.tmp}

Lub za pośrednictwem klienta FTP przejdź do nazwy pakietu i zmień jego nazwę na inną. na przykład.myBrokenTheme.tmp

Jeśli to rozwiąże problem

Następnie musisz głębiej dowiedzieć się, która część szablonu jest problematyczna. Przywróć pakiet i spróbuj wykonać następujące czynności, testując między nimi.

Zasadniczo proces polega na stopniowym włączaniu katalogów podczas przechodzenia w dół drzewa plików - dopóki nie znajdziesz pliku, który Cię narusza.

  1. Zmień nazwę katalogu układu na .tmp
  2. Zmień nazwę katalogu szablonów na .tmp

Następnie, jeśli albo poprawka, zmień nazwę wszystkich plików w katalogu układu na .tmp- (dla użytkowników SSH ls | xargs -I {} mv {} {}.tmplub rename 's/^/.tmp/' *)

Następnie stopniowo włączaj każdy plik 1 na 1, aż zostanie rozwiązany.

Jeśli to nie rozwiąże problemu

Istnieje możliwość, że twój base/defaultlub enterprise/defaultkatalogi zostały zanieczyszczone - najlepiej je zastąpić znaną czystą wersją.

Możesz to zrobić, pobierając czystą wersję Magento i wymieniając katalogi w razie potrzeby. Za pośrednictwem SSH możesz to zrobić:

cd /home/path/public_html/
mkdir clean_mage
cd clean_mage
MAGENTO_VERSION=1.7.0.0
wget -O magento.tgz  http://www.magentocommerce.com/downloads/assets/$MAGENTO_VERSION/magento-$MAGENTO_VERSION.tar.gz
tar xvfz magento.tgz
cd /home/path/public_html/app/design/frontend
mv base{,.tmp}
cp -par /home/path/public_html/clean_mage/magento/app/design/frontend/base .
cd /home/path/public_html/skin/frontend
mv base{,.tmp}
cp -par /home/path/public_html/clean_mage/magento/skin/frontend/base .

Możesz również skorzystać z okazji do diffdwóch katalogów, jeśli chcesz zweryfikować zmiany.

diff -r base base.tmp

NB. Ta metoda spowoduje więcej błędów podczas procesu, ponieważ zależność modułu dyktuje istnienie określonych plików. Niestety jest równy kursowi.


Wyłącz moduły lokalne

Domyślnie Magento definiuje ścieżkę dołączania PHP do ładowania klas w następującej kolejności

Local > Community > Core

Jeśli plik jest w trybie lokalnym - załaduj go i nie rób więcej.
Jeśli plik znajduje się we wspólnocie - załaduj go i nie rób więcej.
Jeśli pliku nie można znaleźć nigdzie indziej - załaduj go z rdzenia.

Ponownie, zamiast wyłączać moduły za pomocą panelu administracyjnego Magento, bardziej praktyczne jest robienie tego na poziomie plików.

Zazwyczaj, aby wyłączyć moduł w „prawidłowy” sposób, należy edytować odpowiedni ./app/etc/modules/MyModule.xmlplik i ustawić <active>false</active>- jednak tak naprawdę nie uniemożliwia to załadowania klasy.

Jeśli inna klasa rozszerzy daną klasę w module (ignorując jakiekolwiek deklaracje zależności Magento), nadal będzie ładowana - niezależnie od tego, czy rozszerzenie jest wyłączone, czy nie.

Zatem ponownie najlepszym sposobem na wyłączenie rozszerzenia jest zmiana nazwy katalogu.

Zacznij od wyłączenia lokalnego

Po prostu zmień nazwę katalogu przez FTP lub użyj następującego polecenia SSH

mv ./app/code/local{,.tmp}

Następnie wyłącz społeczność

mv ./app/code/community{,.tmp}

Jeśli problem zostanie rozwiązany z jednego lub drugiego

Jest to przypadek zrozumienia, z którego modułu wynikał w szczególności błąd. Podobnie jak w przykładzie podanym powyżej dla diagnozy pakietu, obowiązuje ten sam proces.

Więc przywróć katalog X i spróbuj wykonać następujące czynności, testując między nimi.

Zasadniczo proces polega na stopniowym włączaniu katalogów (modułów) jeden po drugim, aż błąd pojawi się ponownie

  1. Zmień nazwę wszystkich modułów w katalogu na .tmp(dla użytkowników SSH ls | xargs -I {} mv {} {}.tmplub rename 's/^/.tmp/' *)
  2. Stopniowo włączaj każdy moduł jeden po drugim, usuwając .tmpz nazwy pliku

Jeśli problem nie zostanie rozwiązany

Wtedy możliwe jest zanieczyszczenie samego rdzenia. Główny rdzeń Magento PHP składa się z

./app/code/core
./lib

Więc ponownie zmień nazwy tych katalogów i skopiuj w czystym wariancie. Zakładając, że już pobrałeś czystą wersję Magento jak wyżej, za pośrednictwem SSH, możesz to zrobić:

cd /home/path/public_html/app/code
mv core{,.tmp}
cp -par /home/path/public_html/clean_mage/magento/app/code/core .

Następnie, jeśli problem nadal nie został rozwiązany, wymień również libkatalog

cd /home/path/public_html
mv lib{,.tmp}
cp -par /home/path/public_html/clean_mage/magento/lib .

W tym momencie twój sklep Magento będzie niczym więcej jak waniliową instalacją ze zmodyfikowaną bazą danych.

Niektóre modele są nadal przechowywane w bazie danych (np. Przyrost zamówienia) - dlatego w tym momencie staje się konieczne ręczne wprowadzanie tych zmian. Do tej pory wszystkie powyższe kroki były odwracalne bez trwałych obrażeń. Ale jeśli zaimportujemy również czystą bazę danych Magento - może okazać się nieodwracalna (bez przywracania kopii zapasowej).


Powyższy przewodnik pomoże Ci zidentyfikować błąd; nie naprawić wynikowego błędu.

Treści chętnie pozyskiwane z www.sonassi.com/knowledge-base/magento-debug-process i www.sonassi.com/knowledge-base/stop-magento-permissions-errors-permanently

Ben Lessani - Sonassi
źródło
7
Myślę, że odpowiedź może być pomocna dla niektórych użytkowników Magento, ale powinna zostać oznaczona jako pytanie typu wiki-społeczność, ponieważ plakat natychmiast odpowiedział na pytanie.
Matthias Zeis
8
Pytania, na które udzielono odpowiedzi, są nie tylko dozwolone, ale zachęcane przez SE. blog.stackoverflow.com/2012/05/encyclopedia-stack-exchange . Więcej użytkowników powinno to robić, aby pomóc w rozwoju tej wersji beta, a nie zachęcać innych członków do podejmowania wysiłków, aby pomagać innym i rozwijać witrynę?
Ben Lessani - Sonassi
Nie powinno to być 755i 644uprawnienia? Czy masz jakiś szczególny powód, aby polecić 775i 664?
Jürgen Thelen
@Jurgen - Na wszystkich naszych serwerach - Nginx / Apache / PHP zawsze działa jako ten sam użytkownik co SSH / FTP - czy to na hostingu współdzielonym / dedykowanym. Więc uprawnienia mogą być rwxtylko dla właściciela - ponieważ grupa i wszyscy inni nie są istotni. Ale jak już wspomniałem - nie wszyscy właściwie konfigurują swój serwer (w rzeczywistości bardzo niewielu to robi) - i istnieje możliwość, że użytkownik Apache / Nginx / PHP może różnić się od użytkownika SSH / FTP - więc dodając się nawzajem do każda odpowiednia grupa zezwala następnie na rwxpliki tak, jak powinny.
Ben Lessani - Sonassi
Jeśli nie chcesz różnicować dwóch katalogów za pomocą terminala, możesz zainstalować jedną z następujących opcji GUI: askubuntu.com/questions/12473/…
pablofiumara
18

Zgodnie z prośbą na Twitterze i omówieniem na Meta zacznę tutaj samouczek debugowania dla nie-programistów.

Najpierw myślę, że (nawet ty Magento próbuje to zaangażować) Magento jest zbyt skomplikowany dla handlowca bez zespołu programistów / programistów. Ale jeśli jesteś odważny i chcesz spróbować, dajemy z siebie wszystko, aby Ci pomóc. Myślę, że w przypadku niektórych pytań granica między „jak to zrobić?” i „proszę, zrób moją pracę, jestem zbyt głupi, żeby google to” to dość dobra linia. Rozumiem, że często trudno jest myśleć w Google, ponieważ nie wiesz, po co googlujesz, ponieważ nie znasz jeszcze nazwy. To powiedziawszy, zbierzmy rzeczy, które każdy może zrobić w sklepie Magento, nawet jeśli nie jesteś programistą.

Bardzo dobra odpowiedź na pytanie, jak debugować magento, kiedy chcesz się zabrudzić, została już udzielona przez Sonassi , ale staram się dodawać rzeczy i kopiować to, co moim zdaniem dotyczy kupców.

Oświadczenie: Wszystkie katalogi i pliki wymienione w tym poście odnoszą się do folderu głównego magento, który może znajdować się, /var/wwwale w zależności od dostawcy hostingu, tak zwany katalog główny może być wszędzie, zapytaj swojego dostawcę, jeśli nie znajdziesz swojego magento !

Tryb rozwoju

Chcesz mieć prawdziwe błędy, a nie tę głupią stronę „wystąpił błąd”, którą Magento dostarcza normalnie. http://www.fontis.com.au/blog/magento/custom-magento-error-page

Dzięki fontis.com za ten obraz.

Raporty wymienione na stronie można znaleźć w var/reports/<the_number>

Kiedy aktywujesz tryb programowania, magento zgłasza prawdziwy błąd, błędy te mogą szczególnie przeciekać poświadczenia, takie jak te dla bazy danych! Zastanów się, zanim włączysz to na serwerach produkcyjnych!

Otwórz index.phpplik w folderze głównym magento, w zależności od wersji znajdziesz te linie wokół linii 73:

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) {
    Mage::setIsDeveloperMode(true);
}

#ini_set('display_errors', 1);

Aby teraz włączyć tryb, musisz zmienić te linie.

Jeśli znasz swój adres IP (większość ludzi otrzymuje nowy co 24 godziny, przynajmniej w Niemczech), Google pomaga tutaj:

Twój publiczny adres IP to 87.138.100.68

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE']) 
    || $_SERVER['REMOTE_ADDR'] == 'my.ip.add.ress'
) {
    Mage::setIsDeveloperMode(true);
    ini_set('display_errors', 1);
}

Jeśli nie znasz swojego adresu IP z jakiegokolwiek powodu, możesz wyświetlić błędy dla wszystkich.

#if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE']) || true) {
  Mage::setIsDeveloperMode(true);
#}
ini_set('display_errors', 1);

Wycięcie lasu

Magento rejestruje wiele rzeczy w dwóch plikach:

  • var/log/exception.log
  • var/log/system.log

Wyjątki są zawsze rejestrowane. Dziennik systemu musi być włączony w wewnętrznej bazie danych:

System > Configuration > Developer > Log

wprowadź opis zdjęcia tutaj

Ustaw Enabledsię tak i zobaczysz więcej błędów i komunikaty debugowania w system.logiwexception.log

Czy to problem z motywem?

Masz swój własny motyw, konfiguruje się go tutaj:

System> Konfiguracja> Projekt

wprowadź opis zdjęcia tutaj

Dzięki kb.magenting.com za zdjęcie

Tutaj możesz skonfigurować pakiet i motyw. Jeśli chcesz spróbować odtworzyć błąd w domyślnym motywie, usuń wszystko z pól wejściowych. Następnie kliknij przycisk Zapisz, a zobaczysz standardowy motyw Magento, jak w sklepie demonstracyjnym. Jeśli masz sklep przed wersją 1.8, możesz znaleźć zrzut ekranu w Podręczniku użytkownika Magento Community Edition

Jeśli nie można odtworzyć problemu w domyślnym motywie, motyw jest uszkodzony, skontaktuj się ze sprzedawcą motywu. Nie zapewniamy wsparcia dla motywów stron trzecich, zwłaszcza komercyjnych.

Co teraz?

Znalazłeś prawdziwy błąd, który można odtworzyć, jest powtarzalny w domyślnym motywie? Świetnie, otwórz pytanie, a my staramy się pomóc.

W pytaniu:

  • opisz co robisz
  • jaki błąd jest zgłaszany
  • czy coś jest w plikach dziennika?
  • może zrzut ekranu z błędem
Fabian Blechschmidt
źródło
5
  1. Przede wszystkim należy włączyć tryb programisty
  2. Możesz także włączyć wyświetlanie błędów w index.php: ini_set ('display_errors', 1);
  3. Skompiluj rozszerzenie xDebug z dowolnym inteligentnym IDE (PhpStrom / eclipse)
  4. Wyłącz moduł niestandardowy i zewnętrzny
  5. Przejrzyj dziennik wyjątków i błędów, rozwiąż wymienione błędy w dzienniku wyjątków
  6. Sprawdź, czy rozszerzenie curl i mcrypt musi być załadowane na twój serwer
  7. Sprawdź uprawnienia do folderów i plików -R sonassi: apache / home / path / public_html / find / home / path / public_html / -type d -exec chmod 775 {} \; find / home / path / public_html / -type f -exec chmod 664 {} \;
  8. Zaktualizuj uprawnienie do katalogu nośników i var 0777, jeśli nie jest ustawione
  9. Uruchom IDE (phpstrom), a następnie ustaw punkty początkowe debugera na index.php 10. Naciśnij F8 i przejdź dalej, aż pojawi się błąd

Aby wykonać powyższe kroki, zdecydowanie powinieneś otrzymać błędy.

Abhishek Gupta
źródło
1
Doceniam twoje odpowiedzi, ale zamiast odpowiedzieć na pytanie, które już zaakceptowało odpowiedzi, dlaczego nie możesz odpowiedzieć na te pytania.
dh47,
3
@ dh47 Dla mnie to, co zrobił Abhishek, jest słuszne. Chcę tylko wspomnieć, że udzielanie odpowiedzi na już zaakceptowane pytania jest nadal istotne i ważne. W rzeczywistości naszej stronie (Magento SE) brakuje tego ważnego aspektu. Ważne jest, aby mieć 2,5 racji odpowiedzi, aby wyjść z wersji beta. Obecnie mamy tylko współczynnik odpowiedzi 1,6. Dlatego należy docenić wiele odpowiedzi na to samo pytanie. Nie zostawiaj pytania bez odpowiedzi ze względu na to pytanie ma zaakceptowaną odpowiedź. Jeśli masz jeszcze jeden punkt do dodania, powinieneś odpowiedzieć.
Rajeev K Tomy
-1

Debuguj ślad śledzenia

Jest to dobra funkcja do debugowania wywołania funkcji w magento.

Dodaj tę funkcję do pliku / config.php lub utwórz nowy plik i umieść wszystkie najczęściej używane funkcje php.

funkcja back_trace ($ exit = true) {
  $ call_back_methods = '';
  $ call_back_methods. = '';
  $ call_back_methods. = 'SNFunction NameLine NumberFile Name';

  $ licznik = 1;
  foreach (debug_backtrace () as $ index => $ data) {
    // if (0 == $ index) kontynuuje;

    $ call_back_methods. = ''. $ counter ++. „”;
    $ call_back_methods. = ''. $ data [„funkcja”]. „”;
    $ call_back_methods. = ''. $ data [„linia”]. „”;
    $ call_back_methods. = ''. $ data [„plik”]. „”;
  }

  $ call_back_methods. = '';

  print $ call_back_methods;

  if (true == $ exit) wyjście;
}

OutPut będzie

wprowadź opis zdjęcia tutaj

Somnath
źródło