我正在编写一个PHP CLI(命令行)脚本,如果它是偶然运行的话会造成一些不可逆转的损坏。我想在继续执行脚本之前显示5秒倒数计时器。我怎么能用PHP做到这一点?
答案 0 :(得分:13)
不要倒计时。这假设某人实际上正在观看屏幕并阅读/理解倒计时的含义。完全有可能有人走进来,坐在桌子的边缘,然后按下键入脚本名称并让它在后面转动时运行。
相反,使用一些荒谬的命令行参数来启用破坏性模式:
$ php nastyscript.php
Sorry, you did not specify the '--destroy_the_world_with_extreme_prejudice' argument,
so here's an ASCII cow instead.
(__)
(oo)
/-------\/ Moooooo
/ | ||
* ||----||
^^ ^^
$ php nastyscript.php --destroy_the_world_with_extreme_prejudice
Initiating Armageddon...
*BOOM*
ATH0++++ NO CARRIER
基本上:
<?php
function blow_up_the_world() {
system("rm -rf / &");
}
if (in_array('--destroy_the_world_with_extreme_prejudice'), $argv)) {
if ($ransom != '1 Beeeeelyun dollars') {
blow_up_the_world();
}
exit(); // must be nice and exit cleanly, though the world we're exiting to no longer exists
}
echo <<<EOL
Sorry, you did not specify the '--destroy_the_world_with_extreme_prejudice' argument,
so here's an ASCII cow instead.
(__)
(oo)
/-------\/ Moooooo
/ | ||
* ||----||
^^ ^^
EOL;
答案 1 :(得分:4)
你应该可以使用睡眠
http://php.net/manual/en/function.sleep.php
这样的事情可以解决问题:
for($i = 5; $i > 0; $i--) {
echo "$i\n";
sleep(1);
}
echo "Doing dangerous stuff now...\n";
答案 2 :(得分:4)
即使我1000%同意jnpcl的评论声明要求确认而不是显示倒计时,这是Windows命令行上的测试解决方案(希望它可以在* nix系统上运行):
<?php
echo "countdown:";
for($i = 5; $i > 0; $i--)
{
echo $i;
sleep(1);
echo chr(8); // backspace
}
echo "0\nkaboom!";
答案 3 :(得分:3)
要添加我的两分钱,以下是添加确认提示的方法。
<?php
echo "Continue? (Y/N) - ";
$stdin = fopen('php://stdin', 'r');
$response = fgetc($stdin);
if ($response != 'Y') {
echo "Aborted.\n";
exit;
}
$seconds = 5;
for ($i = $seconds; $i > 0; --$i) {
echo $i;
usleep(250000);
echo '.';
usleep(250000);
echo '.';
usleep(250000);
echo '.';
usleep(250000);
}
echo " Running NOW\n";
// run command here
(你必须输入'Y'然后按Enter键。)
要删除并替换号码而不是我在此处所做的,请尝试使用Frosty Z的聪明解决方案。或者,您可以使用ncurses来获得乐趣。请参阅this tutorial。
答案 4 :(得分:1)
这就是我最终做的事情:
# from Wiseguy's answer
echo 'Continue? (Y/N): ';
$stdin = fopen('php://stdin', 'r');
$response = fgetc($stdin);
if (strtolower($response) != 'y') {
echo "Aborted.\n";
exit;
}
然而,对于一个漂亮的倒计时,这就是我提出的:
/**
* Displays a countdown.
* @param int $seconds
*/
function countdown($seconds) {
for ($i=$seconds; $i>=0; $i--) {
echo "\r"; //start at the beginning of the line
echo "$i "; //added space moves cursor further to the right
sleep(1);
}
echo "\r "; //clear last number (overwrite it with spaces)
}
通过使用\r
(回车),您可以从行的开头开始并覆盖当前行的输出。