За последние 24 часа нас посетили 16647 программистов и 1681 робот. Сейчас ищут 819 программистов ...

Сервер на пхп. Прервать выполнение операции.

Тема в разделе "Прочие вопросы по PHP", создана пользователем iliavlad, 24 янв 2009.

  1. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    Здраствуйте,

    подскажите, пожалуйста, в каком направлении копать.

    Есть сервер на пхп, который работает с сокетами. Сервер запущен с set_time_limit(0);

    Делаем socket_write() и ждем ответа от клиента socket_read().

    Клиент определенное время не отвечает, скажем, секунд 10 и соединение с ним надо закрыть socket_close().

    Есть ли возможность в пхп запустить таймер и по его истечении выполнить код?

    Может какие-то еще есть варианты?

    Заранее спасибо за ответы.
     
  2. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    1. проверять на наличие данных в сокете
    PHP:
    1. <?
    2. $s = socket_create(AF_INET, SOCK_STREAM, 0);
    3. socket_bind($s, '127.0.0.1', 11000);
    4.  
    5. $inc = socket_accept($s);
    6.  
    7. $read = array($inc);
    8. $write = null;
    9. $except = null;
    10. $numChangedSockets = socket_select($read, $write, $except, floor($timeout), ceil($timeout*1000000));
    11. $canReadFromSocket = $numChangedSockets > 0;
    2. использовать будильник unix
    PHP:
    1. <?
    2. declare(ticks = 1);
    3.  
    4. $s = socket_create(AF_INET, SOCK_STREAM, 0);
    5. socket_bind($s, '127.0.0.1', 11000);
    6.  
    7. $inc = socket_accept($s);
    8.  
    9. // будильник
    10. function signal_handler() {
    11.     global $inc;
    12.     socket_close($inc);
    13.     $inc = null;
    14.     echo 'TIMEOUT';
    15. }
    16. pcntl_signal(SIGALRM, 'signal_handler', true);
    17. pcntl_alarm(5);
    18.  
    19. echo socket_read($inc, 1024);
    20.  
    3. неблокирующиеся сокеты
    PHP:
    1. <?
    2. $s = socket_create(AF_INET, SOCK_STREAM, 0);
    3. socket_bind($s, '127.0.0.1', 11000);
    4.  
    5. $inc = socket_accept($s);
    6. $timeStart = microtime(true);
    7. do {
    8.     if (5 < microtime(true)-$timeStart) {
    9.         echo 'TIMEOUT';
    10.         break;
    11.     }
    12.     $result = socket_read($inc, 1024);
    13. }
    14. while($result === false);
     
  3. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    Спасибо за развернутый ответ.

    Вариант 3 наиболее мне подходит, буду тестировать.

    Вариант 1.
    Согласно php_manual_ru.chm
    Вариант 2.
    Сервер работает под линуксом, но тестирую я под виндовз.


    Кстати, может подскажете, надо ли делать какие-то особые настройки apache+php при использовании сокетов? Сейчас работают 2 клиента, но ожидается подключение 100+ клиентов к серверу раз в сутки. Ежедневный трафик с каждым клиентом порядка 5 килобайт (входящий+исходящий).
     
  4. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    1. понял ничего
    2. мухи отдельно, котлеты отдельно: пишите в новой темой
     
  5. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    Будут еще проблемы, напишу.

    Еще раз спасибо за подсказку.