Jakie są różnice?
Czy jest określona sytuacja lub powód każdej funkcji? Jeśli tak, czy możesz podać przykłady takich sytuacji?
PHP.net mówi, że są one używane do uruchamiania programów zewnętrznych. patrz odniesienie Z przykładów, które widzę, nie widzę żadnej oczywistej różnicy.
Gdybym miał po prostu uruchomić skrypt (bash lub python), jakiej funkcji polecasz mi użyć?
proc_open()
ipopen()
, które pozwalają na wyższy stopień kontroli nad procesem spawnowania.Odpowiedzi:
Mają nieco inne cele.
exec()
służy do wywołania polecenia systemowego i być może samodzielnego radzenia sobie z danymi wyjściowymi.system()
służy do wykonania polecenia systemowego i natychmiastowego wyświetlenia wyniku - prawdopodobnie tekstu.passthru()
służy do wykonania komendy systemowej, od której chcesz uzyskać surowy zwrot - prawdopodobnie coś binarnego.Niezależnie od tego sugeruję, abyś nie używał żadnego z nich. Wszystkie produkują wysoce nieprzenośny kod.
źródło
izkata@izein:~$ dir -bash: dir: command not found
- FreeBSDexec
,system
,passthru
. Kod PHP jest zależny od środowiska, w którym działa, a wiele błędów bezpieczeństwa wynika z tego, że nie bierze się tego pod uwagę. Oto szybki przykład: stackoverflow.com/questions/3003145/…Jak wynika z http://php.net/ && Chipmunkninja :
źródło
Poprzednie odpowiedzi wydają się trochę mylące lub niekompletne, więc oto tabela różnic ...
Inne różne rzeczy, o których należy pamiętać:
źródło
include
i przyjacieleWszystko sprowadza się do sposobu, w jaki chcesz obsługiwać dane wyjściowe, które może zwrócić polecenie, oraz tego, czy chcesz, aby skrypt PHP czekał na zakończenie programu odbierającego, czy nie.
exec
wykonuje polecenie i przekazuje dane do programu wywołującego (lub zwraca je w zmiennej opcjonalnej).passthru
jest podobny doexec()
funkcji, ponieważ wykonuje polecenie. Tej funkcji należy używać zamiast danych wyjściowych komendy Unixexec()
lub wsystem()
przypadku danych binarnych, które należy przekazać bezpośrednio z powrotem do przeglądarki.system
wykonuje zewnętrzny program i wyświetla dane wyjściowe, ale tylko ostatni wiersz.Jeśli musisz wykonać polecenie i wszystkie dane z polecenia zostały przekazane bezpośrednio z powrotem bez żadnych zakłóceń, użyj
passthru()
funkcji.źródło
Jeśli uruchamiasz skrypt PHP z wiersza polecenia,
passthru()
ma jedną dużą zaletę. Pozwoli Ci wykonywanie skryptów / programów, takich jakvim
,dialog
itp, dając tych programów Manetka i powrocie do skryptu tylko wtedy, gdy są one wykonane.Jeśli użyjesz
system()
lub wykonaszexec()
te skrypty / programy, to po prostu nie zadziała.Haczyka: Z jakiegoś powodu, nie można wykonać
less
zpassthru()
PHP.źródło