Таймер обратного счета на PHP
Доброго времени суток! Как Вы, наверное, уже знаете, я часто провожу распродажи моих видеокурсов. На странице распродажи есть таймер обратного счета на PHP, который информирует посетителей сколько времени осталось до окончания распродажи.И вот его примерную реализацию я Вам сегодня и покажу.
$endOfDiscount = mktime(23,59,0,3,26,2020); // дата окончания распродажи
$now = time(); // текущее время
$secondsRemaining = $endOfDiscount — $now; // оставшееся время
define(‘SECONDS_PER_MINUTE’, 60); // секунд в минуте
define(‘SECONDS_PER_HOUR’, 3600); // секунд в часу
define(‘SECONDS_PER_DAY’, 86400); // секунд в дне
$daysRemaining = floor($secondsRemaining / SECONDS_PER_DAY); //дни, до даты
$secondsRemaining -= ($daysRemaining * SECONDS_PER_DAY); //обновляем переменную
$hoursRemaining = floor($secondsRemaining / SECONDS_PER_HOUR); // часы до даты
$secondsRemaining -= ($hoursRemaining * SECONDS_PER_HOUR); //обновляем переменную
$minutesRemaining = floor($secondsRemaining / SECONDS_PER_MINUTE); //минуты до даты
$secondsRemaining -= ($minutesRemaining * SECONDS_PER_MINUTE); //обновляем переменную
echo(«
До окончания распродажи осталось $daysRemaining дней, $hoursRemaining часов, $minutesRemaining минут, $secondsRemaining секунда
«); //печатаем сообщение
Создано 24.03.2020 13:30:22
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 0 ):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.
Примеры
// Создаём и запускаем таймер, который сработает через 2 секунды, после чего будет срабатывать
// раз в секунду, пока вы его вручную не остановите
$w2 = new EvTimer ( 2 , 1 , function ( $w ) echo «вызывается раз в секунду, первое срабатывание через 2 секунды\n» ;
echo «итерация color: #007700″>, Ev :: iteration (), PHP_EOL ;
// Останавливаем наблюдателя через 5 итераций
Ev :: iteration () == 5 and $w -> stop ();
// Остановливаем наблюдателя, если следующий вызов приведёт к десятой (или больше) итерации
Ev :: iteration () >= 10 and $w -> stop ();
>);
// Создаём остановленный таймер. Он будет неактивен, пока мы его не запустим
$w_stopped = EvTimer :: createStopped ( 10 , 5 , function( $w ) echo «Callback-функция таймера, созданного остановленным\n» ;
// Останавливаем наблюдателя через 2 итерации
Ev :: iteration () >= 2 and $w -> stop ();
>);
// Запускаем событийный цикл, пока работает хотя бы один наблюдатель или пока не вызван Ev::stop()
Ev :: run ();
// Запускаем и смотрим, как он работает
$w_stopped -> start ();
echo «Запускаем одну итерацию\n» ;
Ev :: run ( Ev :: RUN_ONCE );
echo «Перезапускаем второго наблюдателя и пытаемся отловить те же события, но не блокируем\n» ;
$w2 -> again ();
Ev :: run ( Ev :: RUN_NOWAIT );
$w = new EvTimer ( 10 , 0 , function() <>);
echo «Запускаем блокирующий цикл\n» ;
Ev :: run ();
echo «END\n» ;
?>
Результатом выполнения данного примера будет что-то подобное:
2 секунды прошло вызывается раз в секунду, первое срабатывание через 2 секунды итерация = 1 вызывается раз в секунду, первое срабатывание через 2 секунды итерация = 2 вызывается раз в секунду, первое срабатывание через 2 секунды итерация = 3 вызывается раз в секунду, первое срабатывание через 2 секунды итерация = 4 вызывается раз в секунду, первое срабатывание через 2 секунды итерация = 5 Запускаем одну итерацию Функция обратного вызова таймера, созданного остановленным Перезапускаем второго наблюдателя и пытаемся отловить те же события, но не блокируем Запускаем блокирующий цикл вызывается раз в секунду, первое срабатывание через 2 секунды итерация = 8 вызывается раз в секунду, первое срабатывание через 2 секунды итерация = 9 вызывается раз в секунду, первое срабатывание через 2 секунды итерация = 10 END
Пример #2 Периодический таймер. Срабатывает раз в 10.5 секунд
$w = new EvPeriodic ( 0. , 10.5 , NULL , function ( $w , $revents ) echo time (), PHP_EOL ;
>);
?php
Пример #3 Периодический таймер. Использование callback-функции для перезадания интервала
// Срабатывает раз в 10.5 секунд
?php
function reschedule_cb ( $watcher , $now ) return $now + ( 10.5 . — fmod ( $now , 10.5 ));
>
$w = new EvPeriodic ( 0. , 0. , «reschedule_cb» , function ( $w , $revents ) echo time (), PHP_EOL ;
>);
Пример #4 Периодический таймер. Срабатывает каждые 10.5 секунд, начиная с текущего момента
// Срабатывает раз в 10.5 секунд начиная с текущего момента
$w = new EvPeriodic ( fmod ( Ev :: now (), 10.5 ), 10.5 , NULL , function ( $w , $revents ) echo time (), PHP_EOL ;
>);
?php
Пример #5 Ждём, пока STDIN не станет читаемым
// Ждём, пока STDIN не станет читаемым
$w = new EvIo ( STDIN , Ev :: READ , function ( $watcher , $revents ) echo «STDIN is readable\n» ;
>);
?php
Пример #6 Используем асинхронный ввод/вывод для доступа к сокету
/* Используем асинхронный ввод/вывод для доступа к сокету */
?php
// Модуль `sockets’ продолжит логировать предупреждения
// для EINPROGRESS, EAGAIN/EWOULDBLOCK etc.
error_reporting ( E_ERROR );
$e_nonblocking = array ( /*EAGAIN или EWOULDBLOCK*/ 11 , /*EINPROGRESS*/ 115 );
// Получаем порт для сервиса WWW
$service_port = getservbyname ( ‘www’ , ‘tcp’ );
// Получаем IP-адрес целевого хоста
$address = gethostbyname ( ‘google.co.uk’ );
// Создаём сокет TCP/IP
$socket = socket_create ( AF_INET , SOCK_STREAM , SOL_TCP );
if ( $socket === FALSE ) echo «Ошибка при вызове socket_create(): причина: »
. socket_strerror ( socket_last_error ()) . «\n» ;
>
// Устанавливаем флаг O_NONBLOCK
socket_set_nonblock ( $socket );
// Прерываем по превышению времени ожидания
$timeout_watcher = new EvTimer ( 10.0 , 0. , function () use ( $socket ) socket_close ( $socket );
Ev :: stop ( Ev :: BREAK_ALL );
>);
// Посылаем запрос HEAD когда сокет доступен для записи
$write_watcher = new EvIo ( $socket , Ev :: WRITE , function ( $w )
use ( $socket , $timeout_watcher , $e_nonblocking )
// Останавливаем наблюдателя $timeout_watcher
$timeout_watcher -> stop ();
// Останавливаем наблюдателя $write_watcher
$w -> stop ();
$in = «HEAD / HTTP/1.1\r\n» ;
$in .= «Host: google.co.uk\r\n» ;
$in .= «Connection: Close\r\n\r\n» ;
if (! socket_write ( $socket , $in , strlen ( $in ))) trigger_error ( «Ошибка записи $in в сокет» , E_USER_ERROR );
>
$read_watcher = new EvIo ( $socket , Ev :: READ , function ( $w , $re )
use ( $socket , $e_nonblocking )
// Сокет доступен для чтения. Читаем 20 байт в неблокирующем режиме
$ret = socket_recv ( $socket , $out , 20 , MSG_DONTWAIT );
if ( $ret ) echo $out ;
> elseif ( $ret === 0 ) // Все прочтено
$w -> stop ();
socket_close ( $socket );
return;
>
// Ловим EINPROGRESS, EAGAIN или EWOULDBLOCK
if ( in_array ( socket_last_error (), $e_nonblocking )) return;
>
$w -> stop ();
socket_close ( $socket );
>);
$result = socket_connect ( $socket , $address , $service_port );
Результатом выполнения данного примера будет что-то подобное:
HTTP/1.1 301 Moved Permanently Location: http://www.google.co.uk/ Content-Type: text/html; charset=UTF-8 Date: Sun, 23 Dec 2012 16:08:27 GMT Expires: Tue, 22 Jan 2013 16:08:27 GMT Cache-Control: public, max-age=2592000 Server: gws Content-Length: 221 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN Connection: close
Пример #7 Встраиваем один цикл в другой
/*
* Пытаемся получить встраиваемый цикл и встроить его в событийный цикл по умолчанию.
* Если это невозможно — используем цикл по умолчанию. Цикл по умолчанию
* хранится в $loop_hi, а встраиваемый в $loop_lo (который будет равен $loop_hi в случае
* если мы не будем использовать встраиваемый цикл).
*
* Пример взят из
* http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#Examples_CONTENT-9
*/
$loop_hi = EvLoop :: defaultLoop ();
$loop_lo = NULL ;
$embed = NULL ;
?php
if ( $loop_lo ) $embed = new EvEmbed ( $loop_lo , function () <>);
> else $loop_lo = $loop_hi ;
>
?>
Пример #8 Встраивание цикла, созданного с помощью kqueue в цикл по умолчанию
/*
* Проверяем, что бэкенд kqueue доступен, но не рекомендован, и создаём его для
* работы с сокетами (которые обычно работают с любой реализацией kqueue).
* Сохраняем событийный цикл kqueue/socket-only в loop_socket. (Можно опционально
* использовать флаг EVFLAG_NOENV)
*
* Пример взят из
* http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#Examples_CONTENT-9
*/
$loop = EvLoop :: defaultLoop ();
$socket_loop = NULL ;
$embed = NULL ;
?php
if (! $socket_loop ) $socket_loop = $loop ;
>
// теперь используем $socket_loop для всех сокетов, а $loop для всего остального
?>
Пример #9 Перехватываем сигнал SIGTERM
$w = new EvSignal ( SIGTERM , function ( $watcher ) echo «Получен сигнал SIGTERM\n» ;
$watcher -> stop ();
>);
?php
Пример #10 Отслеживаем изменение /var/log/messages
// Используем интервал опроса в 10 секунд
$w = new EvStat ( «/var/log/messages» , 8 , function ( $w ) echo «/var/log/messages изменён\n» ;
?php
if ( $attr [ ‘nlink’ ]) printf ( «Текущий размер: %ld\n» , $attr [ ‘size’ ]);
printf ( «Текущее значение atime: %ld\n» , $attr [ ‘atime’ ]);
printf ( «Текущее значение mtime: %ld\n» , $attr [ ‘mtime’ ]);
> else fprintf ( STDERR , «файл `messages` отсутствует!» );
$w -> stop ();
>
>);
Пример #11 Отслеживаем изменение /var/log/messages. Избегаем пропуска обновлений с помощью задержки в одну секунду
$timer = EvTimer :: createStopped ( 0. , 1.02 , function ( $w ) $w -> stop ();
?php
// 1 секунду после последнего изменения файла
printf ( «Текущий размер: %ld\n» , $stat -> attr ()[ ‘size’ ]);
>);
$stat = new EvStat ( «/var/log/messages» , 0. , function () use ( $timer ) // Сбрасываем наблюдателя $timer
$timer -> again ();
>);
Пример #12 Отслеживаем изменения статуса процесса
if ( $pid == — 1 ) fprintf ( STDERR , «pcntl_fork failed\n» );
> elseif ( $pid ) $w = new EvChild ( $pid , FALSE , function ( $w , $revents ) $w -> stop ();
printf ( «Процесс %d вышел с кодом %d\n» , $w -> rpid , $w -> rstatus );
>);
// Защита от зомби процессов
pcntl_wait ( $status );
> else // Порождённый потомок
exit( 2 );
>
?>
Обратный отсчет времени на PHP
Всем большущий привет!
Хочу предложить для вас небольшой скрипт на PHP, предназначенный для обратного отсчета времени. Этот скрипт позволяет выводить оставшиеся дни, часы, минуты и секунды. Как только таймер достигнет указанного времени, появится сообщение, которое вы напишите в скрипте, например, «с Новым Годом» или «акция закончилась».
Скрипт очень удобно применять в случаях, если нужно к определенному времени отсчитывать время, например, к Новому Году, Рождеству, Дню рождения блога/сайта, время окончания акции, конкурса и т.п.
Код скрипта для отсчета времени
Скопируйте код PHP и вставьте на ваш сайт в то место, где вы хотите видеть вывод даты. Но скрипт должен быть размещен между тегами .
switch(substr($days, -2)) < case 1: $d='день'; break; case 2: case 3: case 4: $d='дня'; break; default: $d='дней'; >switch(substr($hour, -2)) < case 1: $h='час'; break; case 2: case 3: case 4: $h='часа'; break; default: $h='часов'; >switch(substr($min, -2)) < case 1: $m='минута'; break; case 2: case 3: case 4: $m='минуты'; break; default:$m='минут'; >?> 0) echo ‘До нового года ‘.$o.’:
‘; ?> 0) echo $days.’ ‘.$d; ?>, 0) echo ‘ ‘.$hour.’ ‘.$h; ?> 0) echo ‘ и ‘.$min.’ ‘.$m; ?>
Настройки скрипта.
Строка (2) – указывает число, месяц, год окончания работы таймера.
$date = strtotime(» 1 January 2014 «);
Для тех, кто не знает месяца на английском, вот весь список:
Январь – January
Февраль – February
Март – March
Апрель – April
Май – May
Июнь – June
Июль – July
Август – August
Сентябрь – September
Октябрь – October
Ноябрь – November
Декабрь – December
Строка (41) – напишите надпись, до чего осталось время. В данном примере написано так: «До Нового Года».
0) echo ‘ До нового года ‘.$o.’:
‘; ?>
Строка (45) – напишите надпись, которая появится посетителям после остановки таймера.
Если вы владеете HTML и CSS стилем, тогда можно придать выводимым цифрам таймера и тексту оригинальный вид.
Это все!
Спасибо вам, что вы являетесь постоянными посетителями блога BlogGood.ru