2011-07-20 29 views
31

Potrzebuję wykonać plik php z parametrami poprzez powłokę.Skrypt uruchom/uruchom skrypt php z parametrami

tutaj jest jak bym uruchomić plik PHP:

php -q htdocs/file.php

muszę mieć parametr 'show' przechodzić przez i

pokaz php -q htdocs/file.php = SHOW_NAME

nie działa

Jeśli ktoś mógłby mi przeliterować, jakie polecenie wykonać, aby plik php był uruchamiany z ustawionymi parametrami, byłoby to bardzo cenne. Jeśli nie, spróbuj poprowadzić mnie we właściwym kierunku.

+0

Lepsza odpowiedź niż zaakceptowana: użyj pliku "php-cgi" zamiast "php". Zobacz: http://stackoverflow.com/a/11965479/543738 –

Odpowiedz

35

test.php:

<?php 
print_r($argv); 
?> 

Shell:

$ php -q test.php foo bar 
Array 
(
    [0] => test.php 
    [1] => foo 
    [2] => bar 
) 
+1

OK, więc nie mogę odbierać parametrów przez $ _GET w php ale przez $ argv, dziękuję. Zajęło mi trochę czasu, aby to rozgryźć. –

2

Oprócz innych odpowiedzi (które są dość poprawne), można również przekazywać argumenty jako parametry środowiska, takie jak to:

FOO=42 BAR=quux php test.php 

Będą one wtedy dostępne w wersji superglobalnej $_ENV.

+0

po wejściu do tego polecenia pojawia się błąd dla "FOO". Używam polecenia powłoki xampp w systemie Windows, czy to coś zmienia? –

+0

Prawdopodobnie nie będzie działać na Windowsie, ale będzie działał dobrze na większości powłok typu unix. – troelskn

+0

Mam go do pracy, oczekiwałem, że zostanie odebrany przez funkcję $ _GET [] PHP. Zajęło mi trochę czasu, aby zdać sobie sprawę, że $ arvg posiadał wszystkie parametry. Dzięki. –

0

Jeśli korzystasz z pliku PHP można użyć popen() i zrobić coś takiego:

$part = $show_name; //or whatever you want with spaces 

$handle = popen("php -q nah.php -p=". escapeshellarg($part) . " 2>&1", "r"); 

ta wykorzystuje funkcję escapeshellarg(), aby owinąć zmienną w cudzysłowie $part (i unikaj cudzysłowów w nim), aby mógł być bezpiecznie użyty jako argument powłoki.

5

Jeśli masz serwer WWW (zainstalowany nie tylko po prostu php interpreter, ale LAMP/LNMP/etc) - po prostu spróbuj tego

wget -O - -q -t 1 "http://mysite.com/file.php?show=show_name" >/dev/null 2>&1 

gdzie:

  • «-O -» - (Letter "O", a nie zero!) Przekierować "pobraną html" na stdout
  • «>/dev/null 2> & 1» - przekierować standardowe wyjście & wyjście stderr do nikąd
  • «-q» - cichy wget prowadzony
  • «-t 1 »- tylko spróbować połączyć (nie jak domyślnie 20)

W PHP "exec" to będzie smth tak:

function exec_local_url($url) { 
    exec('/usr/bin/wget -O - -q -t 1 "http://'. $_SERVER['HTTP_HOST'] .'/' 
    . addslashes($url) . '" >/dev/null 2>&1' 
); 
} 

// ... 

exec_local_url("file.php?show=show_name"); 
exec_local_url("myframework/seo-readable/show/show_name"); 

Nie musisz więc zmieniać skryptów, aby obsłużyć argc/argv, i możesz używać $ _GET jak zwykle.

Jeśli chcesz pracować w tle - patrz np. Unix/Windows, Setup background process? from php code

Używam podejścia z wget w mojej pracy cron; mam nadzieję, że to pomoże.

+0

Czy jest jakaś różnica między używaniem komend 'wget' i' php' podczas uruchamiania zadań z 'exec' dotyczących bezpieczeństwa lub performace? – Gixty

+0

Jestem pewien, że bezpieczeństwo jest takie samo. Wydajność - oczywiście 'wget' będzie bardziej powolny, ale bardzo poręczny jak wyżej. Z wget żądanie przechodzi przez wszystkie ukryte etapy lub obsługę żądania, takie jak cache, przeprogramowania i tak dalej Apache/Nginx/Lighttpd. W bezpośrednim wywołaniu 'php' będziesz winien tak skomplikowane obejście, to znaczy, że nie będzie on odpowiedni we wszystkich przypadkach. W każdym razie, myślę, że musisz wziąć swoją obecną sprawę, swój mózg, narzędzie do benchmarkingu i po prostu dobrze to przetasować! ;) – FlameStorm