3

次のPHPコードは期待どおりに機能しています。コードが4回の試行でコマンドを実行できない場合、「コピーエラー」メッセージをエコーする必要があります。

for($num_tries = 0 ; $num_tries < 4 ; $num_tries++)
{
    $cloudcmd = "cp abc xyz ";
    system($cloudcmd,$status);
    if($status != 0)
    {
        sleep(3) ;
        continue ;
    }
    break ;
}

休憩後にエコーコマンドを追加しようとしました。しかし、それは機能していないようです。

4

5 に答える 5

2

厳密には、これを行うために追加の変数やチェックを導入する必要はありません。

簡単に言うと、forループ変数$num_triesの値をforループの外で一度調べることができます。

if($num_tries==4)....

forループの後に$status変数を使用することもできます。

if($status!=0)....
于 2012-06-27T06:58:33.130 に答える
1
$success = false;
for($num_tries = 0 ; $num_tries < 4 ; $num_tries++)
        {
        $cloudcmd = "cp abc xyz ";
        system($cloudcmd,$status);
        if($status != 0)
            {
            sleep(3) ;
            continue ;
            }
    $success=true;
    break ;
    }
if($success)
    {
    //do your thing
    }
于 2012-06-27T06:53:21.130 に答える
1

これを試してください:

for ($num_tries=0;$num_tries < 4;$num_tries++)
{
    system('cp abc xyz',$status);
    if ($status === 0)
    {
        break;
    }
    sleep(3);
}
if ($status !== 0)
{
    echo 'error';
}

$statusこのループは 0 になるとすぐに中断されます。つまり、system()呼び出しが成功したことを意味します。ループ後も$status値にアクセスできます (PHP にはブロック スコープがありません)。値を確認し、必要に応じてエコーします。echo,を使用してステートメントを簡単に置き換えてexit()、残りのスクリプトを停止できます。

于 2012-06-27T07:00:32.607 に答える
1
<?php  
for($num_tries = 1 ; $num_tries <=4 ; $num_tries++){  
    $cloudcmd = "cp abc xyz ";  
    system($cloudcmd,$status);  
    if($status != 0) {  
       if($num_tries!=4){  
         sleep(3);  
         continue;  
       } else {  
         echo "error";  
       }  
    }                               
    break;  
}
?>
于 2012-06-27T07:41:26.150 に答える
0

breakステートメントによってループが中断され、ループ内で中断後に発生するコードはすべてスキップされます。

おそらく、次のようなことができます。

$success = false;

for($num_tries = 0 ; $num_tries < 4 ; $num_tries++) {

    if (success()) {
        // do something
        $success = true;
    }
}

echo ($success) ? 'Success' : 'Failure';
于 2012-06-27T06:55:12.287 に答える