У меня есть файл PHP, который необходимо запустить из командной строки (через crontab). Мне нужно передать type=daily
в файл, но я не знаю, как это сделать. Я пытался:
php myfile.php?type=daily
но эта ошибка была возвращена:
Не удалось открыть входной файл: myfile.php? Type = daily
Что я могу сделать?
Аргумент ?type=daily
(заканчивается в массиве $_GET
) действителен только для страниц с веб-доступом.
Вам нужно будет вызывать его как php myfile.php daily
и извлекать этот аргумент из массива $argv
(который будет $argv[1]
, так как $argv[0]
будет myfile.php
).
Если страница используется как веб-страница, есть два варианта, которые вы могли бы рассмотреть. Либо доступ к нему с помощью сценария оболочки и wget, и вызов из cron:
#!/bin/sh wget http://location.to/myfile.php?type=daily
Или проверьте файл php, вызван ли он из командной строки или нет:
if (defined('STDIN')) { $type = $argv[1]; } else { $type = $_GET['type']; }
(Примечание: вам, вероятно, понадобится / нужно проверить, действительно ли $argv
содержит достаточно переменных и тому подобное)
Просто передайте его как обычные параметры и получите доступ к нему в PHP с помощью массива $argv
.
php myfile.php daily
и в myfile.php
$type = $argv[1];
параметры отправляются по индексу, как и другие приложения
php myfile.php type=daily
и тогда вы можете их убить так
<?php if (count($argv) == 0) exit; foreach ($argv as $arg) echo $arg; ?>
Эти строки преобразуют аргументы вызова CLI, такие как php myfile.php "type=daily&foo=bar"
в известный $_GET
-array:
if (!empty($argv[1])) { parse_str($argv[1], $_GET); }
Хотя довольно сложно перезаписать глобальный $_GET
-array, он быстро преобразует все ваши скрипты, чтобы принимать аргументы CLI.
Подробнее см. http://php.net/manual/en/function.parse-str.php .
Сохраните этот код в файле myfile.php
и запустите его как php 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; } ?>
Если вы добавите var_dump($b);
перед тегом ?>
вы увидите, что массив $b
содержит type => daily
.
<?php if (count($argv) == 0) exit; foreach ($argv as $arg) echo $arg; ?>
Этот код не должен использоваться. Прежде всего CLI называется: / usr / bin / php phpscript.php будет иметь одно значение argv, которое является именем скрипта
array(2) { [0]=> string(13) "phpscript.php" }
Это всегда будет выполняться, так как будет иметь 1 или 2 аргумента passe
Я настоятельно рекомендую использовать getopt.
Документация по адресу http://php.net/manual/en/function.getopt.php
Если вы хотите распечатать справку для своих опций, посмотрите на https://github.com/c9s/GetOptionKit#general-command-interface
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; } } }
Я поставил параметры в $ _REQUEST
$ _REQUEST [$ key] = $ val;
и также можно использовать непосредственно
$$ ключ = $ Вэл
используйте это так:
myFile.php / key = val