Все сервисы Хабра

Сообщество IT-специалистов

Ответы на любые вопросы об IT

Профессиональное развитие в IT

Удаленная работа для IT-специалистов

Войти на сайт
  • Все вопросы
  • Все теги
  • Пользователи

Хабр Q&A — вопросы и ответы для IT-специалистов

Получайте ответы на вопросы по любой теме из области IT от специалистов в этой теме.

Узнать больше
другие проекты хабра
  • Хабр
  • Карьера
  • Фриланс
Задать вопрос
akubintsev

Александр Кубинцев

Опытный backend разработчик
  • 121
    вклад
  • 9
    вопросов
  • 277
    ответов
  • 18%
    решений
Ответы
  • Информация
  • Ответы
  • Вопросы
  • Комментарии
  • Подписки
  • Нравится
  • Достижения
  • Хронограф/таймер обратного отсчета в вебе?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    Я думаю можно спокойно ограничиться серверным стеком centrifugo + php-fpm.
    При загрузке страницы происходит подключение к центрифуге и подписка на канал уведомлений о таймере.
    При операциях старт/стоп/пауза отсылается запрос на бекенд. Бекенд делает необходимую логику по фиксации и шлёт уведомление в центрифугу в канал уведомлений, чтобы клиенты отреагировали соответствующим образом.
    Ответ написан более года назад
    4 комментария
    4 комментария
  • Как реализовать счетчик "сейчас этот товар просматривают еще N человек"?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    Если решать проблему технически, то сперва надо определиться с частотой обновления или точностью. Что значит пользователь сейчас смотрит эту страницу? Активная вкладка браузера? А если он отвёл взгляд? )) И нужно ли действительно иметь такую высокую точность, какую бизнес-задачу это решает?
    На вскидку есть 3 способа:
    1) "дедовский": строить логи nginx таким образом, чтобы их удобно было парсить и брать число запросов на нужные страницы в интервал сканирования
    2) собирать статистику на уровне роутера приложения в redis (как предложили недавно выше)
    3) самый точный, но слишком накладный, это вебсокеты открывать на странице и считывать откуда они.
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Обновление php 5.4 до 7.1 (7-7.3) в Centos 7 Ngnix?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    Подключить репозиторий remi
    https://blog.remirepo.net/post/2016/02/14/Install-...
    Ответ написан более трёх лет назад
    5 комментариев
    5 комментариев
  • Fatal error: Uncaught PHPExcel_Reader_Exception: Could not open 1 for reading! File does not exist.?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    Тут явно ошибка
    $excel = copy($_FILES['upload_file']['tmp_name'],"uploads/".basename($_FILES['upload_file']['name']));

    Смотрите https://www.php.net/manual/ru/function.move-upload...
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Сделать выполнение PHP exec по очереди?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    Вы тем самым выстрелите себе в ногу, если это в рамках веб процессов.
    Но если нет, то делайте блокировку mutex и повторные обращения по таймауту у конкурирующих запросов к скрипту.
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как отправить картинку с одного сайта на другой и поместить на сервер,?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    https://www.php.net/manual/ru/function.move-upload...
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как контролировать жизнь php-консюмеров?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    И как решают это другие?

    У меня такое решение в голову приходит:
    Каждый консюмер периодически обязан подать признаки жизни - в некую таблицу БД записывать дату и время активности.
    И по крону, другой скрипт проверяет записи в таблице, если какой-то консюмер долго не обновлял запись - убить процесс по pid.


    В принципе, вам уже ответили. Хочу только добавить немного.
    Обратите внимание на systemd. В нём есть механизм проверки признаков жизни watchdog. Можно пингать самого себя тестовым сообщением, например. И рестартить по отказу.
    [Service]
    ...
    WatchdogSec=30s
    Restart=on-failure

    И конечно же прикрутить мониторинг, чтобы смотреть через Grafana или т.п.
    Ответ написан более трёх лет назад
    2 комментария
    2 комментария
  • Как правильно открыть порт для прослушивания через ReactPHP?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    Адрес 0.0.0.0:4321 пробовали?
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Почему зависает сайт при 30-40 одновременно выполняемых запросах?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    Из всего что я понял, получается у вас в callback-хендлере делается запрос через curl куда-то ещё (через proxy) и тем самым воркер из пула web-сервера держится до момента окончания выполнения запроса. Ваш сервачок быстро исчепает пул веб-воркеров, даже если вы увеличите их до 100 и хватит памяти. Конечно, это плохое решение.
    Да, в сущности нужно реализовывать систему очередей.
    Вам нужно как можно быстрее выполнять пришедний запрос-колбек и освобождать пул. Для этого нужно ограничить его работу тем, чтобы положить необходимые данные в какое-то хранилище или передать сообщением в менеджере очередей, делегировав работу по отправке другому пулу воркеров. Например 1-4 воркерам/демонам на ReactPHP или Node.js, которые будут брать пачку заданий и асинхронно рассылать запросы.
    Ответ написан более трёх лет назад
    12 комментариев
    12 комментариев
  • Не загружает данные из бд по $_GET запросу php последней версии?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    xdebug в помощь
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Есть класс (сервис) к которому надо передать провалидировнную конфигурацию. Как это лучше делать?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    Продублирую комментарий Евгений Добрянский: "Делай для сервиса класс с параметрами, а кто и как объект этого класса создаёт для сервиса не важно"

    Суть проблемы сводится к абстрагированию бизнес-логики от способа получения данных.
    Можно представить этот как адаптер, которым в одном случае выступает контроллер, получающий веб-форму. В другом - команда консольного приложения.
    Как бы там не было, не стоит забивать паттернами голову в данному случае, поскольку способов получения информации на вход бизнес-логики не будет много так или иначе. Ну что еще добавите? Метод API наружу?
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Очереди задач. Как лучше реализовать рассылку напоминаний о бронировании?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    Зачем использовать здесь Redis? На мой взгляд гораздо удобнее хранить очередь в СУБД в таком формате, чтобы было поле времени, после которого нужно отослать письмо.
    При этом с этой табличкой можно научить работать несколько инстансов крона в параллели, для чего конечно же потребуется хранить признак is_locked.
    И разумеется нужно написать отдельный крон на очистку таблички от старых отработанных заданий.
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • PHP проблема при заливке файлов размеров более 2GB?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    В nginx надо попробовать выключить буферизацию тела запроса
    fastcgi_request_buffering off
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Какой порядок обработки запросов в Go?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    Вопросы несколько странные. Похоже вас интересует не то, что вы спросили.
    По теме синхронизации горутин mutex в помощь https://gobyexample.com/mutexes
    Но вообще checkDb есть смысл запустить отдельной вечной горутиной на самом верхнем уровне и из неё писать в глобальную переменную lastChange, которую будет подхватывать http-хендлер, не блокируясь.
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Многопользовательское редактирование асинхронно, как можно реализовать?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    Надо разбить документ на атомарные сущности и блокировать их при редактировании, чтобы исключить конфликт (либо какую-то свою стратегию слияния реализовать). Например 1 предложение или абзац. Как уже верно подметили, для ускорения обратной связи можно задействовать вебсокет.
    Самое веселое будет дальше: объединять в каком-то буфере эти правки и дампить в хранилище по таймауту активности. В общем, без демона никак.
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как сделать простейший php прелоадер кеша для сайта?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    Переписывать - утопия.
    Оставлять как есть - нельзя.
    Не городите костыли. Возьмите лучше профайлер и узнайте из-за чего такие дикие тормоза. Потом оптимизируйте или закешируйте тяжелые запросы (скорее всего дело в них)
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как правильно вызвать нужный класс?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    Нужен вайт-лист $object_type, чтобы решить проблему безопасности.
    В принципе вы так и начали делать, только вариант через switch-case громоздкий.
    Гораздо лучше сделать маппинг вида
    $classMap = [
        'some_input_obj_type' => RealClassName::class,
        'another_input_obj_type' => RealAnotherClassName::class,
    ];


    А далее использовать конструкцию:
    if (!isset($classMap[$object_type])) {
        //какой-то код возвращающий ошибку
    }
    $class = $classMap[$object_type];
    $class::someMethod('some args1');
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Почему не работает Guzzle POST запрос на заполнение сторонней формы?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    Посмотрите в инструментах разработки какой улетает запрос на сервер.
    Первое на что обратил внимание это кодирование параметра query/body через urlencode.
    Далее пропробуйте прокинуть заголовки: referer и user-agent хотя бы.
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как безопасно загрузить изображение на сервер?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    Конечно, нужно проверять и mime type, и проверять картинки валидность хотя бы функцией getimagesize(), и делать resize(). Всё это можно при желании загуглить.
    Что обычно не пишут так это по поводу нагрузки на сервер при обработке картинки.
    Я рекомендую грузить картинки как есть (ограничивая только по размеру файла), при этом если картинки грузятся не одновременно, то можно еще и лок повесить. Далее обработать их уже отдельным процессом асинхронно (по крону например или каким-то менеджером очереди).
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Стоит ли новичку начинать с фреймворка или лучше учиться на чистом php?

    akubintsev
    Александр Кубинцев @akubintsev
    Опытный backend разработчик
    Изучать язык надо изучением языка. Если будете учить фреймворк, то и изучите преимущественно фреймворк.
    Имхо, большие фреймворки это шляпа. Лучше всего писать на микрофреймворке и компонентах из composer
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
Оценили как «Нравится»
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • Следующие →
Самые активные сегодня
  • Drno
    • 10 ответов
    • 0 вопросов
  • Rsa97
    Rsa97
    • 9 ответов
    • 0 вопросов
  • Pavel Merkushevich
    • 6 ответов
    • 0 вопросов
  • CityCat4
    CityCat4
    • 5 ответов
    • 0 вопросов
  • Leviofanh
    • 4 ответа
    • 1 вопрос
  • vabka
    Василий Банников
    • 5 ответов
    • 0 вопросов
  • © Habr
  • О сервисе
  • Правила
  • Обратная связь
  • Блог

Войдите на сайт

Чтобы задать вопрос и получить на него квалифицированный ответ.
Войти через центр авторизации