PHP session_start сериализует и блокирует все остальные, использующие один и тот же сеанс

сеанс должен быть синхронизирован. Когда 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?

… И много 😉

редактировать

  1. Причина, по которой он блокируется, заключается в том, что файл сеанса читается и может быть изменен в любой момент времени, когда выполняется первый скрипт, следовательно, блокировка.

  2. Средством для этого может быть session_write_close() как указано в этом сообщении

  3. Как предотвратить блокирование php-запросов, Konr Ness

Обработчик сеанса PHP по умолчанию предназначен для сериализации изменений сеанса для каждого идентификатора сеанса. Это обеспечивает гарантированное согласованное состояние сеанса в ваших сценариях.

Вы можете отказаться от этого преимущества, запустив session_write_close() сразу после session_start() . Это также делает сеанс только для чтения.

Кроме того, вы можете написать собственный обработчик сеанса без блокировки.