сеанс должен быть синхронизирован. Когда A
записывает / сохраняет session
B
или another A
ставится на ожидание. Это необходимо для обработки сеансов на основе файлов.
Но как только A
загрузил сессию (но теперь сохранил ее модификации) B
также должно быть разрешено загрузить один и тот же сеанс. потому что загрузка откроет файл и приведет содержимое файла в память и закроется.
Есть ли причина блокировать все остальные скрипты в течение всего времени A
Загружает сеанс и A
сохраняет сеанс. не может ли синхронизация выполняться только с помощью обработчика сохранения?
Таким образом, два скрипта PHP никогда не могут работать одновременно. Если они используют один и тот же сеанс.
например seslock.php
<?php header('Content-Type: text/plain'); session_start(); if(isset($_GET['wait'])){ sleep(30); echo "waiting\n"; }else{ echo "No Waiting\n"; } ?> done
visit seslock.php
ответит немедленно, но seslock.php?wait
займет 30 секунд, чтобы ответить. Но проблема в том, что вы запросите seslock.php?wait
и только seslock.php
второй. событие, которое блок non-sleep
попросит вас подождать 30 секунд.
Почему этот блок не является моим вопросом. Я спрашиваю, почему он блокирует start to save
? вместо блокировки only save
?
Возможные дубликаты:
Как блокировка session_start в PHP?
Почему session_start вызывает таймаут, когда один скрипт вызывает другой скрипт с использованием curl
session_start зависает
Как убить сессию PHP?
… И много 😉
редактировать
Причина, по которой он блокируется, заключается в том, что файл сеанса читается и может быть изменен в любой момент времени, когда выполняется первый скрипт, следовательно, блокировка.
Средством для этого может быть session_write_close()
как указано в этом сообщении
Как предотвратить блокирование php-запросов, Konr Ness
Обработчик сеанса PHP по умолчанию предназначен для сериализации изменений сеанса для каждого идентификатора сеанса. Это обеспечивает гарантированное согласованное состояние сеанса в ваших сценариях.
Вы можете отказаться от этого преимущества, запустив session_write_close()
сразу после session_start()
. Это также делает сеанс только для чтения.
Кроме того, вы можете написать собственный обработчик сеанса без блокировки.