启动和停止定时器 PHP

我需要一些关于在 PHP 中启动和停止计时器的信息。我需要从我的。Exe 程序(我在 php 脚本中使用的是 exec()函数) ,直到完成执行并显示所花的时间(以秒为单位)。

我怎么能这么做?

179844 次浏览

使用 microtime函数。文档包括示例代码。

你可以使用 microtime计算差值:

$time_pre = microtime(true);
exec(...);
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;

下面是 microtime: http://php.net/manual/en/function.microtime.php的 PHP 文档

您可以使用定时器类

    <?php


class Timer {


var $classname = "Timer";
var $start     = 0;
var $stop      = 0;
var $elapsed   = 0;


# Constructor
function Timer( $start = true ) {
if ( $start )
$this->start();
}


# Start counting time
function start() {
$this->start = $this->_gettime();
}


# Stop counting time
function stop() {
$this->stop    = $this->_gettime();
$this->elapsed = $this->_compute();
}


# Get Elapsed Time
function elapsed() {
if ( !$elapsed )
$this->stop();


return $this->elapsed;
}


# Resets Timer so it can be used again
function reset() {
$this->start   = 0;
$this->stop    = 0;
$this->elapsed = 0;
}


#### PRIVATE METHODS ####


# Get Current Time
function _gettime() {
$mtime = microtime();
$mtime = explode( " ", $mtime );
return $mtime[1] + $mtime[0];
}


# Compute elapsed time
function _compute() {
return $this->stop - $this->start;
}
}


?>

对于您的目的,这个简单的类应该是您所需要的全部:

class Timer {
private $time = null;
public function __construct() {
$this->time = time();
echo 'Working - please wait..<br/>';
}


public function __destruct() {
echo '<br/>Job finished in '.(time()-$this->time).' seconds.';
}
}




$t = new Timer(); // echoes "Working, please wait.."


[some operations]


unset($t);  // echoes "Job finished in n seconds." n = seconds elapsed
class Timer
{
private $startTime = null;


public function __construct($showSeconds = true)
{
$this->startTime = microtime(true);
echo 'Working - please wait...' . PHP_EOL;
}


public function __destruct()
{
$endTime = microtime(true);
$time = $endTime - $this->startTime;


$hours = (int)($time / 60 / 60);
$minutes = (int)($time / 60) - $hours * 60;
$seconds = (int)$time - $hours * 60 * 60 - $minutes * 60;
$timeShow = ($hours == 0 ? "00" : $hours) . ":" . ($minutes == 0 ? "00" : ($minutes < 10 ? "0" . $minutes : $minutes)) . ":" . ($seconds == 0 ? "00" : ($seconds < 10 ? "0" . $seconds : $seconds));


echo 'Job finished in ' . $timeShow . PHP_EOL;
}
}


$t = new Timer(); // echoes "Working, please wait.."


[some operations]


unset($t);  // echoes "Job finished in h:m:s"

因为 PHP 7.3,时间函数应该用于检测。

$start = hrtime(true);
// run your code...
$end = hrtime(true);


echo ($end - $start);                // Nanoseconds
echo ($end - $start) / 1000000;      // Milliseconds
echo ($end - $start) / 1000000000;   // Seconds

上述 微时函数依赖于系统时钟。它可以通过 ubuntu 上的 ntpd 程序或者仅仅通过 sysadmin 进行修改。

也可以使用 人力资源时间包,它有一个类 StopWatch。

作为替代,php 有一个内置的定时器控制器: new EvTimer()

它可以用来制作任务调度程序,并适当处理特殊情况。

这不仅是时间,而且是一个时间传输层,一个计时器,一个膝盖计数器,就像一个秒表,但与 php 回调;)

EvTimer 监视器是生成事件的简单相对定时器 在给定的时间之后,并且可以有规律地重复 在那之后。

计时器是 基于实时数据,也就是说,如果注册了一个事件 超时一个小时,并重置系统时钟到一月 去年,它仍将在(大约)一个小时后停止。

保证只有在超时之后才调用回调 如果多个计时器在 相同的循环迭代,那么具有 < strong > 早期超时值的循环迭代是 在同一优先级 的调用之前使用稍后的超时值调用。

计时器本身将尽最大努力在 避免漂移,也就是说,如果 一个定时器被配置成每10秒触发一次,然后它就会 正常情况下每隔10秒触发一次 脚本无法跟上计时器的速度,因为它花费的时间超过 这10秒做)的 计时器不会发射一次以上每 事件循环迭代。

前两个参数允许控制执行前的时间延迟和迭代次数。

第三个参数是一个回调函数,在每次迭代时调用。

after


Configures the timer to trigger after after seconds.


repeat


If repeat is 0.0 , then it will automatically be stopped once the timeout is reached.
If it is positive, then the timer will automatically be configured to trigger again every repeat seconds later, until stopped manually.

Https://www.php.net/manual/en/class.evtimer.php

Https://www.php.net/manual/en/evtimer.construct.php

$w2 = new EvTimer(2, 1, function ($w) {
echo "is called every second, is launched after 2 seconds\n";
echo "iteration = ", Ev::iteration(), PHP_EOL;


// Stop the watcher after 5 iterations
Ev::iteration() == 5 and $w->stop();
// Stop the watcher if further calls cause more than 10 iterations
Ev::iteration() >= 10 and $w->stop();
});

当然,我们可以使用基本的循环和 sleep()usleep()hrtime()的一些节奏轻松地创建这个函数,但是 new EvTimer()允许清理和组织多个调用,同时处理特殊情况,如 重叠