@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);
  • Вопрос задан
  • 3859 просмотров
Пригласить эксперта
Ответы на вопрос 1
Операция инкремента атомарна, а значит время ее выполнения зависит только от частоты процессора.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