Ne v kontakte Antisocial programmer's blog

Железобетонные мьютексы в PHP

Железобетонные мьютексы в PHP

    dev     php     mutex     concurrency     articles

Я хочу рассказать об одном нестандартном применении механизма сессий в PHP. Вспомнилось мне это в связи с позавчерашним постом Тормоза на тему, что опять в Даосе проблема с параллельным доступом к файлам - функция блокировки дала очередной сбой. И хотя Тормоз в комментах уже писал, что обкатывает исправленный алгоритм, успешно выдерживающий стресс-тест, я все же поделюсь своим решением. Сразу оговорюсь, все нижеизложенное было проделано just for fun и имеет свои недостатки. Зато и работает практически безотказно.

Перейду к технической части. По умолчанию механизм сессий в PHP использует хранилище данных в файлах - каждая сессия лежит в своем файле. При этом, чтобы обеспечить целостность данных используется нехитрый подход эксклюзивной блокировки доступа к файлу. Иными словами, в момент, когда мы делаем session_start(), движок PHP захватывает файл с требуемой сессией и отпускает ее только в момент явного вызова session_write_close() или завершения скрипта. И если в то время, пока мы работаем с сессией в рамках одного запроса, произойдет еще один запрос, использующий ту же сессию, то он заблокируется на session_start() до тех пор, пока первый не освободит файл. Обычно разные клиенты работают в разных сессиях и проблемы не возникает, однако (немного огрубляю) у одного и того же клиента в один момент времени исполняется только один запрос.

Реально проблема встает, когда во время выполнения некоторого длительного запроса (стримминг потока или long polling) надо обеспечить клиенту возможность посылать и другие запросы (ходить по страничкам) и вовремя получать ответы. Решают задаю обычно одним из трех путей:

  1. Реализуют полностью свой механизм сессий.
  2. Переопределяют обработчики операций с данными сессии во встроенном механизме (с помощью session_set_save_handler(), этим вариантом я в свое время и воспользовался).
  3. Как можно раньше освобождают сессию с помощью session_write_close().

Read more →

Парочка хабрапостов.

    habr     articles     hosting     xampp     php

Хочу поделиться ссылками на пару моих статей на хабре, одна из которых была написана в апреле, потом неизвестно как попала в черновики и сегодня была возврращена на место. Вторая была написана вчера по мотивам возникшей у меня проблемы.

7 способов определить хостера сайта

Периодически перед многими из вебмастеров возникает задача определить хостера, у которого живет тот или иной сайт. Мотивация для этого бывает самая разная, как простое любопытство, так и желание поселиться по соседству на хорошем и стабильном хостинге или наоборот не вляпаться в такое соседство. В этом посте я приведу несколько известных мне методов с их достоинствами и недостатками.

  1. NS-сервера домена
  2. Страницы ошибок 403/404
  3. Виртуалхост по умолчанию
  4. Reverse DNS lookup
  5. Traceroute
  6. Whois
  7. Сигнатура SMTP сервера

Read more →

Rapid Template - быстрый и удобный шаблонизатор.

    projects     rapid template     soft     php

Незадолго до того, как началась повальная пиар акция CMS Zebrum Lite я начал писать собственную cms примерно с теми же целями - минимально требовательный и быстрый движок для сателлитов. После некоторых раздумий я решил, что раз уж я взялся писать cms с нуля, то надо и шаблонизатор свой написать, чтоб был быстрый и удобный. Ну а поскольку я ярый фанат phpBB и считаю их систему шаблонов одной из наиболее правильных, то свой шаблонизатор я сделал по образу и подобию его собрата из phpBB.

Основные особенности Rapid Template:

  • Небольшой размер движка (4.1 кб)
  • Быстрота
  • Простой синтаксис
  • Полная абстракция дизайна от кода

Rapid Template 1.0

Read more →