За последние 24 часа нас посетили 22660 программистов и 1015 роботов. Сейчас ищут 694 программиста ...

не работают команды для вебсокета.

Тема в разделе "PHP для новичков", создана пользователем Artur_hopf, 27 май 2020.

  1. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Добрый день, допустим взять стандартный код вебсокета workerman
    PHP:
    1. <?php
    2. use Workerman\Worker;
    3. require_once __DIR__ . '/vendor/autoload.php';
    4.  
    5. $ws_worker = new Worker('websocket://0.0.0.0:2346');
    6. $ws_worker->count = 4;
    7.  
    8. $ws_worker->onConnect = function ($connection) {
    9.     echo "New connection\n";
    10. };
    11.  
    12. $ws_worker->onMessage = function ($connection, $data) {
    13.     $connection->send('Hello ' . $data);
    14. };
    15.  
    16. $ws_worker->onClose = function ($connection) {
    17.     echo "Connection closed\n";
    18. };
    19.  
    20. Worker::runAll();
    И запустить его через консоль, все работает.
    Код (Text):
    1. php start.php start
    Но на эти манипуляции, он не реагирует, при любой команде будет запуск вебсокета.
    Код (Text):
    1. Start
    2. Run as debug mode
    3.  
    4. php start.php start
    5.  
    6. Run as daemon mode
    7.  
    8. php start.php start -d
    9.  
    10. Stop
    11. php start.php stop
    12.  
    13. Restart
    14. php start.php restart
    15.  
    16. Graceful restart
    17. php start.php reload
    18.  
    19. Status
    20. php start.php status
    Вот документация но там подробностей нет, просто команды:
    https://github.com/walkor/workerman-manual/blob/master/english/src/SUMMARY.md
    Подскажите почему так?
     
  2. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Итак, я начал ковырять в чем же дело.
    И выяснилось.
    Когда эта библиотека запущена под LINUX она может завершать запущенные процессы через php.
    То есть берется PID процесса, записывается в файлик. Потом во время выполнения команд он смотрит на этот PID в файлике, ищет его в процессах LINUX и манипулирует ими.

    Под WINDOWS видимо это не доступно и создатели отключили эту возможность.

    Пока я проделал следующие шаги, может кто поможет что можно дальше сделать.

    Сначала сделаем так, чтобы PID процесса записывался в файлик

    1. Открываем фаил Worker.php .
    2. Находим через поиск \posix_getpid() и заменяем везде его на функцию getmypid()

    https://www.php.net/manual/ru/function.getmypid.php


    3. Находим функцию protected static function saveMasterPid() и закомментируем там эти строки:
    PHP:
    1. // if (static::$_OS !== \OS_TYPE_LINUX) {
    2. //     return;
    3. // }
    4. Теперь запустим вебсокет например наш фаил называется start.php
    Код (Text):
    1. php start.php
    5. Рядом с нашим файлом должен создаться такой файлик start.php.pid . А внутри него должен быть записан PID.
    6. Проверим действительно ли PID совпадает с нашим запущенным процессом, наберем в консоле команду tasklist. Находим процесс php.exe и смотрим его PID . Если цифры в файлике и в консоле совпадают то все хорошо.

    Теперь осталось только каким то образом научится завершать процессы в windows по PID.

    Буду копать дальше.
     
    #2 Artur_hopf, 28 май 2020
    Последнее редактирование: 28 май 2020
  3. Satger

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

    С нами с:
    19 апр 2020
    Сообщения:
    72
    Симпатии:
    1
    Забудьте уже Windozze.