1

私は現在、何人かの人々のためにcronjobsを実行しています。それらの人々が誰であるかを知るために、いくつかの詳細を含むパラメーターを指定します。

0 1 * * * cd /var/www; php auto.php?user=user

何らかの理由で、この結果が返されます。

入力ファイルを開けませんでした:auto.php?user = user

構文に何か問題がありますか?何かをエンコードする必要がありますか?

4

4 に答える 4

7

コマンドラインでのパラメーターの使用PHPは異なります

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

php auto.php myuser

次に、スクリプトでスーパーグローバル配列を使用して変数にアクセスします。$_SERVER['argv']各コマンドライン引数は、スクリプト名で始まるその配列内で順番に並んでいます。渡された引数の数を確認できます$_SERVER['argc']

この場合には

$ _SERVER ['argc'] = 2
$ _SERVER ['argv'] [0] = auto.php
$ _SERVER ['argv'] [1] = myuser

ボーナス情報

phpファイルの最初の行に(シバンと呼ばれる)を#!/usr/bin/php追加し、実行ビットを追加すると、コマンドラインでphpを呼び出す必要がなくなり、スクリプトを呼び出すことができます。phpが/usr/ bin/phpの一般的な場所にあると仮定します

于 2012-10-07T09:12:50.453 に答える
2

コマンドラインからurlスタイルのパラメーターを使用してphpスクリプトを呼び出すことはできませんが、いくつかの解決策が考えられます。

wgetを使用して、Webサーバーを介してスクリプトを効果的にトリガーできます(実際にはサーバーで実行されているページ/スクリプトであると想定しています)

0 1 * * * wget http://yourserver/thepath/auto.php?user=user

phpのgetopt拡張機能を使用して、シェルスタイルのパラメーターを受け入れるようにスクリプトを変更します

$options = getopt("u:");  // expect -u followed by the parameter value
$user = $options["u"];
// continue the script 

これは

php -q auto.php -u user

getoptのドキュメントページをチェックしてください。これよりもはるかに魅力的なものにすることができます。argc / argv(有効なオプションです)を使用するよりもgetoptを使用する主な利点は、任意の順序で指定できる複数のパラメーターを処理するのがはるかに簡単なことです。たとえば、次のものが必要だと仮定します。

php -q auto.php -u user -p pass -a another -b whatever

これらのパラメーターを解析するには、かなりの数のサポートコードを作成する必要があり、getoptはそれをすべて単独で実行します。

于 2012-10-07T09:14:15.000 に答える
2

これをそのように行うことはできません。これは、httpリクエストで引数を渡す方法であり、どこにでもあるわけではありません。コマンドラインには、とを使用する必要が$_SERVER['argv']あり$_SERVER['argc']ます。

あなたの場合、コードを少し作り直す必要があります。代わりに

$user = $_GET['user'];

使用する

$user = $_SERVER['argv'][1];

スクリプトを呼び出す方法を次のように変更する必要があります。

0 1 * * * cd /var/www; php auto.php user

また、いくつかのコマンドラインヘルパークラスが役立つ場合があります。例:CLI

詳細については、PHPマニュアルの「コマンドラインの使用法」セクションを参照してください。

于 2012-10-07T09:17:39.907 に答える
2

質問マークはHTTPGETパラメータを示していますが、Webサーバーが関与していないため、端末では意味がありません。あなたはこれを使うことができます:

cd /var/www; php auto.php some parameters

次に、PHPスクリプト内でおよびを使用してパラメーターを読み取ります$_SERVER['argc']$_SERVER['argv']

于 2012-10-07T09:10:49.290 に答える