Переменная PHP $ _SESSION не всегда увеличивается при вызове в быстрой последовательности

#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».