Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Sprawdzanie poprawności składniowej kodu PHP
hawk
post 5.04.2004, 22:22:02
Post #1





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


Chciałbym sobie - z poziomu skryptu php - wczytać z dysku jakiś inny skrypt i sprawdzić, czy jest on poprawny składniowo. Potem można by wysłać do usera info: "tak, plik jest OK" lub "nie, jest błąd w linii tej a tej".

Problemy są dwa:

1) Chcę tylko sparsować plik, a nie wykonywać. Temu akurat można zaradzić wstawiając przed kodem do sprawdzenia return, coś w stylu:
[php:1:dcb9e2b8c6]<?php eval(' return; ' . file_get_contents('foo.php')); ?>[/php:1:dcb9e2b8c6]
Wtedy jedyne błędy to będą błędy parsowania lub błędy kompilatora, czyli te o które chodzi.

2) Tutaj jest pies pogrzebany: można sobie zrobić set_error_handler i przechwytywać błędy, ale błedy parsowania zawsze są brutalnie wywalane na wyjście i kończą skrypt. Kompletnie olewają mój piękny error handler sad.gif .

Tak więc, czy ktoś zna sposób na sprawdzenie poprawności pliku (lub stringa, na jedno wychodzi) bez jego wykonywania i bez wywalania całego skryptu w przypadku błędu? Przecież php robi to bez przerwy, php.exe chyba ma taki switch, analizator lexykalny jest dostępny (tokenizer), a tu nie można sparsować głupiego kawałka kodu angrysmiley.gif .
Go to the top of the page
+Quote Post
Seth
post 5.04.2004, 22:26:01
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

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


Cytat
2) Tutaj jest pies pogrzebany: można sobie zrobić set_error_handler i przechwytywać błędy, ale błedy parsowania zawsze są brutalnie wywalane na wyjście i kończą skrypt. Kompletnie olewają mój piękny error handler sad.gif .

Moze by uzyc buforowania outputu (ob_*) ?
Go to the top of the page
+Quote Post
hawk
post 6.04.2004, 08:20:29
Post #3





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


Cytat
Moze by uzyc buforowania outputu (ob_*) ?

Nope sad.gif . Parser php przy pierwszym błędzie składniowym kończy cały skrypt. Nawet nie dojdzie do linijki w której pobiera wartość bufora.
Go to the top of the page
+Quote Post
DeyV
post 6.04.2004, 12:54:41
Post #4





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




ALe chyabw ajakis sposób można przechwycić nawet takie komunikaty.
Co prawda nie do końca wiem jak, ale pamiętam kiedyś nasze zdziwienie, gdy eZ obsłużył nam wszystkie możliwe błędy, łącznie z przerwaniem skryptu przez die()

Pamiętam, że zarówno ja jak i seth byliśmy tym mocno zaskoczeni. Niestety - przynajmniej mi nie udało się rozszyfrować zasady działanie tego mechanizmu.


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
Bakus
post 8.04.2004, 14:00:50
Post #5


Administrator serwera


Grupa: Przyjaciele php.pl
Postów: 909
Pomógł: 0
Dołączył: 12.08.2003
Skąd: /var/www/wroclaw.php

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


A może skrypt wykonać w powłoce? W tedy przetwarzanie skryptu było by wykonywane jako osobny wątek, więc nie było by problemu z przerywaniem parsowania macierzystego skryptu.

Niestety nie jestem w stanie wyobrazić sobie w jaki sposób zabezpieczyć system, by sprawdzane skrypty nie korzystały np. z funcji [manual:605bee3d62]system[/manual:605bee3d62] lub podobnych...


--------------------
Powrót do przeszłości :)
Go to the top of the page
+Quote Post
Jabol
post 8.04.2004, 17:40:35
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

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


jestem pewien, że w którymś changelogu php5 widziałem funkcje, która to robi.

php5beta3, a funkcja zwie się php_check_syntax()
Go to the top of the page
+Quote Post
hawk
post 8.04.2004, 22:37:47
Post #7





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


@Bakus:
Myślałem o tym smile.gif ale:
- nie potrafię ustalić w skrypcie gdzie znajduje się php.exe
- coś u siebie namieszałem w php bo php.exe nie znajduje bibliotek i w ogóle nie rusza
Ale ogólnie to powinno działać. Co do zabezpieczenia systemu: podobno php.exe ma switcha który powoduje że skrypt jest tylko parsowany, nie wykonywany.

