No Image

Php задержка в миллисекундах

СОДЕРЖАНИЕ
2 просмотров
11 марта 2020

Задержки php

Всем привет! Сегодня мы с вами рассмотрим реализацию задержек на php. Итак, поехали!

Для того чтобы выполнить простую задержку необходимо воспользоваться функцией sleep().

В качестве аргумента данная функция принимает в себя количество секунд в течении которых будет длиться задержка. То есть после вызова данной функции должно пройти 3 секунды и только после этого начнет выполняться последующая часть кода.

У функции sleep() есть аналог, а именно функция usleep().

Отличие заключается в том что данная функция принимает значение аргумента в микросекундах.(3000000 мкс = 3 с)

Если мы хотим указать задержку на нечетное количество времени можно воспользоваться функцией nanosleep().

Первым аргументом данная функция принимает количество секунд, а вторым количество микросекунд. В нашем примере мы выполнили задержку в 1.5 секунды.

Можно также выполнять задержки относительно текущего времени.

Делается это через функцию time_sleep_until(). В ней мы указываем количество секунд прошедших с эпохи UNIX, то есть с 1979 года. Сделать это можно через функцию time(). Получив текущее количество секунд прошедших с 1979 Года нам достаточно приплюсовать количество секунд задержки.

Напоследок мы с вами рассмотрим функцию с помощью которой можно ограничить время выполнения скрипта.

Здесь мы сделали задержку в 3 секунды. Однако в самом начале была вызвана функция set_time_limit() с аргументом 2 секунды. Именно с помощью данной функции мы можем ограничивать время выполнения скрипта на заданное время. Так как время выполнения скрипта вместе с задержкой у нас 3 секунды, а ограничение выполнения стоит на 2 секунды, произойдет ошибка.

Если изменить ограничение, к примеру на 4 секунды.

Здесь ошибки уже не будет.

С помощью функции set_time_limit() мы можем выставить неограниченное время выполнения скрипта.

Достаточно в данной функции указать значение 0. Однако перед этим необходимо в файле конфигурации php.ini отключить безопасный режим.

Вот так мы можем реализовывать временные задержки при выполнении php сценариев.

На этом данная статья подошла к концу. Не забывайте оставлять вопросы в комментариях или группе

А на этом у меня все. Желаю вам успехов и удачи! Пока.

(PHP 4, PHP 5, PHP 7)

sleep — Задержка выполнения

Описание

Откладывает исполнение программы на число секунд, указанное в параметре seconds .

Список параметров

Время остановки в секундах.

Возвращаемые значения

Возвращает 0 при успешном выполнении или FALSE при ошибке.

Если вызов был прерван сигналом, функция sleep() возвратит значение, не равное нулю. В Windows это значение всегда будет равно 192 (значение константы Windows API WAIT_IO_COMPLETION ). На других платформах возвращаемом значением будет количество секунд, оставшихся до задержки.

Ошибки

Если указанное число секунд в параметре seconds отрицательное, то функция сгенерирует ошибку уровня E_WARNING .

Список изменений

Версия Описание
5.3.4 До PHP 5.3.4 функция sleep() в Windows всегда возвращала NULL после завершения ожидания, независимо от того было ли прервано выполнение функции или нет.

Примеры

Пример #1 Пример использования sleep()

// текущее время
echo date ( ‘h:i:s’ ) . "
" ;

// ожидание в течениe 10 секунд
sleep ( 10 );

// завершение ожидания
echo date ( ‘h:i:s’ ) . "
" ;

Этот пример выведет (через 10 секунд)

Смотрите также

  • usleep() – Задержка выполнения в микросекундах
  • time_nanosleep() – Задержка на заданное число секунд и наносекунд
  • time_sleep_until() – Откладывает исполнение скрипта до заданного времени
  • set_time_limit() – Ограничение времени выполнения скрипта

User Contributed Notes 21 notes

This may seem obvious, but I thought I would save someone from something that just confused me: you cannot use sleep() to sleep for fractions of a second. This:

Читайте также:  Как отключить голосовой помощник в windows 10

( 0.25 ) ?>

will not work as expected. The 0.25 is cast to an integer, so this is equivalent to sleep(0). To sleep for a quarter of a second, use:

re: "mitigating the chances of a full bruit force attack by a limit of 30 lookups a minute."

Not really – the attacker could do 100 requests. Each request might take 2 seconds but it doesn’t stop the number of requests done. You need to stop processing more than one request every 2 seconds rather than delay it by 2 seconds on each execution.

