📜  设置倒计时 CLI php (1)

📅  最后修改于: 2023-12-03 15:28:07.791000             🧑  作者: Mango

设置倒计时 CLI php

简介

倒计时是一个非常常用的功能,比如在进行考试、竞赛、演讲、运动等活动时,我们都需要使用倒计时。在程序开发中,我们也会需要使用倒计时,比如在程序调试时,为了让程序能够自动结束,我们需要设置一个倒计时。本文将介绍如何在CLI php中设置倒计时。

实现

在CLI php中,我们可以使用sleep函数来进行暂停,从而实现倒计时。

下面是一个简单的倒计时的示例代码:

<?php
$seconds = 60; // 倒计时秒数
for ($i = $seconds; $i >= 0; $i--) {
    echo $i."\r";
    sleep(1); // 暂停1秒
}

代码解释:

  1. 设置要倒计时的秒数。
  2. 使用for循环来进行倒计时,从设置的秒数开始倒数到0。
  3. 输出当前的秒数,并使用\r来清除当前行的输出。
  4. 使用sleep函数暂停1秒,然后继续执行下一次循环。

注意,使用\r来清除当前行的输出,必须使用双引号包含字符串,否则\r将会被输出。

进阶实现

使用上述方法,只能进行简单的倒计时实现。如果需要更加高级的倒计时功能,比如可以暂停、继续、重置倒计时等功能,可以使用PHP提供的pcntl(Process Control)扩展。

下面是一个使用pcntl扩展实现的倒计时代码片段:

<?php
declare(ticks = 1);
$seconds = 60;

pcntl_signal(SIGINT, function($sig) {
    exit; // 当按下ctrl+c时,退出程序
});

pcntl_signal(SIGTERM, function($sig) {
    exit; // 当发送kill信号时,退出程序
});

$timer = pcntl_fork();
if ($timer == -1) {
    exit("fork error\n");
} else if ($timer == 0) {
    // 倒计时进程
    for ($i = $seconds; $i >= 0; $i--) {
        echo $i."\r";
        sleep(1);
    }
    exit; // 退出进程
} else {
    // 控制进程
    while (true) {
        $input = trim(fgets(STDIN)); // 读取用户输入的命令
        if ($input == 'pause') {
            posix_kill($timer, SIGSTOP); // 暂停倒计时进程
        } else if ($input == 'resume') {
            posix_kill($timer, SIGCONT); // 继续倒计时进程
        } else if ($input == 'reset') {
            posix_kill($timer, SIGTERM); // 终止倒计时进程
            $timer = pcntl_fork(); // 重新起一个倒计时进程
            if ($timer == -1) {
                exit("fork error\n");
            } else if ($timer == 0) {
                for ($i = $seconds; $i >= 0; $i--) {
                    echo $i."\r";
                    sleep(1);
                }
                exit; // 退出进程
            }
        } else if ($input == 'exit') {
            posix_kill($timer, SIGTERM); // 终止倒计时进程
            exit; // 退出程序
        }
    }
}

代码解释:

  1. 首先使用declare关键字来声明信号处理函数。
  2. 设置SIGINT和SIGTERM信号的处理函数,当用户按下ctrl + c或者发送kill信号时,退出程序。
  3. 使用pcntl_fork()创建一个子进程,子进程用于进行倒计时,父进程用于接收用户的命令。
  4. 在父进程中,使用fgets(STDIN)读取用户输入的命令。
  5. 当用户输入pause命令时,向子进程发送SIGSTOP信号暂停倒计时;当用户输入resume命令时,向子进程发送SIGCONT信号继续倒计时;当用户输入reset命令时,向子进程发送SIGTERM信号终止倒计时进程,然后重新创建一个子进程进行倒计时;当用户输入exit命令时,向子进程发送SIGTERM信号终止倒计时进程,然后退出程序。

总结:使用pcntl扩展可以实现更加高级的倒计时功能,比如可以暂停、继续、重置倒计时等功能,但是使用pcntl扩展需要注意信号处理函数的编写。