Próbuję napisać skrypt, aby pobrać dane online; Skrypt powinien być wywoływany przez zadanie cron lub php cli oraz standardowe żądanie GET HTTP. Jak podano na stronie PHP $_SERVER['argv'] powinien pasować do moich potrzeb:

Tablica argumentów przekazanych do skryptu. Gdy skrypt jest uruchamiany w wierszu poleceń, daje to dostęp w stylu C do parametrów wiersza poleceń. W przypadku wywołania za pomocą metody GET, będzie zawierał ciąg zapytania.

Jednak nie mogę go uruchomić ze standardowym żądaniem HTTP GET. $_SERVER['argv'] nie jest ustawiony. Czego mi brakuje?

<?php
    // jobs/fetch.php
    var_dump($_SERVER['argv']);
?>

Wyjście CLI php jobs/fetch.php -a -bhello:

array(3) {
  [0]=>
  string(14) "jobs/fetch.php"
  [1]=>
  string(2) "-a"
  [2]=>
  string(7) "-bhello"
}

Pobierz dane wyjściowe jobs/fetch.php?a=&b=hello:

Uwaga: Niezdefiniowany indeks: argv w jobs/fetch.php.

6
gremo 14 luty 2012, 04:16

2 odpowiedzi

Najlepsza odpowiedź

Instrukcja nie określa tego zbyt dobrze, ale jeśli chcesz, aby $_SERVER['argc'], $_SERVER['argv'], $argc, $argv zostały zarejestrowane, gdy nie korzystasz z CLI, a następnie wartość php.ini register_argc_argv musi być włączony w php.ini (domyślnie wyłączone [ze względu na wydajność]).

Możesz wykonać następujące czynności, aby uzyskać argv lub argumenty ciągu zapytania w zależności od tego, jak działa skrypt:

if (php_sapi_name() == 'cli') {
    $args = $_SERVER['argv'];
} else {
    parse_str($_SERVER['QUERY_STRING'], $args);
}

Oto kilka szczegółów z php.ini:

; This directive determines whether PHP registers $argv & $argc each time it
; runs. $argv contains an array of all the arguments passed to PHP when a script
; is invoked. $argc contains an integer representing the number of arguments
; that were passed when the script was invoked. These arrays are extremely
; useful when running scripts from the command line. When this directive is
; enabled, registering these variables consumes CPU cycles and memory each time
; a script is executed. For performance reasons, this feature should be disabled
; on production servers.
; Note: This directive is hardcoded to On for the CLI SAPI
; Default Value: On
; Development Value: Off
; Production Value: Off
; http://php.net/register-argc-argv

Zobacz także http://www.php.net/manual/en/reserved .variables.argv.php i parse_str().

16
drew010 12 kwiecień 2013, 00:37

Będziesz musiał użyć $_GET lub $_SERVER['argv'] w zależności od tego, jak wywoływany jest twój skrypt. Żaden z nich nie jest używany do obu.

Na przykład:

if(!empty($_SERVER['argv'][0]) {
  $a = $_SERVER['argv'][1];
  $b = $_SERVER['argv'][2];
} else {
  $a = $_GET['a'];
  $b = $_GET['b'];
}
5
Charles 14 luty 2012, 04:25