コマンドラインから(crontab経由で)実行する必要があるPHPファイルがあります。 type=daily
をファイルに渡す必要がありますが、方法がわかりません。私は試した:
php myfile.php?type=daily
しかし、このエラーが返されました:
入力ファイルを開けませんでした:myfile.php?type = daily
私に何ができる?
?type=daily
引数(最後は$_GET
配列になります)は、Webアクセスページに対してのみ有効です。
php myfile.php daily
のように呼び出し、$argv
配列から引数を取得する必要があります($argv[1]
は$argv[0]
なので、myfile.php
になります)。
ページがWebページとしても使用されている場合は、2つの選択肢があります。シェルスクリプトとwgetでアクセスし、cronから呼び出します。
#!/bin/sh
wget http://location.to/myfile.php?type=daily
または、コマンドラインから呼び出されているかどうか、phpファイルをチェックインします。
if (defined('STDIN')) {
$type = $argv[1];
} else {
$type = $_GET['type'];
}
(注:$argv
に実際に十分な変数などが含まれているかどうかを確認する必要があります。
通常のパラメーターとして渡し、$argv
配列を使用してPHPでアクセスします。
php myfile.php daily
およびmyfile.php内
$type = $argv[1];
これらの行は、php myfile.php "type=daily&foo=bar"
などのCLI呼び出しの引数を、よく知られている$_GET
- arrayに変換します。
if (!empty($argv[1])) {
parse_str($argv[1], $_GET);
}
グローバル$_GET
- arrayを上書きするのはかなり面倒ですが、すべてのスクリプトを迅速に変換してCLI引数を受け入れます。
詳細については http://php.net/manual/en/function.parse-str.php をご覧ください。
Getopt()関数を使用して、コマンドラインからパラメーターを読み取ることもできます。コマンドを実行するphpで値を渡すだけです
php abc.php --name = xyz
abc.php
$val = getopt(null, ["name:"]);
print_r($val); // output: ['name' => 'xyz'];
他のアプリケーションのようにインデックスで送信されるパラメーター
php myfile.php type=daily
そして、あなたはこのようにそれらをガットすることができます
<?php
if (count($argv) == 0) exit;
foreach ($argv as $arg)
echo $arg;
?>
このコードをファイルmyfile.php
に保存し、php myfile.php type=daily
として実行します
<?php
$a = $argv;
$b = array();
if (count($a) === 1) exit;
foreach ($a as $key => $arg) {
if ($key > 0) {
list($x,$y) = explode('=', $arg);
$b["$x"] = $y;
}
}
?>
?>
タグの前にvar_dump($b);
を追加すると、$b
配列にtype => daily
が含まれていることがわかります。
<?php
parse_str(implode('&', array_slice($argv, 1)), $_GET);
?>
Cgi-phpを使用する場合とまったく同じように動作します。
$ php -f myfile.php type=daily a=1 b[]=2 b[]=3
$_GET['type']
を'daily'
に、$_GET['a']
を'1'
に、$_GET['b']
をarray('2', '3')
に設定します。
次のコードを使用して、コマンドラインとwebbrowserを操作できます。このコードをphpコードの上に配置します。コマンドラインパラメーターごとに$ _GET変数を作成します。
コードでは、$ _ GET変数をチェックするだけでよく、スクリプトがwebbrowserまたはコマンドラインから呼び出されるかどうかは心配しません。
if(isset($argv))
foreach ($argv as $arg) {
$e=explode("=",$arg);
if(count($e)==2)
$_GET[$e[0]]=$e[1];
else
$_GET[$e[0]]=0;
}
Getoptの使用を強くお勧めします。
http://php.net/manual/en/function.getopt.php のドキュメント
https://github.com/c9s/GetOptionKit#general-command-interface をご覧になるよりも、オプションのヘルプを印刷したい場合
<?php
if (count($argv) == 0) exit;
foreach ($argv as $arg)
echo $arg;
?>
このコードは使用しないでください。まず、次のように呼び出されるCLI:/ usr/bin/php phpscript.phpには、スクリプトの名前であるargv値が1つあります
array(2) {
[0]=>
string(13) "phpscript.php"
}
1つまたは2つの引数が渡されるため、これは常に実行されます
次のようにパラメータとして渡すだけです:
php test.php one two three
およびtest.php内:
<?php
if(isset($argv))
{
foreach ($argv as $arg)
{
echo $arg;
echo "\r\n";
}
}
?>
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;
また、直接使用可能
$$ key = $ val
これを次のように使用します。
myFile.php/key = val