1

私は2つのファイルを持っています。

1 つは、scron スクリプトのすべての実際のパス リンクと引数を含む単純なテキスト ファイルです。

もう 1 つのファイルは、私の cron スクリプトそのものです。

私のcontabテキストファイルは次のとおりです。

#!/bin/sh 
/usr/bin/php -f /home/path/reports/report.php arg1

/usr/bin/php -f /home/path/reports/report.php arg2

cron スクリプトは crontab ファイルの引数を読み取り、その引数に応じて実行されます。

report.php --

php $args = $argv[1];
 $count = 0;
switch($args){
   case 'arg1':
     code and create certain file .... 
   exit;
   case 'arg2':
         code and create certain file  ... 
   exit;

    }   // <--- this script runs perfectly if I run script manually through putty commend line, meaning it will run exactly what I want depending on what $argv[1]  I put in manual commend line,  BUT doesn't run automatically from crontab script

このファイルは実行されず、理由もわかりません。コマンドラインから report.php を手動で実行すると実行されます。動作します。

私が気づいたことの1つは、report.phpを次のように変更することです。

report.php --

$args = $argv[1];
 $count = 0;
switch($args){
   case ($args ='arg1'): // <- just putting the equal sign makes it work
     code and create certain file .... 
   exit;
   case ($args = 'arg2'):
         code and create certain file  ... 
   exit;

    } // <-- this script was a test to see if it had anything to do with the equal sign, surprisingly script actually worked but only for first case no what matter what argv[1] I had, this is not what I am looking for. 

問題は、最初のケースでのみ機能することでした.crobtabのテキストファイルにどのような引数を入れても、常に最初のケースが実行されます. おそらく、$args = 'arg1' と記述しているため、常に arg1 と見なされます。

だから私は代わりにこれを行うことでそれを機能させようとしました:

report.php --

$args = $argv[1];
 $count = 0;
switch($args){
   case ($args =='arg1'): // <- == does not work at all....
     code and create certain file .... 
   exit;
   case ($args == 'arg2'):
         code and create certain file  ... 
   exit;

    } // <--- this script runs perfectly if I run script manually through putty commend line, but not automatically from crontab script

これは何も実行しません。引数をまったく取得しません。この report.php ファイルに注意してください。比較 "==" を使用すると、コマンドラインで手動で実行すると完全に実行されます。

何が起こっている?「==」を使用して crontab ファイルから引数を見つけると、cron スクリプトが引数を正しく読み取らないのはなぜですか。

4

3 に答える 3

3

$argv については -> 「注意: register_argc_argv が無効になっている場合、この変数は使用できません。」. $argv/$argc の代わりに、 $_SERVER['argv'] および $_SERVER['argc'] (はい、正しくお読みください) に切り替えることをお勧めします。

そしてこれに関しては

case ($args ='arg1'): // <- just putting the equal sign makes it work

男、あなたは自分が何をしているのか、そして ($args=='arg1') と ($args='arg1') の違いを明らかに理解していません!

--[ 以下のコメントのコード ]----

これを test.php として保存します。

<?php
echo $_SERVER['argv'][1] ."\n";

そしてそれをテストします。

$ php test.php abd
abd
于 2012-08-20T20:50:56.500 に答える
0

@arxanasがコメントで言及しているように、スイッチはAFUです。こちらのドキュメントをお読みください。caseステートメントはすでに。と同等の機能を果たしている$x == [value]ため、使用する必要があるのは。だけですcase [value]:

switch($args) {
    case ($args =='arg1'):
        .
        .
        .
        break;
    .
    .
    .
}

する必要があります

switch($args) {
    case 'arg1':
        .
        .
        .
        break;
    .
    .
    .
}
于 2012-08-20T20:54:44.917 に答える
0

最初に機能する理由は、== の代わりに = を使用すると、if ステートメント内で変数を設定するためです。

var_dump($argv) を試して、変数に何かが割り当てられているかどうかを確認してください。

于 2012-08-20T20:52:38.207 に答える