2009-07-30 18 views
11

Załaduję dynamicznie pliki klasy PHP za pomocą autoload. Te pliki mogą być z jakiegoś powodu niedostępne lub uszkodzone.Czy można sprawdzić składnię pliku PHP z PHP?

Autoload z powodzeniem zgłasza brakujące pliki, aby logika aplikacji mogła je obsłużyć. Ale jeśli te pliki są uszkodzone, całe przetwarzanie zatrzymuje się z pustym ekranem dla użytkownika i "Błąd analizy składni PHP: błąd składni" w dzienniku błędów.

Czy można sprawdzić składnię pliku PHP z kodu PHP?

Zajrzałem tutaj: http://us.php.net/manual/en/function.php-check-syntax.php - jest przestarzałe.

I

exec("php -l $file"); 

wydaje się być niewłaściwy sposób (http://bugs.php.net/bug.php?id=46339)

Myśli?

+4

Czy naprawdę rozważasz sprawdzanie składni każdego pliku, który chcesz uwzględnić za każdym razem, gdy skrypt jest wykonywany? – Gumbo

+0

Niezupełnie. Mam specjalne rodzaje zajęć, które mogą być potencjalnie uszkodzone, nie wszystkie. –

Odpowiedz

6

Naprawdę nie należy próbować sprawdzać non-poprawne Pliki PHP w czasie wykonywania: zabije czas odpowiedzi aplikacji!

"Lepszą metodą" byłoby użycie php -l z wiersza poleceń po zakończeniu modyfikacji skryptu PHP; lub dołącz go do procesu kompilacji, jeśli używasz go; lub podłącz go jako wstępny commit SVN, jeśli używasz SVN i możesz zdefiniować SVN hooks.

Moim zdaniem prawie każde rozwiązanie byłoby lepsze niż sprawdzenie samego siebie w czasie wykonywania!


Biorąc pod uwagę błędy podobne do tych, których chcesz uniknąć, prawdopodobnie nie zdarzają się często, prawdopodobnie lepiej ... po prostu pozwól im się wydarzyć.
Jedyną rzeczą jest: Zainstaluj dzienników i monitorowanie nich, być w stanie wykryć szybko kiedy tere jest problem :-)


oczywiście, to nie uniemożliwić czynienia z przypadku brakujących plików ; ale to już zupełnie inna sprawa ...

+0

Dzięki za odpowiedź. Odpowiedź "nie, nie z rozsądną wydajnością" jest ważną opcją. SVN pre-commit hook to świetny pomysł i myślę, że rozwiąże nasz problem w większości przypadków. –

+0

Nie ma za co :-) OK o svn pre-commit hook: kiedy jesteś administratorem serwera SVN, haki są naprawdę świetne! –

0

W skrócie: nie widzę sposobu, aby to zrobić, ale mam pomysł, który może być wystarczający.

Istnieją programy do monitorowania dzienników lub mogą filtrować dzienniki za pomocą standardowych narzędzi dla plików z błędami analizy. Jeśli pojawi się plik, umieścisz czarną nazwę na czarnej liście, a Twój ładownik automatycznie sprawdzi przed załadowaniem tej listy.

Za pomocą tej metody, po raz pierwszy wyświetli się pusty ekran (założenie, że raportowanie błędów na wyjściu jest włączone na serwerach produkcyjnych), ale drugi będzie miał stronę bez wadliwego komponentu.

W autoloaderze powinien mieć listę lub schemat nazewnictwa, aby zawsze starać się ładuje obowiązkowych zajęciach (inne sposoby aplikacja może być w stanie niespójnym)

+0

Zakładam, że on (jego system) nie ma kontroli nad tymi plikami w czasie kompilacji. –

+0

Interesujący pomysł, chociaż myślę, że nie jest dobrze, aby sprawdzanie składni było zależne od użytkownika odwiedzającego witrynę. Nawet jeśli tylko pierwszy otrzyma pustą stronę. –

2

Innym sposobem można zrobić jeden plik php w katalogu o nazwie checkSyntax.php

<?php 
for($i=1; $i < count($argv); $i++){ 
     $temp = "php -l " . $argv[$i]; 
     $output = exec($temp); 
     echo "\n$output"; 
} 
?> 

teraz otwórz plik .bashrc, aby utworzyć skrót do uruchomienia tego pliku . dodaj poniżej linię, aby uruchomić checkSyntax.php

alias checkSyntaxErrors='php /root/checkSyntax.php' 

i teraz przejdź do katalogu źródłowego do svn st.

pokazuje listę plików, teraz łatwo uruchom polecenie.

checkSyntaxErrors file1.php file2.php ....... 

to sprawdzi wszystkie pliki przekazywane jako argumenty.

cieszyć :)

0

Można też zrobić kilka testów jednostkowych, gdzie można załadować PHP jesteś dynamicznie wykonywany i twierdzą, że exec („php -l $ filename”) jest prawidłowy. Gdybyś to zrobił, byłbyś w stanie zweryfikować go raz w swoich testach, generując go z odpowiednimi zmiennymi i mając uzasadniony poziom pewności, że twój PHP jest dobry.