2011-07-26 16 views
47

Mam plik PHP, który jest potrzebny do uruchomienia z wiersza poleceń (przez crontab). Muszę przekazać plik type=daily, ale nie wiem jak. Próbowałem:Przekaż zmienną do skryptu php działającego z linii poleceń

php myfile.php?type=daily 

ale błąd ten został zwrócony:

Nie można otworzyć pliku wejściowego: myfile.php type = codziennie

Co mogę zrobić?

Odpowiedz

91

?type=daily argument (kończące się w tablicy $_GET) jest poprawne tylko dla stron z dostępem do Internetu.

Musisz nazwać jak php myfile.php daily i odzyskać ten argument z tablicy (co byłoby $argv[1], ponieważ $argv[0] byłoby myfile.php).

Jeśli strona jest również używana jako strona internetowa, istnieją dwie opcje, które można rozważyć. Albo dostęp do niej ze skryptu powłoki i wget i nazwać z crona:

#!/bin/sh 
wget http://location.to/myfile.php?type=daily 

Albo sprawdzić w pliku php, czy to się nazywa z linii poleceń, czy nie:

if (defined('STDIN')) { 
    $type = $argv[1]; 
} else { 
    $type = $_GET['type']; 
} 

(Uwaga: Musisz prawdopodobnie potrzebujesz/chcesz sprawdzić, czy rzeczywiście zawiera wystarczającą ilość zmienne i takie)

41

Wystarczy przekazać go jako normalne parametry i uzyskać do niego dostęp w PHP przy użyciu tablicy .

php myfile.php daily 

aw myfile.php

$type = $argv[1]; 
+0

miał błąd: "nieokreślone przesunięcie" – Tarek

+0

dziękuję, że wszystko działa. – Tarek

+1

Użyj: if (isset ($ argv [1])) { echo. $ argv [1]; } else { \t die ("nie!"); } – demenvil

6

parametry wysłać indeksem jak innych aplikacji

php myfile.php type=daily 

a następnie można gat je jak tego

<?php 
if (count($argv) == 0) exit; 
foreach ($argv as $arg) 
    echo $arg; 
?> 
+2

to nie jest takie wygodne, nie rozdziela klucza i wartości, po prostu przekazuje wartość "type = daily" – spybart

1
<?php 
if (count($argv) == 0) exit; 
foreach ($argv as $arg) 
echo $arg; 
?> 

Kod ten nie powinien być stosowany. Przede wszystkim CLI nazwie jak:/usr/bin/php phpscript.php będzie mieć jedną wartość argv, która jest nazwą skryptu

array(2) { 
    [0]=> 
    string(13) "phpscript.php" 
} 

Ten będzie zawsze wykonać, ponieważ będą mieć 1 lub 2 args passe

3

zapisz ten kod w pliku i uruchom jako myfile.phpphp myfile.php type=daily

<?php 
$a = $argv; 
$b = array(); 
if (count($a) == 0) exit; 
foreach ($a as $arg){ 
    list($x,$y) = explode('=', $arg); 
    $b["$x"] = $y; 
} 
?> 

Jeśli dodać var_dump($b); przed znacznikiem ?>, widać, że tablica $b zawiera type => daily.

+1

Chociaż może to odpowiedzieć na pytanie, rozważ dodanie szczegółów, jak to rozwiązanie rozwiązuje problem . Prosimy zapoznać się z http://stackoverflow.com/help/how-to-answer. –

+0

Zapisz ten kod w pliku myfile.php – easyaspi

+0

Zapisz ten kod w pliku myfile.php i uruchom jako "php myfile.php type = daily", jeśli dodasz var_dump ($ b); przed tagiem?> zobaczysz, że tablica $ b zawiera typ => codziennie. – easyaspi

6

tych linii będzie przekonwertować argumenty wywołania CLI jak php myfile.php "type=daily&foo=bar" w znany $_GET -array :

if (!empty($argv[1])) { 
    parse_str($argv[1], $_GET); 
} 

Choć jest to raczej niechlujny nadpisać globalny $_GET -array, konwertuje wszystkie skrypty szybko zaakceptuj argumenty CLI.

Aby uzyskać szczegółowe informacje, patrz http://php.net/manual/en/function.parse-str.php.

+0

Doskonała odpowiedź! Dzięki! – Reado

-1
if (isset($argv) && is_array($argv)) { 
    $param = array(); 
    for ($x=1; $x<sizeof($argv);$x++) { 
     $pattern = '#\/(.+)=(.+)#i'; 
     if (preg_match($pattern, $argv[$x])) { 
      $key = preg_replace($pattern, '$1', $argv[$x]); 
      $val = preg_replace($pattern, '$2', $argv[$x]); 
      $_REQUEST[$key] = $val; 
      $$key = $val; 
     }  
    } 
} 

kładę parametry $ _REQUEST

$ _REQUEST [$ key] = $ val;

a także nadające się bezpośrednio

$$ key = $ val

wykorzystanie tego tak:

myFile.php/key = val

Powiązane problemy