Maybe obvious, but this my function to delay script execution using decimals for seconds (to mimic sleep(1.5) for example):

/**
* Delays execution of the script by the given time.
* @param mixed $time Time to pause script execution. Can be expressed
* as an integer or a decimal.
* @example msleep(1.5); // delay for 1.5 seconds
* @example msleep(.1); // delay for 100 milliseconds
*/
function msleep ( $time )
<
usleep ( $time * 1000000 );
>
?>

If you are having issues with sleep() and usleep() not responding as you feel they should, take a look at session_write_close()

as noted by anonymous on comments;
"If the ajax function doesn’t do session_write_close(), then your outer page will appear to hang, and opening other pages in new tabs will also stall."

it is a bad idea to use sleep() for delayed output effects as

1) you have to flush() output before you sleep

2) depending on your setup flush() will not work all the way to the browser as the web server might apply buffering of its own or the browser might not render output it thinks not to be complete

netscape for example will only display complete lines and will not show table parts until the tag arrived

so use sleep if you have to wait for events and don’t want to burn to much cycles, but don’t use it for silly delayed output effects!

This will allow you to use negative values or valuer below 1 second.

( 0.5 ); ?>

function slaap ( $seconds )
<
$seconds = abs ( $seconds );
if ( $seconds 1 ):
usleep ( $seconds * 1000000 );
else:
sleep ( $seconds );
endif;
>
?>

A really simple, but effective way of majorly slowing down bruit force attacks on wrong password attempts.

In my example below, if the end-user gets the password correct, they get to log in at full speed, as expected. For every incorrect password attempt, the users response is delayed by 2 seconds each time; mitigating the chances of a full bruit force attack by a limit of 30 lookups a minute.

I hope this very simple approach will help make your web applications that little bit more secure.

public function handle_login () <
if( $uid = user :: check_password ( $_REQUEST [ ’email’ ], $_REQUEST [ ‘password’ ])) <
return self :: authenticate_user ( $uid );
>
else <
// delay failed output by 2 seconds
// to prevent bruit force attacks
sleep ( 2 );
return self :: login_failed ();
>
>
?>

Notice that sleep() delays execution for the current session, not just the script. Consider the following sample, where two computers invoke the same script from a browser, which doesn’t do anything but sleep.

Читайте также:  Часы 6э4 1 ратник отзывы

(PHP 4, PHP 5, PHP 7)

usleep — Задержка выполнения в микросекундах

Описание

Откладывает выполнение программы на указанное число микросекунд.

Список параметров

Время откладываемого исполнения в микросекундах. Микросекунда – это одна миллионная секунды.

Возвращаемые значения

Эта функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования usleep()

// Текущее время
echo date ( ‘h:i:s’ ) . "
" ;

// ждать 2 секунды
usleep ( 2000000 );

// вернуться к исполнению
echo date ( ‘h:i:s’ ) . "
" ;

Результат выполнения данного примера:

Смотрите также

  • sleep() – Задержка выполнения
  • time_nanosleep() – Задержка на заданное число секунд и наносекунд
  • time_sleep_until() – Откладывает исполнение скрипта до заданного времени
  • set_time_limit() – Ограничение времени выполнения скрипта

User Contributed Notes 12 notes

the snippet below by ‘Marius (mm at co-operation dot de)’ is NOT a usleep and it will keep the CPU at 100% running. why people keep posting that crap is a complete mystery for me.

the idea of sleep and usleep is that by letting the cpu run a few idle cycles so the other programs can have some cycles run of their own. what results in better response times and lower overall system-load. so if you have to wait for something, go to sleep for a few seconds instead of occupying the cpu while doing absolute nothing but waitting.

On both MacOS X and Linux the usleep() call seems to consume CPU cycles, whereas sleep() and time_nanosleep() do not. This was the same on PHP 5.3.29 and 5.5.29.

I used a loop with just a call to sleep/usleep/time_nanosleep, and compared them all with an empty loop. Obviously the empty loop consumed 99% of the CPU, sleep used 0%, usleep used 3% for 1000ms and 6% for 100ms, and time_nanosleep used 0% for both 500ms and 1000ms.

If you’re using Windows then you maybe are in trouble with usleep if you really need to use it.

The Bernie’s microdelay function using fsockopen does not work properly, and the fclose doesn’t help much.

I don’t know if network connections go strange, but I know it does not work since you’ve made more than 2000 – 3000 calls to it, so it’s not a reliable solution in ‘long life’ php scripts, or these are the issues of the microdelay function in my PHP and PHP-GTK applications.

