• Как сделать задержку выполнения скрипта < 10 миллисекунд?

    @b1nary Автор вопроса
    @morozovdenis Круто! Работает. Спасибо! Наличие usleep(), time_nanosleep() и их бесполезность поставила в тупик, т.е. функции есть - значит должно работать, если не работает, значит или я косячу или что-то на сервере. Потому все силы на разобраться где косяк.
    P.S. Впишите плиз ваш ответ в форму ниже, я поставлю ваш ответ как "Ответ на вопрос".
  • Как сделать задержку выполнения скрипта < 10 миллисекунд?

    @b1nary Автор вопроса
    @morozovdenis
    Нужно отправлять по сети (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);
  • Как сделать задержку выполнения скрипта < 10 миллисекунд?

    @b1nary Автор вопроса
    К сожалению нужно по сети с помощью fwrite() отправлять команды вот в таком интервале.
  • Пауза при выполнении скрипта

    @b1nary Автор вопроса
    UPD1 В общем нарыл немного такой инфы:
    Задержки менее 50 миллисекунд (в зависимости от скорости процессора, машины, и загрузки системы) не представляются возможными, т.к. для возвращения управления процессу в Linux тратится, как минимум, 10-30 миллисекунд. Указание таких задержек для usleep(3), на самом деле, приведет к большей задержке (уж, как минимум, в 10 мс).
    Здесь я так понимаю нужно что-то сделать с процессом отвечающим за задержку на сервере, то ли его приоритет повысить то ли ещё что, подскажите кто знает. Сервер на FreeBSD 9.1
  • Пауза при выполнении скрипта

    @b1nary Автор вопроса
    Ну так без usleep(10000); скрипт целиком выполняется за 14 миллисекунд. На VDS не то 2 не то 4 ядра 3Ггц, сейчас уже проверить не могу.
  • Загрузка строки из whois сервиса

    @b1nary Автор вопроса
    интересно, спасибо, буду думать. Про сохранить в локальную базу мысль была.