倒计时器,倒计时执行php脚本

时间:2014-04-17 20:49:22

标签: javascript php jquery

我正在尝试添加我的脚本,该脚本正在检查多个网站的某些因素,这些因素将让用户知道,直播,在脚本完成任务之前将保留多少小时/分钟/秒。我需要这样做我的PHP脚本。但真的不知道从哪里开始。我只知道可以用microtime()函数计算脚本HAD BEEN执行的时间。我试着在这里搜索很多脚本,但是我几乎找不到与某些动态进度条相关的smth(但没有很好地解释),并且没有任何可以倒计时执行脚本的dinamic倒计时器。 非常感谢任何与此问题相关的帮助(链接,功能,脚本......)

3 个答案:

答案 0 :(得分:2)

如果不知道你的脚本做了什么,就无法提前知道运行需要多长时间。即使我们确实知道它的作用,也不可能知道运行所需的精确时间。如果这都在同一个会话中,您可以放置​​"%完成标记"在脚本的某些要点。我在几个地方这样做。它是一个很好的进度条,我也显示了经过的总运行时间。如果您想要这样的东西,请继续阅读......

(这是使用 jQuery UI progress bar enter image description here

如果你的脚本是循环,并且每次迭代基本上做同样的事情,那么进度条的增长将非常流畅。如果不是这种情况,并且你的脚本执行很多事情很快,那么一些事情很慢,那么你就像几乎所有的Windows进度条吧:)它可以很快到达某个点在那里挂了一会儿。

不在我的电脑上,所以我确定下面有拼写错误,但你应该能够明白这一点。希望这会有所帮助...

这样的事情将出现在你长期运行的剧本中......

$_SESSION["time_start"] = microtime(true);    
$_SESSION["percentComplete"] = 0;
... some of your php script ...
$_SESSION["percentComplete"] = 10;
... some of your php script ...
$_SESSION["percentComplete"] = 20;
... some of your php script ...
$_SESSION["percentComplete"] = 30;
... etc ...
$_SESSION["percentComplete"] = 100;
die();
?> //end of your php script

但如果您的长时间运行的脚本是一个循环,那就更像是这样......

$loopCnt = 0;
//your php loop
{
    $loopCnt = $loopCnt+1;
    //...the meat of your script...
    $_SESSION["percentComplete"] = round(($loopCnt/$totalRecordCount)*100);
}
$_SESSION["percentComplete"] = 100;
die();
?> //end of your php script

然后,在用户与ajax ping交互的页面上,可以设置为每隔几秒左右检查$_SESSION["percentComplete"]的值,并根据结果使进度条增长。有点像...

function checkScriptProgress()
{
    $.ajax({
        url: "checkScriptProgress.php",
        type: 'get',
        cache: false,
        success: function( data, textStatus, jqXHR) {
            //(1) MOVE THE PROGRESS BAR
            //if you are using a jQuery UI progress bar then you could do something like...
            //jQuery("#yourProgressBar").progressbar( "option", "value", data.progress );
            //if you are using HTML5 progress bars it would look like...
            //var pBar = document.getElementById("yourProgressBar");
            //pBar.value = data.progress;

            //(2) UPDATE ELAPSED TIME
            //if you want to display the total run time back to the user then use: data.totalRunTime

            //(3) If report is not finished then ping to check status again
            if (data.progress < 100) setTimeout("checkScriptProgress();", 1000); //check progress every 1 second so the progress bar movement is fluid
        })
    });
}

然后checkScriptProgress.php文件看起来像......

<?php
    header('Content-Type: application/json');
    $time_end = microtime(true);
    $time = $time_end - $_SESSION["time_start"];
    echo '{"progress":'.$_SESSION["percentComplete"].',"totalRunTime":'.$time.'}';
    die();
?>

答案 1 :(得分:1)

在开始任务之前,您永远无法确定任何执行任务的持续时间。那是artificial intelligence成为算法的一部分。您需要使用大量数据训练算法,这样才能预测任务的持续时间。

例如,您可以创建应用程序主要部分的INSERT语句,然后使用microtime()开始计算时间。当insert语句完成任何其他预处理时,您将把这些数据保存为训练数据。

现在在您的应用程序中..当某人尝试使用相同的进程时。你会说它需要约33 seconds例如。并使用您的JavaScript代码控制动态进度条在33秒后处于100%状态!

代码示例:

<?php
    //** this is done in development phase **//
    function MyFunction($arg1, $arg2){
        // calculate the current time.
        $startTime =microtime(true);

        // My Process in here ......

        $final_time  = microtime(true) - $startTime;

        // Save final time for future usage.
        // Repeate the step 100 times with random data
    }


    // Now you can pre calculate the average of this task
    // based on the previous training data. 
    function MyFunction($arg1, $arg2){
        // Get avarege executing time for this.. 
        // Tell the user that this function will take ? amount of time. 
    }



?>

此方法比在执行任务时计算时间更可靠,更有效。

  • 您永远不需要在任务中间计算时间,因为您已经这样做了。
  • 您永远不会需要每秒都会点击服务器的ajax
  • 您的进度条正在顺利进行,因为您知道所需的时间。

但是,如果您只需要一个随每行代码更改的动态进度条,您将需要在PHP代码中管理您的javascript。

最后,如果一行占用的时间比其他行多,则最后一种方法会导致问题。您的进度条可能会在3秒内达到%90。并在该状态下停止10秒,直到它移动到100%,这似乎是不真实的。

  • 您需要计算开始前的时间
  • 您需要计算完成后的时间
  • 您需要计算两个时间戳之间的差异。
  • 你会动态地增加你的进度条。

答案 2 :(得分:1)

在取得任何进展之前,初步估计需要估计每项行动需要多长时间才能完成,以及要执行的行动数量。 (此公式假定处理不是并行处理的)

final_timestamp = start_timestamp + (number_of_actions * average_duration_per_action)

记录进度,包括已完成的操作数和到目前为止所花费的总时间。这允许您更新估算值。

updated_final_timestamp = start_timestamp + (current_timestamp - start_timestamp) /  (num_action_completed / num_actions_total)