#php #session #tabs
#php #сессия #вкладки
Вопрос:
Я столкнулся с небольшой ошибкой с PHP $ _SESSION. Когда я открываю 12 вкладок одновременно в браузере chromium 85 на моем Ubuntu 20.04, Apache 2.4.41, PHP 7.4.3 local dev server, я заметил, что PHP $ _SESSION не всегда увеличивает мою переменную tabid, которую я использую, чтобы присвоить каждой из моих вкладок собственный идентификатор. Допустим, у меня есть страница follow:
session_start();
if (! isset($_SESSION['tabid'])) $_SESSION['tabid'] = 0;
$_SESSION['tabid'];
define('TABID', $_SESSION['tabid']);
echo TABID;
Когда я открою это на 12 вкладках, я получу что-то вроде: 1, 1, 2, 3, 2, 3, 4, 3, 5, 6, 7, 8 на каждой соответствующей странице.
Ожидаемый результат на моих 12 вкладках будет: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11, 12
Я перепробовал множество способов отладки, даже пытаясь увеличить сеанс, делая это:
$_SESSION['tabid'] = ($_SESSION['tabid'] *2) 2;
$_SESSION['tabid']= $_SESSION['tabid']/2;
Просто чтобы посмотреть, не регистрировала ли сессия простое изменение приращения, но, похоже, это не имело длительного эффекта. Я даже протестировал ошибку, добавив uniqid() к своим выводам, чтобы убедиться, что это была проблема с $ _SESSION. Поэтому меняем последнюю строку на:
echo TABID."-".uniqid();
все равно выводило бы что-то вроде:
1-5f5bb8d8a70fa, 1-5f5bb8d8a70fe, 2-5f5bb8d8a70ff, 3-5f5bb8d8a7100, 2-5f5bb8d8a7101, 3-5f5bb8d8a7102, 4-5f5bb8d8a7103, 5-5f5bb8d8a7104, 6-5f5bb8d8a7105, 7-5f5bb8d8a7106, 6-5f5bb8d8a7107, 7-5f5bb8d8a7108
Что по-прежнему является неправильным / неожиданным поведением.
В то же время я, вероятно, буду использовать uniqid в качестве идентификаторов вкладок, но по нескольким причинам я бы предпочел, чтобы мои идентификаторы вкладок были намного короче.
Это мои настройки сеанса (они по умолчанию поставляются с моей установкой):
Session Support enabled
Registered save handlers files user
Registered serializer handlers php_serialize php php_binary
Directive Local Value Master Value
session.auto_start Off Off
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_httponly no value no value
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_samesite no value no value
session.cookie_secure 0 0
session.gc_divisor 1000 1000
session.gc_maxlifetime 1440 1440
session.gc_probability 0 0
session.lazy_write On On
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path /var/lib/php/sessions /var/lib/php/sessions
session.serialize_handler php php
session.sid_bits_per_character 5 5
session.sid_length 26 26
session.upload_progress.cleanup On On
session.upload_progress.enabled On On
session.upload_progress.freq 1% 1%
session.upload_progress.min_freq 1 1
session.upload_progress.name PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix upload_progress_ upload_progress_
session.use_cookies 1 1
session.use_only_cookies 1 1
session.use_strict_mode 0 0
session.use_trans_sid 0 0
Если кто-нибудь знает, почему это происходит, или если вы знаете, связано ли это с какой-то настройкой, я хотел бы знать. Спасибо.
Комментарии:
1. чисто из любопытства, почему вы хотите подсчитать количество вкладок?
2. Вы можете проверить это более четко, добавив режим ожидания (10). По сути, это условие гонки, когда php считывает файл сеанса и записывает обратно в него, когда выполнение скрипта завершается. Если пять php запущены одновременно (до завершения любого из них), то все они считывают «1» и записывают «2».