За последние 24 часа нас посетили 22318 программистов и 1140 роботов. Сейчас ищут 667 программистов ...

Зависание сокета

Тема в разделе "PHP для профи", создана пользователем prostodeniska, 15 мар 2016.

  1. prostodeniska

    prostodeniska Новичок

    С нами с:
    15 мар 2016
    Сообщения:
    5
    Симпатии:
    0
    Есть скрипт сокет-сервера, который должен принимать данные. При этом установлен неявный сброс вывода с помощью ob_implicit_flush. Если удалить весь код после строки socket_accept включительно, то скрип выполняется и вывод отображается, но при запуске всего скрипта вывод игнорируется и он просто зависает на строке socket_accept. Попытки подключиться к нему так же безуспешны. Пример используется на PHP 5.4-5.6. Как я понял на более ранних версиях он работает корректно, но сам не проверял.

    Код (PHP):
    1.         set_time_limit(0);
    2.  
    3.         $address = '127.0.0.1';
    4.         $port = 8889;
    5.  
    6.         $sock = socket_create(AF_INET, SOCK_STREAM, 0);
    7.         echo 'Создание сокета';
    8.         if (!$sock) {
    9.                 echo 'Ошибка: '.socket_strerror(socket_last_error());
    10.                 exit();
    11.         } else {
    12.                 echo 'ОК';
    13.         }
    14.  
    15.         socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);
    16.        
    17.         $bind = socket_bind($sock, $address, $port);
    18.         if (!$bind) {
    19.                 echo 'Ошибка: '.socket_strerror(socket_last_error());
    20.                 exit();
    21.         } else {
    22.                 echo 'OК';
    23.         }
    24.  
    25.         echo 'Прослушивание сокета... ';
    26.  
    27.         $listen = socket_listen($sock, 100);
    28.         if (!$listen) {
    29.                 echo 'Ошибка: '.socket_strerror(socket_last_error());
    30.                 exit();
    31.         } else {
    32.                 echo 'ОК';
    33.         }
    34.  
    35.         while (true) {
    36.                 echo 'Ожидание подключения... ';
    37.                
    38.                 $client = socket_accept($sock);
    39.                 socket_close($client);
    40.                 if ($client === false) {
    41.                         echo 'Ошибка: '.socket_strerror(socket_last_error());
    42.                         usleep(100);
    43.                 } else {
    44.                         echo 'ОК'.PHP_EOL;
    45.                         echo 'Соединение с клиентом "'.$client.'" установлено';
    46.                 }
    47.  
    48.                 socket_close($client);
    49.         }
    50.  
    51.         socket_close($sock);
    52.  
    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, результаты array/object dump и т. д.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    и?
    ты вопрос не задал. =)
     
  3. prostodeniska

    prostodeniska Новичок

    С нами с:
    15 мар 2016
    Сообщения:
    5
    Симпатии:
    0
    Вопрос - почему нет вывода при включенном ob_implicit_flush в присутствие socket_accept, хотя без него все работает нормально и в более ранних версиях php проблем тоже не было. Это было бы не так страшно, но к сокету доступ тоже получить не удается.
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    вывода может не быть потому, что буфер есть не только у пхп, но и у веб-сервера как минимум. Или потому что в сокете нет данных.

    И не понятно, почему ты думаешь, что что-то не работает. Потому что нет вывода в браузер? А если в файл писать и через tail смотреть?
     
  5. prostodeniska

    prostodeniska Новичок

    С нами с:
    15 мар 2016
    Сообщения:
    5
    Симпатии:
    0
    Вывода нет только когда используется функция socket_accept. Если просто писать в сокет, то все ок. Нет, я же пишу, что доступа к сокету нет.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    права?
     
  7. prostodeniska

    prostodeniska Новичок

    С нами с:
    15 мар 2016
    Сообщения:
    5
    Симпатии:
    0
    Права проверял, полный доступ
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    в пути русские буквы может прячутся :D
     
  9. prostodeniska

    prostodeniska Новичок

    С нами с:
    15 мар 2016
    Сообщения:
    5
    Симпатии:
    0
    Не, путь предельно короткий и на латинице весь
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    я сдаюсь =(
     
  11. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Заново проделать все операции.
     
  12. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    немного непонятна эта последовательность