2008-09-15 16 views
7

Ich versuche, PHP über die Befehlszeile unter Windows XP auszuführen.PHP - Befehlszeilenargumente in Windows

Das funktioniert, bis auf die Tatsache, dass ich nicht in der Lage, Parameter für mein PHP-Skript bereitzustellen.

Mein Testfall:

echo "param = ".$param."\n"; 
var_dump($argv); 

Ich möchte dies nennen wie:

php.exe -f test.php -- param=test

Aber ich habe nie das Skript meine Parameter zu akzeptieren.

Das Ergebnis, das ich aus dem obigen Skript

erhalten

`PHP Notice: Undefined variable: param in C: \ test.php on line 2

param = '' 
array(2) { 
    [0]=> string(8) "test.php" 
    [1]=> string(10) "param=test" 
} 

ich diese mit PHP Ich versuche 5.2.6 . Ist das ein Fehler in PHP5?

Die Parameterübergabe wird im Diese online help Note: If you need to pass arguments to your scripts you need to pass -- as the first argument when using the -f switch. behandelt schien unter PHP4 zu arbeiten, aber nicht unter PHP5. Unter PHP4 konnte ich das gleiche Skript verwenden, das auf dem Server ohne Änderung in der Befehlszeile ausgeführt werden konnte. Dies ist praktisch für das lokale Debugging, zum Beispiel das Speichern der Ausgabe in einer zu untersuchenden Datei.

Antwort

7

Warum haben Sie die Erwartung, dass der Parameter auf den Wert gesetzt wird? Sie sind dafür verantwortlich, die Befehlszeile in der von Ihnen gewünschten Weise aus dem $ argv-Array zu analysieren.

0

$ argv ist ein Array, das all Ihre Kommandozeilenparameter enthält ... Sie müssen dieses Array analysieren und $ param selbst setzen.

$tmp = $argv[1];    // $tmp="param=test" 
$tmp = explode("=", $tmp); // $tmp=Array(0 => param, 1 => test) 

$param = $tmp[1];   // $param = "test"; 
1

PHP parametriert Ihre Befehlszeilenparameter nicht für Sie. Sehen Sie sich die Ausgabe an, wo Ihr 2. Eintrag in ARGV "param = test" ist.

Was Sie am wahrscheinlichsten wollen, ist die Verwendung des PEAR-Pakets http://pear.php.net/package/Console_CommandLine: "Ein voll funktionsfähiges Befehlszeilenoptionen und Argumente Parser".

Oder Sie können masochistisch sein und Code hinzufügen, um durch Ihr ARGV zu gehen und die Parameter selbst einzustellen. Hier ist ein sehr einfacher Schnipsel Sie begonnen zu erhalten (dies wird nicht funktionieren, wenn der erste Teil kein gültiger Variablenname ist oder gibt es mehr als 1 ‚=‘ in einem ARGV Teil:

foreach($argv as $v) { 
    if(false !== strpos($v, '=')) { 
     $parts = explode('=', $v); 
     ${$parts[0]} = $parts[1]; 
    } 
} 
0

Sie können tun, so etwas wie:

if($argc > 1){ 
    if($argv[1] == 'param=test'){ 
     $param = 'test'; 
    } 
} 

natürlich können Sie viel komplizierter als das erhalten je nach Bedarf

3
.

Die Parameterübergabe wird in der Online-Hilfe gehandhabt. Hinweis: Wenn Sie Argumente an Ihre Skripte übergeben müssen, müssen Sie sie übergeben - als erstes Argument bei Verwendung der Option -f. Dies schien unter PHP4 zu funktionieren, aber nicht unter PHP5.

Aber PHP immer noch nicht diese Argumente analysieren. Es übergibt sie einfach an das Skript im Array $ argv.

Der einzige Grund für die - ist, dass PHP sagen kann, welche Argumente für die ausführbare PHP-Datei und welche Argumente für Ihr Skript bestimmt sind.

, dass Sie Dinge tun, wie diese können:

php -e -n -f myScript.php -- -f -n -e 

(-f, -n, & -e nach die - an myscript.php weitergegeben Diejenigen, bevor zu PHP übergeben werden. selbst).

+0

dies für mich gearbeitet, danke ! – montrealist

-1

können Sie das Array $ Argv verwenden. dies wie:

<?php 
echo $argv[1]; 
?> 

daran erinnern, dass das erste Element des $ argv Array (das $ argv [0]) ist der Name des Skripts selbst, so, um die Parameter für die Anwendung zu verwenden, sollten Sie Beginnen Sie mit Mitgliedern von $ argv [] aus dem '1'ten Index. wenn die Anwendung aufrufen, verwenden Sie folgende Syntax:

php myscript.php -- myValue 

gibt es keine Notwendigkeit, einen Namen für den Parameter zu setzen. Wie Sie gesehen haben, was Sie var_dump() für $ argv [] genannt haben, war das zweite Mitglied (das der erste Parameter ist) die Zeichenfolge PARAM = TEST. Recht? Es ist also nicht nötig, einen Namen für den Param zu vergeben. Geben Sie einfach den Parameterwert ein.

+0

'print_r ($ argv)' ist besser für die Fehlersuche in einem Array, imho. –

0

Man könnte so etwas wie

if (isset($argv[1]) { 
$arg1 = $argv[1];    
$arg1 = explode("=", $arg1); 
$param = $arg1[1];    
} 

verwenden (wie die fehlenden Parameter zu handhaben/s bis zu Ihnen) oder wenn Sie ein komplexeres Szenario benötigen, schauen Sie in eine Kommandozeilen-Parser-Bibliothek wie die eine von Pear.

mit der ${$parts[0]} = $parts[1]; in einer anderen Lösung geschrieben können Sie jede Variable in Ihrem Code überschreiben, die klingt nicht wirklich sicher.

0

Wenn Sie gerne auf der Schneide leben, hat PHP 5.3 die Befehl, der sich um all dieses chaotische Geschäft für Sie kümmern wird. Etwas.

3

Wenn Sie die params ähnlich wie GET Vars übergeben wollen, dann können Sie die parse_str()-Funktion verwenden. Ähnliches:

<?php 
parse_str($argv[1]); 
?> 

Würde eine Variable von $ test mit einem Wert von myValue erzeugen.

Hoffe, das hilft!

0

Befehlszeile Beispiel:

php myserver.php host = 192.168.1.4 port = 9000

in myserver.php die folgenden Zeilen verwenden:

<?php 

parse_str(implode('&', array_slice($argv, 1)), $_GET); 
// Read Arguments 
if (array_key_exists('host',$_GET)) 
{ 
    $host = $_GET['host']; 
} 
if (array_key_exists('port',$_GET)) 
{ 
    $port = $_GET['port']; 
} 
?>