• Как отдельным потоком постоянно отправлять сообщения в WebSocket клиенту?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Вот такой вариант:
    const WebSocket = require('ws')
    
    const wsServer = new WebSocket.Server({ port: 9000 })
    wsServer.on('connection', (wsClient) => {
        wsClient.on('error', console.error);
        console.log('Новый пользователь');
        wsClient.on('message', function (message) {
            console.log('Сообщение от пользователя:', message);
            wsClient.send('Данные получены...')
            wsClient._timer = setInterval(() => some_function(wsClient), 1000);
    
        })
        wsClient.on('close', function () {
            clearInterval(wsClient._timer);
            console.log('Пользователь отключился');
        })
    })
    
    function some_function(wsClient) {
        wsClient.send('Сообщение каждый вызов')
    }

    При каждом полученном сообщение - создается таймер который с заложенным интервалом (1000мс = 1 сек) выполняет функцию
    Ответ написан
    5 комментариев
  • Как исключить вложенную папку из игнора?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Не добавляется так как есть выше стоящее правило = * , которое уже игнорирует "всё"
    Если очень нужно добавить git add foldername -f с флагом -f = принудительно добавить
    Ответ написан
    3 комментария
  • В чем может быть проблема у простого php-роутера?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    ИМХО.
    Регулярка - это не магическая кнопка, которая по нажатию выдает результат. Регулярные выражения - это правила для множественных операций в отношении данных. И чем регулярка более комплексна и насыщена, тем больше будет итераций обработки входных данных.
    Пример:
    ОЧЕНЬ НЕ ОПТИМАЛЬНЫЙ - просто как концепция
    www.site.ru/catalog/subcatalog/file.html?key=value&key2=value2
    Если использовать explode, то сперва разбиваем по / - получаем
    • www.site.ru
    • catalog
    • subcatalog
    • file.html?key=value&key2=value2

    Далее для "последнего" элемента применяем еще один explode по ?
    • www.site.ru
    • catalog
    • subcatalog
      • file.html
      • key=value&key2=value2



    Далее для "последнего" элемента применяем еще один explode по & - что бы обработать возможное множество переданных GET-параметров
    • www.site.ru
    • catalog
    • subcatalog
      • file.html
        • key=value
        • key2=value2




    И теперь для всего множества GET-параметров, explode по =
    • www.site.ru
    • catalog
    • subcatalog
      • file.html
          • key
          • value

          • key2
          • value2







    И на весь этот ужас мы потратим: 3 explode + (explode * на кол-во GET-параметров) и при этом можем вложить проверки на необходимость выполнения следующих шагов не только по содержимому данных, но и по вхождению в "базе роутов" = если мы понимаем что catalog не существует => зачем пытаться разбирать дальше, если и так уже ни чего не найдем и можно сразу бросать Exception для перехода на 404.

    А вот итерационные операции регулярного выражения могут (с большей вероятностью) иметь больше операций.

    Вывод:
    Чем сложнее регулярка тем "дороже" ее исполнение.
    И как вы верно сделали утверждение, роутер это основа которая должна работать быстро. А вы можете потратить много CPU ресурсов на разбор регуляркой - что бы потом выяснить что искомого роута просто нет.
    Ответ написан
  • Как обеспечить возможность одновременного вызова эндпойнта, пишущего в БД?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Решение нужно искать не в последовательном исполнении, а понять что вы делаете с БД что два идентичных обращения вызывают дедлок.
    Например: если вы делаете апдейт одной и той же строки - то вопрос а может ли прийти 10 таких запросов на одну строку?
    Ответ написан
    2 комментария
  • Как добавить сайт в nginx с помощью node js?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Можно попробовать NGINX Unit.
    У него есть REST-api через который можно динамически создавать location.
    Ну а в части создания папок и копирования файлов в nodejs дач этого есть возможность выполнять операции с файловой системой и/или выполнять консольные команды
    Ответ написан
  • Как реализовать передачу данных на два разных порта?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    nginx.org/en/docs/http/ngx_http_mirror_module.html
    Создается дубликат запроса - но нужно учитывать, что клиенту вернется только ответ основного потока, ответ дубликата отправиться в /dev/null
    Ответ написан
    Комментировать
  • Unity не видит disconnect от сервера, если его вызывает другой Unity, есть идеи?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Согласно документации
    // sending to all clients except sender
      socket.broadcast.emit('broadcast', 'hello friends!');

    // sending to all connected clients
      io.emit('an event sent to all connected clients');


    Попробуйте использовать io.emit для отправки уведомления об отключении пользователя
    socket.on('disconnect', function() {
        console.log('Player is disconnected');
        io.emit('rdisconnected', player);
        delete players[player.id];
        delete sockets[player.id];
      });
    Ответ написан
  • Сколько памяти расходует скрипт PHP?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Попробуйте упростить работу РНР, сделайте преобразование XML в иерархический массив.
    Накладные расходы на хранение будут в разы меньше.
    Еще меньше если не будете использовать иерархию, а сформируете хеш-массив всех элементов.
    xml-структура в путь, далее в хеш
    a->b->c = hash(abc) = 01f
    $a['01f'] = $value

    Реализовать класс для работы с таким массивом, что бы можно было обращаться по "пути xml".
    Может показаться излишеством, но памяти будет есть меньше чем работа с simpleXml или DOM - у них много накладных расходов
    Ответ написан
  • Почему отваливаются вебсокеты workerman с приложением на ionic. Кто виноват клиент или сервер?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Сталкивался с таким поведением и на iOS.
    Ваше решение с пингом верно в данном случае. Можно дополнить двунаправленным. По сути отмечать на стороне сервера когда была последняя активность клиента (ведь если клиент постоянно шлет ПИНГ, то активность должна быть), если клиент пропустил 2-3 тайма для пинга - отрубать сокет (тут можно нежно: послать пинг от сервера и если нет ответа рубить; или жестко: сразу рубить)
    Так что поле для фантазий.)
    ЗЫ. когда вы включите мобильную связь и пойдете по улице у вас еще IP меняться начнет и так же разрывы сокет-соединения будут.
    Ответ написан
  • Что делать если деньги по договору перевели, а самого договора так и нет?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Есть договор, в договоре указано, что Заказчик производит предоплату.
    Есть деньги, но договора - нет. => деньги не относятся к договору.
    Когда появится договор (подписанный), с даты его подписания он начнет действовать. Заказчик должен произвести предоплату, тогда высланные деньги станут относиться к договору (если Вы так решите).
    Сейчас ваши взаимоотношения имеют уровень устного договора, который очень трудно доказывать с каждой из сторон: о сроках, условиях, суммах и т.п.
    Вообще: сообщите Заказчику, что его предоплата не имеет смысла и Вы готовы ее вернуть. Ждете\требуется подписания договора, что бы ваши взаимоотношения имели юридический характер. И только после получения подписанного с двух сторон договора, ваши взаимоотношения имеют место быть.
    Ваши сомнения обоснованы - ни кто просто так деньги не дает => Вас хотят "поиметь"
    Ответ написан
    Комментировать
  • Как удалить последний тег с содержимом через регулярк?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Если правильно понял проблему, то вот - /(.*)?(\<p.*?\>(.*?)\<\/p\>)$/
    Ответ написан
  • Как перечитать JSON-файл процессов PM2 без пересоздания?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Простите за прямоту.
    А что мешает разбить этот файл на 3 блока и запустить те что нужно, останавливать или перезагружать те что нужно, добавлять или удалять - то что нужно.
    Да, вам придется много раз обращаться к pm2 что бы тот запустил каждый сервер - но зато вы получите нужную вам гибкость.

    Ну или почитать документацию: (pm2.keymetrics.io/docs/usage/application-declarati...
    Act on a specific process
    You can also act on a particular application by using its name and the option --only :
    pm2 start ecosystem.config.js --only api-app
    pm2 restart ecosystem.config.js --only api-app
    pm2 reload ecosystem.config.js --only api-app
    pm2 delete ecosystem.config.js --only api-app
    Ответ написан
    1 комментарий
  • Есть ли такие фреймворки?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Ответ написан
    Комментировать
  • Каким образом происходит кеширование сайта без CMS?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Если вы обновили файл на сервере, но видите еще старый, а нвоый только после CTRL+F5 = скорее всего это делает Веб-сервер (nginx или apache) он "внутри себя" кеширует часто запрашиваемые данные для увеличения скорости ответа.
    Решения (если для вас это проблема):
    - перезагрузить веб-сервер = !не сам сервер, а только "программу" (nginx или apache), конечно если у вас есть такая возможность
    - если это связано со стилями (css) скриптами (js) или картинками - то приписывайте после имени файла "версию" = /css/main.css?20150822 - тем самым браузер по сути будет запрашивать у веб-сервера новый файл
    Ответ написан
    Комментировать
  • Как лучше сохранить данные?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Исходя из задачи:
    Вы храните KEY - VALUE. Нам заренее не изветен ни KEY (тип и формат данных - строка или число) ни VALUE (его размер)
    1) так как запрос на "чтение\запись" будет идти по ключу - высчитываем хеш ключа (sha256), берем несколько "октет" (у меня они так в голове называются) от хеша и дописываем\создаем файл с таким именем (это будет наш индекс ключей)
    2) пишем VALUE в преобразованном формате (base64 или еще как) в файл данных в строку соотвествующую следующему индексу
    Получается следующий фарш:
    --------------
    Создание записи:
    Принмаем что БД пуста.
    KEY = test
    VALUE = datastring
    HASH = sha256(KEY) = 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
    OCTET = HASH[1-6] = 9f86d0 (три пары)
    файл индекса = [OCTET].map (mapper)
    файл последовательности записи = [OCTET].pnt (pointer)
    файл данных = [OCTET].dat (data)
    Читаем:
    PNT (последовательный указатель - номер строки в файле данных) = read([OCTET].pnt)+1 = 1
    Пишем:
    [OCTET].map =>
    9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 = [PNT]
    [OCTET].pnt = [PNT]
    [OCTET].dat[PNT] = VALUE (предварительно преобразовываем - base64 или иное) = Пишем в строку равную PNT в файл [OCTET].dat - это сразу дает и запись и обновление данных
    --------------
    Чтение записи:
    KEY = test
    HASH = sha256(KEY) = 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
    OCTET = HASH[1-6] = 9f86d0 (три пары)
    файл индекса = [OCTET].map (mapper)
    файл данных = [OCTET].dat (data)
    Читаем файл [OCTET].map и ищем HASH = получаем указатель строки в файле данных = PNT
    Читаем файл [OCTET].dat[PNT] (читаем строку PNT) = VALUE (преобразовываем в исходный формат)

    =============
    Думаю, если даже моя идея бред - то по крайней мере даст вам почву для размышления.

    PS\ как более оптимальный вариант - хранить каждый блок данных в отдельном файле с именем = хешу от ключа.
    Ответ написан
    2 комментария
  • Как настроить редирект на nginx?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Как написал Mysterion + если основной домен на первом сервере - то субдомены можно вычленить регуляркой
    Ответ написан
    Комментировать
  • Как изменить расположение файлов баз данных в MySQL 8.0?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Файл my.cnf
    datadir=/data/mysql - пишите путь куда вам надо
    Ответ написан
    Комментировать
  • Как обеспечить синхронизацию файлов между VPS (не используя cdn)?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Самое простое rsync - s1->s2 и s2->s1 по крону раз в минуту
    Это быстро и дешево и с кучей моментов: время синхронизации раз в минуту, использование места на обоих серверах.
    А лучше (с учетом на будущее) читайте OnYourLips
    Ответ написан
    Комментировать
  • Хотите задать вопрос администрации Тостера?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Хочется видеть автоматическое (системой) принятие лучшего ответа как верного.
    То есть, если задающий не указал ответ как лучший, система сама через х-времени ставила тому ответу который набрал больше "Нравится".
    А может оно так и есть - просто не замечал.
    Ответ написан