我正在尝试添加我的脚本,该脚本正在检查多个网站的某些因素,这些因素将让用户知道,直播,在脚本完成任务之前将保留多少小时/分钟/秒。我需要这样做我的PHP脚本。但真的不知道从哪里开始。我只知道可以用microtime()
函数计算脚本HAD BEEN执行的时间。我试着在这里搜索很多脚本,但是我几乎找不到与某些动态进度条相关的smth(但没有很好地解释),并且没有任何可以倒计时执行脚本的dinamic倒计时器。
非常感谢任何与此问题相关的帮助(链接,功能,脚本......)
答案 0 :(得分:2)
如果不知道你的脚本做了什么,就无法提前知道运行需要多长时间。即使我们确实知道它的作用,也不可能知道运行所需的精确时间。如果这都在同一个会话中,您可以放置"%完成标记"在脚本的某些要点。我在几个地方这样做。它是一个很好的进度条,我也显示了经过的总运行时间。如果您想要这样的东西,请继续阅读......
(这是使用 jQuery UI progress bar )
如果你的脚本是循环,并且每次迭代基本上做同样的事情,那么进度条的增长将非常流畅。如果不是这种情况,并且你的脚本执行很多事情很快,那么一些事情很慢,那么你就像几乎所有的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.
}
?>
此方法比在执行任务时计算时间更可靠,更有效。
但是,如果您只需要一个随每行代码更改的动态进度条,您将需要在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)