2013-02-28 17 views
7

Mam za zadanie utworzenie strony internetowej w różnych środowiskach dla różnych etapów oceny (dev/test/staging/etc).Jak debugować skrypt PHP, który nigdy się nie kończy?

Wygląda jednak na to, że pewne różnice uniemożliwiają ukończenie skryptu PHP, więc strona nigdy nie jest dostarczana do przeglądarki.

Zastanawiam się, czy istnieje sposób, w jaki mogę wydrukować jakiś ślad stosu lub śledzenie po przecięciu połączenia, czy jest jakiś inny sposób, aby dowiedzieć się, co dokładnie robi PHP w dowolnym punkcie w cykl życia skryptu?

Jest to witryna Drupal, więc zawiera wiele kodów, których nie znam, i może zająć godziny, aby posortować polecenia w całym tekście, aby zobaczyć, do którego skryptu jest ładowany.

Rozumiem, że prawdopodobnie powinienem patrzeć na różnice w środowiskach, jednak wszystkie powinny mieć bardzo podobną konfigurację (Ubuntu 11.04), a środowisko przemieszczania wydaje się być całkowicie szczęśliwe z obsługi innych stron PHP, podczas gdy ta konkretna strona odmawia zakończenia. Jeśli cokolwiek ta strona przemieszczania ma więcej zasobów dostępnych niż inne środowiska, które nie mają problemów.

UPDATE: Przepraszam, znalazłem problem na końcu. Środowisko pomostowe znajdowało się w sieci VLAN, która nie mogła uzyskać dostępu do siebie za pośrednictwem publicznego adresu IP iz jakiegoś powodu (nadal nie wiedząc o tym) próbowała uzyskać dostęp do samego siebie jako część obciążenia strony i nigdy nie wypełniać żądania. Ustawienie wpisu pliku hosts dla 127.0.0.1 rozwiązało problem.

+1

Czy zapoznałeś się z xdebug? –

+1

Czy debuger krok po kroku jest opcją? http://xdebug.org/docs/remote –

+0

Jeśli chcesz użyć 'die()', to co robię, to ta sama metoda, którą użyłeś przy odgadywaniu liczby od 1 do 1000. Pierwsza połowa początku sposób (500), a następnie, jeśli nie dojdzie do tego punktu, to punkt musi być wcześniej, a ty po raz kolejny w połowie (250) itd. – h2ooooooo

Odpowiedz

3

Debugowanie problemu takiego jak to krok po kroku przy użyciu narzędzia takiego jak xDebug jest opcją, ale prawdopodobnie zajmie dużo czasu - ustalenie, gdzie umieścić punkty przerwania, będzie mniej więcej na tym samym poziomie co praca gdzie umieścić oświadczenia die wokół kodu. Opcja debuggera jest lepszym sposobem na zrobienie tego, ale nie zaoszczędzi wiele w porównaniu, gdy masz problem taki jak ten, gdy masz nieznany bloker gdzieś w dużych ilościach nieznanego kodu.

Ale xDebug posiada również narzędzie do profilowania, które może pokazać, jakie funkcje zostały wywołane w trakcie przebiegu programu, jak długo trwały i podkreślać, gdzie występują wąskie gardła. Prawdopodobnie będzie to lepsze miejsce do rozpoczęcia. Po prostu skonfiguruj xDebug do wygenerowania śledzenia profilera, a następnie użyj kCacheGrind, aby wyświetlić ślad w środowisku graficznym.

Jeśli twój program utknął w pętli lub coś, czego wykonanie zajmuje dużo czasu, od razu wykryje problem; będziesz w stanie dokładnie zobaczyć, która funkcja zabiera czas i jak wygląda łańcuch połączeń.

Jest całkiem możliwe, że gdy już to zobaczysz, będziesz w stanie znaleźć problem, patrząc na odpowiedni kod. Ale jeśli nie możesz, możesz wtedy użyć krok po kroku debuggera xDebug, aby przeanalizować funkcję podczas jej działania i zobaczyć, jakie zmienne są ustawione, aby zobaczyć, dlaczego jest zapętlona.

Xdebug można znaleźć tutaj:

+0

Niezła odpowiedź kompleksowa. Mimo że już nie potrzebuję, lub mam czas, aby przejść przez to tempo, przeznaczę to na nieuniknione następnym razem :) dzięki! – DanH

2

Zastosowanie Xdebug.

Jest bardzo łatwy w instalacji i użyciu. ma kilka opcji, takich jak pułapki i krok po kroku do stanu skryptu PHP śledzić przed wykończeń loading

i można go pobrać Xdebug stąd

krok po kroku tutoril dla utworzenia XDebug jest availble w sachithsays.blogspot.com/

Powiązane problemy