• Как правильно запускать долгий php-скрипт?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вообще более-менее правильный подход:

    - пользователь отправляет запрос на сервер
    - сервер добавляет задачу в очередь
    - обработчик-демон берет задачу и делает ее

    По поводу отслеживания прогресса все чуть интереснее. Есть как минимум 4 варианта реализации:
    - пулинг - когда периодически мы шлем ajax запрос на сервер и спрашиваем сколько там сделано
    - лонг-пулинг - оптимизация первого варианта, при которой запрос не сразу отваливается, а отваливается либо по таймауту (скажем прошло 10 секунд) или же изменилось состояние и нам нужно об этом уведомить пользователя. Как только соединение отвалилось мы обрабатываем что там нам пришло или не пришло и повторяем запрос. Профит - реалтайм нотификация, то есть как-только у нас появилась свежая информация мы можем ее получить.
    - Server-sent events, когда запрос отдается нам по кускам с разделителями. Каждый кусок отдается тогда, когда что-то на сервере поменялось. Профит тот же что и в варианте с лонг полингом только не надо разрывать соединение. Но есть куча нюансов (скажем с Apache это не прокатит) и мало кто так делает.
    - web sockets - реалтайм, полнодуплексный, удобный вариант, но нужно заводить отдельный демон.

    Самый простой вариант - простой пулинг, в вашем случае реалтайм вам не нужен, достаточно раз в 10 секунд спрашивать сервер что там как. В этом случае обработчик очереди (или дочерний процесс или еще кто) может записывать в кэш текущий статус джобы, и вы можете получать ее по идентификатору. в качестве хранилища можно использовать redis или memcache, в этом плане они идеальны.
    Ответ написан
    5 комментариев
  • На каком языке(фреймворке) лучше писать бекэнд для сервиса бронирования?

    voidnugget
    @voidnugget
    Программист-прагматик
    Сейчас требования на рынке возросли в 3-4 раза по сравнению с тем что было 2-3 года назад. PUSH-нотификации по вэбсокетам (или comet'у) и в мобильные приложения требуют асинхронности и в случае с PHP / Python / Ruby реализовуются довольно костыльно - прикручивают очереди Celery / Beanstalkd / Gearmand / RabbitMQ. В итоге умирает вертикальное масштабирование решения в рамках одного сервера из-за накладных расходов на коммуникацию. Микросервисную архитектуру стоит внедрять в рамках нескольких машин, и профилировать накладные расходы на коммуникацию.

    Также существует очень много проблем с PHP / Python / Ruby / Node.js c долгосрочной поддержкой - слишком часто отваливается обратная совместимость у существующих библиотек и зависимостей. Часто меняется API самой платформы.

    Из фреймворков сейчас веселее всего с Play2 / Xitrum / Grails.
    У них есть свои недостатки, но они будут шустрее всего остального в десятки,а в случае с рельсами - в сотни, раз.

    С Node.js куча проблем.

    Опять же там много заморочек с архитектурой - нужно внедрять SOA и CQRS-ES для реактивностей, и это уже не банальное MVC к которому все так привыкли. Подобный подход просто требует TDD/BDD и приёмочных тестов для фронтенда.
    Ответ написан
    4 комментария
  • Как организовать рассылку так, чтобы не забанили

    alexxxst
    @alexxxst
    Периодически отправляю рассылки со своего сервера на 20-30 тысяч пользователей.
    В конце письма обязательная ссылка на отписку от рассылки, заголовок List-Unsubscribe в заголовках письма, хорошо настроенные SPF и PTR-записи для домена/IP. За несколько лет ни разу не побывал ни в одном черном списке, на наши местные серваки почтовые (mail.ru, yandex.ru и пр.) почта разлетается со скоростью света.
    Еще из советов: кодировать русские буквы в заголовках письма в base64 с кодировкой.

    P.S. и, никакого спама! :)
    Ответ написан
    2 комментария