Rozwiązywanie problemów
Alternatywna wersja tytułu dla wegetarian i buddystów: Sztuka bycia sobą i rozwiązywania problemów (z Drupalem). Jeśli chcesz wyzbyć się pragnień takich jak te zilustrowane na poniższym obrazku, spróbuj skorzystać z opisanych tu wskazówek.
Jeżeli masz problem z Drupalem, istnieje duże prawdopodobieństwo, że nie jesteś pierwszą osobą, której się on przydarzył. Może dawno temu ktoś sprytny już go rozwiązał. Może nawet rozwiązało go więcej użytkowników. Może każdy z nich zadawał wcześniej to samo pytanie… Zanim do nich dołączysz, skorzystaj z wyszukiwarki znajdującej się w tej witrynie i jeśli jeszcze nie znajdziesz odpowiedzi, pomóż sobie poniższym poradnikiem.
Daj sobie chwilę
Zastanów się. Przypomnij sobie, jakich zmian w witrynie niedawno dokonałeś, jakie moduły zainstalowałeś. Zazwyczaj to w jednej z tych zmian tkwi problem. Czy na pewno wybrano odpowiednie wersje modułów? Sprawdź, czy wszystko dobrze zrobiłeś zanim zaczniesz przeklinać Drupala bądź moduł.
Czytaj komunikaty o błędach
Część użytkowników je pomija, ale Ty masz w sobie mądrość, by docenić wagę zawartych w nich informacji. Spróbuj zinterpretować komunikat. Zazwyczaj, gdy dobrze się wczytasz, okaże się, że rozwiązanie problemu jest tuż przed Twoimi oczyma. Jeżeli nie masz dostępu do komunikatu, przeszukaj dzienniki zdarzeń witryny lub serwera, zaczynając od najnowszych wpisów. W dziennikach serwera znaleźć można następujące rodzaje błędów:
- błędy
Internal server error
(błąd nr 500) związane z ustawieniami zawartymi w pliku.htaccess(np.directive not allowed here
) - problemy z pamięcią:
Fatal error: Allowed memory size of 8388608 bytes exhausted
Sprawdź poprawność struktury strony
Jeżeli problem dotyczy layoutu – rozmieszczenia elementów, wielkości czcionki, etc. – skorzystaj z narzędzia sprawdzającego poprawność strony. Zwróć baczną uwagę na niepoprawne „zamykanie” znaczników i inne problemy strukturalne. Inne komunikaty, na przykład te o encjach, są mniej ważne.
Zawsze czytaj pliki „README”
Naprawdę. Choć wiele modułów wystarczy po prostu włączyć, część z nich wymaga podjęcia dodatkowych kroków. One nie są zepsute, one tak już mają. Niektóre moduły potrzebują specjalnych rozszerzeń PHP lub innych modułów albo też są skonfliktowane z innymi modułami.
Skorzystaj z wyszukiwarek, by znaleźć rozwiązanie
Jeśli komunikat błędu wydaje ci się bezsensowny, wyszukaj go za pomocą wyszukiwarki internetowej, np. Google. Starannie stwórz zapytanie: "Argument #1 is not an array" drupal. Umieszczenie cudzysłowów w odpowiednich miejscach spowoduje zwrócenie stron wspominających o dokładnie tym komunikacie, a dodanie słówka „drupal” – pozwoli wyszukać te informacje, które odnoszą się do Drupala. Pamiętaj, by usunąć ścieżki do katalogów, które na serwerach innych osób mogą być zupełnie inne. Pozostaw natomiast nazwy plików, które pojawiają się w komunikatach o błędach.
Wyśledź przyczynę problemu
Przyjrzyj się następującemu komunikatowi:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(n.nid), n.title FROM category c INNER JOIN category_node r ON c.cid = r.cid INN' at line 1 query: SELECT c.*, r.DISTINCT(n.nid), n.title FROM category c INNER JOIN category_node r ON c.cid = r.cid INNER JOIN category cn ON c.cnid = cn.cid INNER JOIN node n ON c.cid = n.nid INNER JOIN node cnn ON cn.cid = cnn.nid WHERE n.status = 1 AND n.moderate = 0 ORDER BY cn.weight, cnn.title, c.weight, n.title in /var/www/html/doadance/drupal/includes/database.mysql.inc on line 120.
Choć na końcu komunikatu pojawia się plik database.mysql.inc, to nie w nim leży problem; on tylko przyczynił się do jego znalezienia. Trzeba znaleźć prawdziwego winowajcę. Spróbuj to uczynić, znajdując w komunikacie nazwę tabeli bazy danych. W tym wypadku brzmi ona category_node, co wskazuje na moduł Category
, choć błędy powodować może i inny moduł, który zażądał z bazy danych informacji związanych z kategoriami (category
).
Który moduł mi bruździ?
Wszystkie strony są przez Drupala „dynamicznie” generowane. Adres generowanej strony (ta część po twojej domenie) jest zazwyczaj definiowany w hook_menu() danego modułu. By odpowiedzieć sobie na pytanie typu „Jak konstruowana jest moja strona rss.xml?”, trzeba:
- przeszukać pliki Drupala na okoliczność wystąpienia tekstu „rss.xml”, na przykład programem GREP (wersja dla Windows)
- w tym wypadku ślady zaprowadzą nas do pliku
node.modulei jego funkcjinode_menu() - co z kolei prowadzi nas do nieuchronnej konluzji, że funkcją odpowiadającą za
rss.xmljestnode_feed()i że tam należy szukać dalszych informacji
Przy okazji, odnośniki w powyższym przykładzie prowadzą do bardzo przydatnej strony Drupal API
.
Wszystkie strony generowane dynamicznie można w ten sposób „szpiegować”. Popatrz na adres, sprawdź z jakim modułem jest związany, a następnie przyglądnij się kodowi tego modułu.
Spróbuj wycisnąć z Drupala więcej informacji
Na przykład modułem Devel
. Możesz też pobawić się w hakowanie. Na przykład w przypadku komunikatu warning: in_array() [function.in-array]: Wrong datatype for second argument in /home/httpd/global/drupal/modules/node.module on line 1303
otwórz plik node.module i odnajdź linię nr 1303. Jest tam zapis in_array('status', $node_options). Dodaj we wcześniejszej linii zapis print("Node options: '".print_r($node_options,1)."'");, odśwież stronę i obserwuj. Może zwrócone przez Drupala dane coś podpowiedzą.
Zadawaj właściwe pytania
Zanim jednak do tego przystąpisz, przeczytaj jak zrobić to mądrze. Jeśli znajdziesz rozwiązanie, nie zapomnij je opisać na stronie, na której wcześniej zadałeś pytanie, nawet gdy na nie nikt nie odpowiedział.
Ciąg dalszy nastąpi
Kolejne części poradnika ukażą się w przyszłości.
Powyższy tekst jest luźnym tłumaczeniem strony Troubleshooting FAQ
, która udostępniona została na zasadach licencji Creative Commons License, Attribution-ShareAlike 2.0
.
Copyright 2000–2008 by the individual contributors <http://drupal.org>
Portions copyright 2008 by Arche Twist <http://drupal.org.pl>




PHP backtrace
marcin pajdzik, pon., 2008-06-09 02:56Aby wycisnąć z Drupala więcej informacji, można też skorzystać z funkcji PHP debug_backtrace() albo debug_print_backtrace() które dostarczą szczegółowych informacji o tym jakie funkcje i z jakich plików były wywoływane wcześniej.
Dobrym pomysłem jest wywołanie funkcji debug_backtrace() w funkcji drupal_set_message() w pliku bootstrap.inc. Na przykład tak:
Alternatywnie można umieścić funkcje debug_print_backtrace() w miejscu gdzie pojawił się, według drupala, błąd. Efekt podobny.