@b1nary
php junior

Пауза при выполнении скрипта

Нужно отправлять по сети (UDP) на Ардуино команды. Есть PHP. Да, PHP не лучший вариант, но уж что есть.

Есть массив $asciiCommandsArray, где каждая ячейка это команда в виде строчки ASCII символов. В цикле я отправляю каждую строчку в Ардуино. Ардуино всё чётко принимает, но между отправкой команд должна быть определённая пауза. 10 миллисекунд. Я вставляю в цикл функцию usleep(10000); что равно 10 миллисекундам. Для проверки точности времени паузы, дальше пишу в массив $commandTime сколько прошло времени после выполнения предыдущей итерации. Команд > 2000. Скрипт выполняется около 30 секунд. Пауза между итерациями, судя по var_dump($commandTime); составляет 30 миллисекунд. Т.е. больше чем мне надо. Я подумал как и вы, что сами функции usleep(10000); и microtime(); забирают это время. Я сделал так: usleep(10); пауза всё равно 20 миллисекунд. Я закомментировал usleep(10);. Тут весь скрипт выполнился за 15 миллисекунд. Пробовал time_nanosleep(); и ставил несколько наносекунд - результат всё равно 15 миллисекунд. Пробовал вначале на ноуте с Denwerом, потом закинул на мощный VDS, там выполняется строго 20 миллисекунд. Т.е. если написать usleep(большое число); будет выполняться >= 15 миллисекунд но никак не меньше! Даже и не знаю что предположить. Есть идеи?

//Подключаемся к Ардуино
$fp = fsockopen('udp://172.16.1.1', 8000, $errno, $errstr);

//Засекаем время начала выполнения отправки данных
$start = microtime(true);

//Отправляем в цикле команды в Ардуино
for($i = 0; $i <= count($asciiCommandsArray) - 1; $i++){
    //Отправляем АСКИ строчку в Ардуино
    fwrite($fp, $asciiCommandsArray[$i]);
    //Делаем паузу
    usleep(10000);

    //Вычисляем и запоминаем сколько прошло секунд
    $commandTime[] = microtime(true) - $start;
}

echo '<br>Время выполнения скрипта:  '.(microtime(true) - $start).' сек. <br>';

var_dump($commandTime);
  • Вопрос задан
  • 3866 просмотров
Пригласить эксперта
Ответы на вопрос 1
Операция инкремента атомарна, а значит время ее выполнения зависит только от частоты процессора.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы