【问题标题】:Endless loop problem $var gets not set or dont gets updated无限循环问题 $var 未设置或未更新
【发布时间】:2011-07-20 10:33:38
【问题描述】:

我通过 HTTP 调用该脚本,稍后将使用 php-cli 完成。第一个视频编码我得到了正确的持续时间,并且在数据库中输入了正确的数据,但是当脚本获取第二个视频时一切正常,只有持续时间是错误的,从上次插入中获取数据,如果我取消设置变量我得到这个错误

PHP Notice:  Undefined variable: duration

我知道这是一个无限循环,我在脚本中还有一个 sleep 命令,这样 db 就不会一直被调用。我怎样才能让它发挥作用,让 $duration 获得真正的价值。首先处理它的工作,其次是除了持续时间之外的所有工作。

我现在在 windows LAMP 上工作,还没有在 centos 上测试脚本

while(10) {
        // GET DATA FROM DB

    // CHECK STATUS

    if($check == true) {

    exec("$mencoder $temp_upload_dir$post_filename -o  $temp_upload_dir$r_post_id.mp4 2>&1", $output);

    foreach($output as $error) {
            if(preg_match('/============ Sorry, this file format is not recognized\/supported =============/', $error)) {
                $error1 = "error";
                break;
            }
        }

    if(!isset($error1)) {
    exec("$mp4box $temp_upload_dir$r_post_id.mp4");
    exec($mplayer . " " . $temp_upload_dir . $r_post_id . ".mp4  2>&1", $video);

    foreach($video as $vidlenght) {
        if(preg_match('/ID_LENGTH=/', $vidlenght)) {
            $duration = $vidlenght;
            $duration = explode("=",$duration);
            $duration = $duration['1'];
                break;
        }
    }

    // MOVE FILES

    // UPDATE DB
}
}

【问题讨论】:

  • 是的,while(10) 是一个无限循环,据我所知,唯一的 break-statements 位于 if-blocks 内,可能永远不会执行。旁注:($check = true) --> =assignment,而不是 compare-operator。
  • 如果现在已修复,上面是一个错字,是的,循环应该运行不定式并且应该获取最新的视频进行编码,中断在 foreach 循环中,如果 preg_match 得到它,它将停止 foreach 循环.

标签: php variables while-loop infinite-loop


【解决方案1】:

当你这样做时

while(10) 

你告诉程序的是

while(10==10)

在寻找布尔值时,即(真或假)。由于 10 将等于 10 并且始终等于 10,因此此陈述始终为真。退出的唯一方法是:

break;

您的 foreach 循环中只有中断。因此,你没有什么可以打破你的 while 循环。至于为什么您的变量设置不正确,看起来您只是在 foreach 循环完成循环播放视频之前过早地退出了循环。

【讨论】:

  • 您所描述的正是 OP 想要的。问题是,break 不起作用(至少不像他预期的那样)。顺便说一句,while(10) 相当于 while((boolean) 10) 而不是 while(10 == 10)。连 php 都不会猜操作符。
  • 当我读到他的评论 //Get Data from db 我以为他在谈论 while 循环从 db 中获取数据,但现在我意识到这实际上是他进行数据调用的地方。
  • 在第二次+运行后,foreach 循环的某些东西不起作用,foreach 中的变量仍然从第一次运行开始设置,如果我在脚本末尾取消设置它们,那么我得到 PHP 通知:未定义变量:持续时间,我今天晚上会在我的 linux 服务器上尝试这个,也许它只是一个 Windows 错误
  • 它们是从第一次运行开始设置的,只是因为您要跳出循环。因此,他们永远不会在第二次运行中设置,因为没有第二次运行。但是,当您取消休息时,它们将不再从第一次运行开始设置,因为您没有将它们放入数组中,它们将设置为您找到的最后一个视频。另外你总是在做持续时间['1'],你需要保持一个运行计数并做持续时间[x]。这里有不止一个问题,这些可能不是全部。
猜你喜欢
  • 1970-01-01
  • 2021-04-07
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
相关资源
最近更新 更多