2010-06-10 15 views
11

Jaka jest różnica między wykonywaniem php z wiersza poleceń i HTTP? Czy używają tego samego pliku wykonywalnego, takiego jak (php.exe lub php-cgi.exe (Apache lub IIS))? Czy wyniki różnią się, gdy są wykonywane z wiersza poleceń lub HTTP?Różnica między wykonywaniem php z linii poleceń i strony Http

+0

To brzmi jak zadanie domowe lub pytanie testowe do mnie. Nie żeby to było złe, czy coś. – Nathan

+0

Naprawdę powinieneś przeczytać instrukcję (http://www.php.net/manual/en/features.commandline.php). Pokaże Ci różnice i funkcje dodatkowe, takie jak interaktywna powłoka, wykonywanie skryptów itp. –

Odpowiedz

2

Niezależnie od tego, czy PHP jest wywoływane przez moduł serwera WWW, czy CLI, używana jest ta sama baza binarna (ale czasami można skonfigurować tak, aby używała różnych ini, które mogą wpływać na skrypt). Jego otoczenie będzie się różnić, więc zmienne środowiskowe nie będą dokładne.

PHP ma również świadomość, że zostało inaczej wywołane i dostosuje jego wyjście do tego (tj., phpinfo(); dane wyjściowe będą inaczej sformatowane, gdy zostaną wywołane przez CLI).

+0

Lub używają innego pliku binarnego. Większość wdrożonych przeze mnie wdrożeń miała zupełnie inną wersję dla modułu cli & apache, czasami nawet nie w tej samej wersji ... – Wrikken

+0

@Wrikken. To musiało być zrobione celowo przez administratora z jakiegoś powodu. Tak czy siak, odniosłem się do tego teraz jako 'baza binarna' – webbiedave

1

Podczas wykonywania php z wiersza poleceń, serwer Apache lub IIS nie ma żadnej roli do odegrania. Po prostu użyj folderu php4 lub php5, aby wykonać swój kod. Mogą występować różnice w wykonaniu, zależnie od różnicy w dostępnych bibliotekach i ustawień php.ini w dwóch folderach. Podczas uruchamiania z apache używane jest php.ini w twoim apache/bin. Kiedy z linii poleceń jest używany php.ini z twojego folderu php5 lub php4.

2

Główna różnica polega na przekazywaniu argumentów: uruchamianie z CLI, nie masz $ _GET, $ _POST, $ _SESSION, itp .; więc argumenty muszą być przekazane jako parametry wiersza poleceń i dostępne za pomocą, jeśli $ _SERVER ['argc'] i $ _SERVER ['argv'] Uważaj na katalog, w którym działa twój kod i ścieżkę dołączania; i upewnij się, że wiesz, co załadowałeś php.ini. Podczas wyprowadzania znaczniki HTML nie są renderowane jako znaczniki, ale wyświetlają się jako < h1> etc .... uważaj szczególnie na
(PHP_EOL jest niezwykle przydatny), a wiele spacji lub kart faktycznie pojawia się jako wiele spacji lub tabulacji pojedyncza przestrzeń. Zapomnij nagłówków() i innych funkcji specyficznych dla http

1

Poza tym, co już zostało powiedziane, najprawdopodobniej będą różnice w uprawnieniach do tego, jakie części systemu plików są dostępne: PHP za pośrednictwem serwera WWW jest uruchamiane jako użytkownik serwera WWW, PHP z linia poleceń działa jak Ty.

6

Nie znaczniki HTML błędy
Jest to ustawienie php.ini (html_errors), ale domyślnie wyłączone w wersji CLI.

Logowanie do stderr
Zazwyczaj błędy są rejestrowane w error.log serwerach, ale w wersji CLI błędy są zapisywane na stderr.
ta jest również dostępna jako ustawienie php.ini (error_log)

php.ini
Plik php.ini, który jest używany w wersji cli może być inny plik. Co może prowadzić do kilku nieprzyjemnych błędów (curl nagle niedostępne, itp.).

Różne wykonywalne
Jest możliwość zainstalowania wielu wersji PHP (php5 obok PHP4)
Zastosowanie which php ustalić, która wersja używasz.

Wszystko jest pokazane jako tekst
var_dump() jest czytelny bez <pre>
żadnej różnicy pomiędzy header('Hello'); i echo('Hello');

0

Choć kwestia ta jest bardzo stara, chciałbym przedłużyć @ Bob Fanger użytkownika trochę.

Running pliki PHP z linii poleceń jest dość trywialne, trzeba tylko pamiętać, że istnieją pewne różnice pomiędzy uruchamiając plik na serwerze WWW lub w interfejsie serwery linii komend:

  • Brak dostępnych

  • Nie $_GET, $_POST, $_SESSION dostępny Cookies Ale można użyć uzyskać parametry przekazane jako argument do komendy. Pierwsza wartość jest zawsze nazwą pliku.

    Na przykład wzięty ten plik

    <?php 
    var_dump($argv); 
    ?> 
    

    zwany tak:

    [email protected]:$ /usr/bin/php /home/user/file.php foo bar 
    

    nie daje to wyjście:

    array(4) { 
        [0]=> 
        string(8) "file.php" 
        [1]=> 
        string(3) "foo" 
        [2]=> 
        string(3) "bar" 
    } 
    
  • pełne ścieżki do plików z serwerów korzenia wymagane Musisz podać pełne ścieżki do plików (np. r include(), require(), file_get_contents(), ...), nawet jeśli mogą znajdować się w tym samym folderze.

  • różne ustawienia użytkownika/uprawnień pliki nie są wykonywane przez użytkownika www-data użytkownika, ale przez użytkownika jesteś zalogowany na komputerze. Wpływa to na wszystkie wywołania funkcji pliku, które wpływają na system plików maszyn (np. mkdir(), include(), ...), więc musisz się upewnić, że dany użytkownik ma odpowiednie uprawnienia.

+1

Dodając do tego przydatnego kompendium odpowiedzi, zmienne' $ _SERVER' są również niedostępne dla skryptu w CLI, na przykład '$ _SERVER ['DOCUMENT_ROOT']' for dostęp obejmuje skrypt. – Martin

Powiązane problemy