@jabol:
Piękna funkcja. Niestety, to moje musi chodzić na PHP4, ale to kolejny powód, by lubić PHP5 biggrin.gif .

A generalnie to poradziłem sobie tak:
Jest skrypt, który przyjmuje dowolny kod php w POST, i zapisuje do tymczasowego pliku taki string:
Kod
"<?php echo 'No syntax errors found'; die(); ?>" . $_POST['code']

a potem wykonuje ten plik. Skutek prosty:
- nie ma błędów: wypluwamy info i kończymy bez wykonywania nieznanego kodu
- są błędy: parser php sam wypluwa info i kończy skrypt

A w głównym skrypcie po prostu otwieram socketa, wysyłam żądanie HTTP POST i odczytuję odpowiedź serwera... Styknie.
Go to the top of the page
+Quote Post
FiDO
post 9.04.2004, 20:33:54
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

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


Cytat
- nie potrafię ustalić w skrypcie gdzie znajduje się php.exe

pod Unixem wywolac which php, pod windowsem gorzej... mozna sprobowac odczytac przez ini_get wartosc extension_dir, mysle ze 99% ma ta sciezke nie zmieniona, czyli w katalogu php
Cytat
- coś u siebie namieszałem w php bo php.exe nie znajduje bibliotek i w ogóle nie rusza

Wersja CLI/CGI php szuka php.ini tam gdzie sie odpala, a pewnie masz php.ini w windowsie albo katalogu apache'a... jak nie chcesz drugiej kopii php.ini no to mozesz jeszcze do php.exe przekazac parametr
-c sciezka/do/php.ini
Cytat
Ale ogólnie to powinno działać. Co do zabezpieczenia systemu: podobno php.exe ma switcha który powoduje że skrypt jest tylko parsowany, nie wykonywany.

Podobno ma smile.gif
Kod
-l             Syntax check only (lint)


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
Bakus
post 11.04.2004, 02:22:53
Post #9


Administrator serwera


Grupa: Przyjaciele php.pl
Postów: 909
Pomógł: 0
Dołączył: 12.08.2003
Skąd: /var/www/wroclaw.php

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


http://www.php.net/features.commandline

Cytat
Usage: php [options] [-f] <file> [args...]
      php [options] -r <code> [args...]
      php [options] [-- args...]
 -s               Display colour syntax highlighted source.
 -w               Display source with stripped comments and whitespace.
 -f <file>        Parse <file>.
 -v               Version number
 -c <path>|<file> Look for php.ini file in this directory
 -a               Run interactively
 -d foo[=bar]     Define INI entry foo with value 'bar'
 -e               Generate extended information for debugger/profiler
 -z <file>        Load Zend extension <file>.
 -l               Syntax check only (lint)
 -m               Show compiled in modules
 -i               php information
 -r <code>        Run php <code> without using script tags <?..?>
 -h               This help

 args...          Arguments passed to script. Use -- args when first argument  
                  starts with - or script is read from stdin


--------------------
Powrót do przeszłości :)
Go to the top of the page
+Quote Post
hawk
post 11.04.2004, 16:33:12
Post #10





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


Cytat
Jeśli wszystko inne zawiedzie, przeczytaj instrukcję...

biggrin.gif
Ale jak zauważył FiDO, ciężko z poziomu skryptu wywołać php.exe, bo nie wiadomo gdzie to jest. A w moim przypadku na pewno nie będzie działać, bo ja php sam porozrzucałem po katalogach jak mi się widziało.

Tak czy siak, IMHO to poważne niedopatrzenie twórców php: jest w języku funkcjonalność, całkiem przydatna, do której nie ma dostępu. Przynajmniej w PHP5 się poprawi...
Go to the top of the page
+Quote Post
Bakus
post 12.04.2004, 01:21:38
Post #11


Administrator serwera


Grupa: Przyjaciele php.pl
Postów: 909
Pomógł: 0
Dołączył: 12.08.2003
Skąd: /var/www/wroclaw.php

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


A nie możesz do katalogu skryptu wrzućić pliku php.exe i wywołać go przez exec, lub podobną funkcję ?


--------------------
Powrót do przeszłości :)
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: 13.07.2025 - 22:07