...Сессия - не "информационное облако", это всего-лишь интерфейс к файлу, ....
сам по себе php не лочится, просто когда 2й процесс (скрипт) делает системный запрос на открытие файла - система его подвешивает и ждет освобождения ресурса. ...
(c)grigori
Эх, век живи – век учись. Еще какой-нибудь месяц назад я находился в блаженном неведении, $_SESSION мне представлялась именно тем “информационным облаком”, о котором писал grigori. Иллюзия разрушена.
Но на месте краха тут же возникли 3 новые истины:
1. session_init() подвешивает скрипт и ждет, когда остальные скрипты с открытыми сессиями и с такими же идентификаторами будут завершены или закроют сессии;
2. всвязи с этим, нужно открывать и закрывать сессии только когда это на самом деле необходимо. Не правильно поступать по принципу “открыть вначале и забыть”. Простейший пример: клиент ajaxом периодически дергает скрипты и пусть они написаны по этому принципу. В этом случае все эти скрипты не смогут работать паралельно, т.к. session_init() будет выступать в роли мьютекса. То есть, мало того, что производительность резко упадет (асинхронность отпадает сразу), есть вероятность “подвисания” всей этой системы, если какой-нибудь скрипт будет выполняться слишком долго.
3. session_set_save_handler – не выход, как это может показаться на самый первый взгляд. Действительно, можно сделать свой обработчик сессий так, чтобы session_init не “весила” все паралельно работающие скрипты. Но давайте вернемся к примеру из п2. Пусть есть один longplay скрипт, и за время его работы паралельно выполнились другие скрипты. В этом случае “callback $close” ? этого скрипта затрет все изменения $_SESSION, которые были сделаны другими скриптами пока он работал.
Таким образом, сессии в php носят “транзакционный” характер: session_init() = BEGIN TRANSACTION, session_write_close() = COMMIT, session_init() – мьютекс для всех скриптов с одним и тем же SESSID.
Tags: php, мьютекс, сессии, транзакции