Though another solution should be found, and googling a bit I fount a WinAPI function: Sleep.

So I get with this snippet wich works fine for me, you get milliseconds precission but the more important, it works for long-run scripts and of course, it does not waste any CPU cycles.

// USleep alternative for Windows and PHP4:
$GLOBALS[‘win32api’]->registerfunction("long Sleep (long dwMillisecods) From kernel32.dll");

// Now you can call the function from everywhere in your script: $GLOBALS[‘win32api’]->Sleep(milliseconds);

for ($msec = 2000; $msec > 0; $msec = $msec – 125) <
echo "Hi. Next one in $msec msec.
";
$GLOBALS[‘win32api’]->Sleep($msec);
>

Note that this function has an overhead!

Example:
for ( $i = 0 ; $i 1000000 ; ++ $i )
<
usleep ( 1 );
>
?>

This block is running about 70 seconds on my server.
Script take about 70 microseconds for every usleep() function call.

To monitor a scripts CPU ussage and avoid any nasty CPU gobbling loops you can use this function (will not work with windows or safe mode) I know it works on FreeBSD:
function phpmon($max)
<
$cmd = `ps -Unobody -r -o%cpu`;
$lines = explode("
", $cmd);
$usage = substr($lines[1], 0, strpos($lines[1], "."));
$sleeprate = 500;
while ($usage >= $max)
<
$cmd = `ps -Unobody -r -o%cpu`;
$lines = explode("
", $cmd);
$usage = substr($lines[1], 0, strpos($lines[1], "."));
usleep($sleeprate);
>
>

Читайте также:  Игровой ноутбук за 40 тысяч

where $MAX is the maximum CPU you want the process to consume. e-mail me with any improvements/suggestions.

I have noticed that this consumes a lot of system CPU (at least in my limited testing) possibly from all of the system calls or the huge mathematical functions I used to test the effectiveness of the script.

I have spent DAYS trying to create a reliable usleep()-replacement for Windows.

I have only this to offer:

As commented by someone else already, the gettimeofday() method used below is useless – PHP will use all available CPU power doing nothing.

The fsockopen() method apparently is also useless – as someone else commented, an fclose() was missing in the original post, but this apparently does not solve the problem. After calling the function about 50 or so times, fsockopen() returns immidiately, without any delay – and watching a process monitor in Windows, you can then watch the process taking up increasingly more memory, until eventually PHP aborts (or crashes) when it reaches maximum.

The win32api-method is also a no-go . after calling the Sleep function a few hundred times (during which memory usage will also go up every time due to a memory leak somewhere), PHP will cause an exception and Windows will terminate it.

I have given up – I don’t think there is any viable solution to this problem under PHP 4.

If you need this function, upgrade your project to PHP 5.

Or settle for 1-second delays with the sleep()-function.

These, unfortunately, seem to be your only options.

Dude you are SO the man for that code snippet. It worked like a charm. I just wanted to point out a couple things and offer my own improvement.

1. If you’re like me, you were probably wondering why the socket had to keep being recreated on each call, and why you couldn’t just create a static socket. Its because socket_select assumes you’re passing in a pointer, and will alter the variable on return to reflect the actual sockets that were changed.

2. I couldn’t figure out for the life of me why socket_select wasn’t defined. Its because you hadn’t enabled the right extension in php.ini

Ok so heres my slight improvement. The only real thing I did is use a static variable for the socket, to avoid creating a brand new socket on each call of this function. I’m not sure if socket creation will cause things to crash down the line like the other problems reported on here, but if you ask me better safe then sorry.

function Sleeper($mSec)
<
// For dummies like me who spent 5 minutes
// wondering why socket_create wasn’t defined
if(!function_exists(‘socket_create’)) <
die("Please enable extension php_sockets.dll");
>

// So the socket is only created once
static $socket=false;
if($socket===false) <
$socket=array(socket_create(AF_INET,SOCK_RAW,0));
>
$pSock=$socket;

// Calc time
$uSex = $mSec * 1000;

// Do the waiting
socket_select($read=NULL,$write=NULL,$pSock,0,$uSex);

Комментировать
2 просмотров
Комментариев нет, будьте первым кто его оставит

Это интересно
No Image Компьютеры
0 комментариев
No Image Компьютеры
0 комментариев
No Image Компьютеры
0 комментариев
No Image Компьютеры
0 комментариев
Adblock detector