web-dev-qa-db-ja.com

$ _GETパラメーターをcronジョブに渡す

私はcronジョブに慣れていないので、これが機能するかどうかはわかりません。

セキュリティのために、特定のGET値(ユーザー名、パスワード、セキュリティコード)を検索する1ページのスクリプトを作成して、コンピューターと3つすべてを知っている人だけがコマンドを実行できるようにすることを考えました。

スクリプトを作成し、ブラウザで実行すると動作しますが、GET値でcronジョブを実行できますか?

例は私が走っているだろう

* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234

これは可能ですか?

34
Dfranc3373

$_GET[]$_POST[]連想配列は、Webサーバー経由でスクリプトが呼び出されたときにのみ初期化されます。コマンドライン経由で呼び出されると、パラメーターは $argv 配列、Cと同じ.

コマンドラインから実行するときにスクリプトに渡されるすべての引数の配列が含まれます。

あなたのコマンドは次のようになります:

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234 

次に、 parse_str() を使用して、パラメータを設定およびアクセスします。

<?php

var_dump($argv);

/*
array(4) {
  [0]=>
  string(27) "/path_to_script/cronjob.php"
  [1]=>
  string(13) "username=test"
  [2]=>
  string(13) "password=test"
  [3]=>
  string(9) "code=1234"
}
*/

parse_str($argv[3], $params);

echo $params['code']; // 1234
84
RobB

あなたの質問への直接的な答えではなく、私が思うより良い解決策:

Cron以外にスクリプトを実行させたくない場合は、web-rootの外に置いてください。そうすれば、ウェブサーバー経由のアクセスはまったくありません。

特別なユーザーとしてコマンドを実行する必要がある場合は、GETを使用せずに、ユーザーログインを行い、ログインセッション(特定の設定セッション変数...)をチェックして、そのページのスクリプトのみ。

一般公開されているスクリプトは次のようになります。

session_start();

if (isset($_SESSION['user']))
{
  include '/path/to/script/outside/of/web-root';
}
else
{
  die('No access.');
}
10
jeroen
* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234

これは機能しません

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234

これは動作します

また、parse_str()関数を使用して値を取得する必要があります

$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz
5
Ambarish

この投稿はすでに数年前のものですが、この投稿は私を最も助けてくれたので、他の人にも役立つように私の発見を共有させてください。

私はDirectAdminを使用しており、cronの例は両方とも機能しています。 「cronへのすべての出力を電子メールに送信」から電子メールアドレスを削除したため、cronジョブの電子メール通知を受信しません。

私は20分ごとに実行されるcURLリクエストから始めました。

*/20 * * * * /usr/local/bin/curl --silent 'https://demo.tld/app/stats/?update&key=1234'

RLの前後の「」に注意してください。そうしないと、複数のパラメーターを追加できません!

私は別のWebサイトから収集し、他のWebサイトからJSON形式で取得できる統計の更新をトリガーするAPIに触発された方法としてそのページを使用します。パラメーター 'update'は更新プロセスをトリガーし、パラメーター 'key'は検証されると、cronjobが更新を要求したときにのみ実行したい追加の更新アクションをトリガーします。

上記のcronjobは基本的に両方向の帯域幅を消費するため、PHPベースのcronjobにしたかったのですが、パラメーターに問題が発生しました...日 :)

*/20 * * * * /usr/local/bin/php /home/path/to/public_html/app/stats/index.php update key=1234

ご覧のとおり、ファイル名(index.php)がパスに含まれるようになり、パラメーターが(?および&なしで)続きます。

この方法でcronjobが動作しますが、$_GET...を介してパラメーターが渡されないため、半分しかありません。これは、$_GETキー!

それでは、それはどのように機能しますか?単純な(少なくとも調査後)cronjobは、$argvという名前の変数を介してパラメーターをスクリプトに渡します。

そのため、$argv$_GETに変換する方法を探しました。

  1. 手動でもcronジョブでも更新をトリガーできます。
  2. スクリプト全体を書き直す必要はありませんでした。

$argvが実際に設定されている場合にのみ実行したい次のソリューションが見つかったため、if issetチェックでラップしました。

if( isset( $argv ) )
{
    foreach( $argv as $arg ) {
        $e = explode( '=', $arg );
        if( count($e) == 2 )
            $_GET[$e[0]] = $e[1];
        else    
            $_GET[$e[0]] = 0;
    }
}

これがあなたにも役立つことを願っています:)

1
golabs

get_opt() または $ argv 関数を調べる必要があります。

1
Mike Mackintosh

Cronまたはコンソールコマンドのパラメーターが必要な場合は、getopt()関数を使用すると便利です。

この関数は、オプション/引数のペアの配列、または失敗した場合にFALSEを返します。

次の例は、PHP documentation。から直接引用したものです。

$options = getopt("f:hp:");
var_dump($options);


Shell> php example.php -fvalue -h

上記の例は次を出力します:

array(2) {
    ["f"]=>
    string(5) "value"
    ["h"]=>
    bool(false)
}

より多くのオプションと異なるパラメータについては、完全なドキュメントをご覧ください。

資源

0
Peter

これは動作します:

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234
0
ZnArK

username=test&password=test&code=1234

なります:

php -r "$_GET["username"]="test"; $_GET["password"]="test"; $_GET["code"]="1234"; include "wp-cron.php";'

0
Marco Marsala