2011-07-20 20 views
31

Ho bisogno di eseguire un file php con parametri attraverso shell.Shell run/execute php script con parametri

ecco come vorrei correre il file php:

php -q htdocs/file.php

ho bisogno di avere il parametro 'show' essere passati attraverso e

php -q htdocs/file.php? esposizione = SHOW_NAME

non funziona

Se qualcuno potrebbe spiegarmi quale comando eseguire per ottenere il file php da eseguire con i parametri impostati, sarebbe molto apprezzato. Altrimenti, cerca di guidarmi nella giusta direzione.

+0

Una risposta migliore rispetto a quella accettata: Utilizzare l'eseguibile "php-cgi" anziché "php". Vedi: http://stackoverflow.com/a/11965479/543738 –

risposta

35

Test.php:

<?php 
print_r($argv); 
?> 

Shell:

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

Ok, quindi non posso ricevere i parametri tramite $ _GET in php ma tramite $ argv, grazie. Mi ci è voluto un po 'per capirlo. –

2

In aggiunta alle altre risposte (che sono del tutto corretta), è anche possibile passare gli argomenti come parametri di ambiente, come questo:

FOO=42 BAR=quux php test.php 

Saranno quindi disponibili nel superglobale $_ENV.

+0

quando inserisco il comando ottengo un errore per il "FOO". Sto usando il comando shell di xampp su Windows, cambia qualcosa? –

+0

Probabilmente non funzionerà su Windows, ma funzionerà bene sulla maggior parte delle shell di tipo unix. – troelskn

+0

Ho capito che funzionava, mi aspettavo che venisse ricevuto dalla funzione $ _GET [] di PHP. Mi ci è voluto un po 'per capire che $ arvg conteneva tutti i parametri. Grazie. –

0

Se si sta utilizzando da un file PHP è possibile utilizzare popen() e fare qualcosa del genere:

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

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

Questo utilizza la funzione escapeshellarg() in modo da avvolgere la variabile $part tra virgolette (ed evita qualsiasi citazione al suo interno), in modo che possa essere usato come argomento della shell in modo sicuro.

5

Se si dispone di server web (non solo interprete solo php installato, ma LAMP/LNMP/etc) - basta provare questo

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

dove:

  • «-O -» - (Lettera "O", non zero!) Redirect "HTML scaricato" per stdout
  • «>/dev/null 2> & 1» - reindirizzare stdout & uscita stderr verso il nulla
  • «q» - tranquillo wget corsa
  • «-t 1 »- solo tenta di connettersi (non come valore predefinito 20)

In PHP di "exec" sarà smth come questo:

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"); 

Pertanto, non è necessario modificare gli script per gestire argc/argv e potrebbe utilizzare $ _GET come di consueto.

Se si desidera che i lavori siano eseguiti in background, vedere per es. Unix/Windows, Setup background process? from php code

Io uso l'approccio con wget nei miei lavori cron; spero che sia d'aiuto.

+0

C'è qualche differenza tra l'uso dei comandi 'wget' e' php' quando si eseguono i lavori con 'exec' riguardo sicurezza o performance? – Gixty

+0

Sono sicuro che la sicurezza è la stessa. Prestazioni - ovviamente 'wget' sarà più lento ma molto utile come detto superiore. Con wget la richiesta passa a tutte le fasi nascoste o richiede la gestione come cache di apache/nginx/lighttpd, riscrive e così via. Quando in chiamata diretta di 'php', incolperesti una soluzione così complessa, - cioè è applicabile non in tutti i casi. Ad ogni modo, penso che tu debba semplicemente prendere in considerazione il tuo caso attuale, il tuo cervello, il tuo strumento di benchmarking e solo mescolarlo bene! ;) – FlameStorm