Yandex Metrika
sanches.free 1 просмотр

Отладка сессии в 1С-Битрикс: диагностический снимок

Когда такой снимок полезен

Симптомы «сессия слетела», «после F5 пропал заказ», «не совпадает гость и авторизованный покупатель» часто сводятся к тому, что между двумя подряд запросами изменился идентификатор PHP-сеанса, обрезались cookie или приложение переехало между доменами с разными параметрами session.cookie_domain. Быстрый способ локализовать причину — зафиксировать одинаковый набор полей дважды и увидеть дельту.

Идея скрипта

  • На каждом заходе скрипт сериализует в буфер метку времени, bitrix_sessid(), session_id(), дампы $_SESSION и $_COOKIE; при активном модуле sale дополнительно выводится анонимный идентификатор покупателя через API \Bitrix\Sale\Fuser::getId().
  • Содержимое прошлого запуска читается из текстового файла рядом со скриптом и показывается рядом с актуальным текстом.
  • После отрисовки текущая копия перезаписывает файл, чтобы следующий хит уже сравнивался с тем, что вы видели сейчас.

Важно: разместите файл только на закрытом поддомене или временно ограничьте доступ по IP, затем удалите код — полный дамп сеанса и cookie не должен торчать в открытый интернет.

Пример временной диагностической страницы

<?php
require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php";

$APPLICATION->SetTitle("Session diagnostics");

\Bitrix\Main\Loader::includeModule("sale");

$storagePath = __DIR__ . "/session_trace_prev.txt";
$cachedDump = "";
if (is_readable($storagePath)) {
    $cachedDump = (string) file_get_contents($storagePath);
}

ob_start();

echo "<br><strong>stamp</strong> = " . htmlspecialcharsbx(date(DATE_ATOM)) . "<br><br>";

if (\Bitrix\Main\Loader::includeModule("sale")) {
    $anonymousBuyerId = (string) \Bitrix\Sale\Fuser::getId();
    echo "<strong>anonymous_buyer</strong> = "
        . htmlspecialcharsbx($anonymousBuyerId) . "<br><br>";
}

echo "<strong>bitrix_sessid</strong> = "
    . htmlspecialcharsbx(bitrix_sessid()) . "<br><br>";
echo "<strong>php_session_id</strong> = "
    . htmlspecialcharsbx(session_id()) . "<br><br>";

echo "<strong>_SESSION</strong><br><pre style=\"white-space:pre-wrap\">";
var_export($_SESSION);
echo "</pre><br>";

echo "<strong>_COOKIE</strong><br><pre style=\"white-space:pre-wrap\">";
var_export($_COOKIE);
echo "</pre><br>";

$freshHtml = ob_get_clean();

echo "<table><tr><td style=\"vertical-align:top;width:50%;\">";
echo "<h3>Dump from previous hit</h3><pre style=\"white-space:pre-wrap\">";
echo $cachedDump !== "" ? $cachedDump : "(empty)";
echo "</pre></td><td style=\"vertical-align:top;width:50%;\">";
echo "<h3>Dump from current hit</h3><pre>" . $freshHtml . "</pre></td></tr></table>";

file_put_contents($storagePath, $freshHtml);

require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/footer.php";

Как читать результат

Если php_session_id меняется без явного сброса cookie в браузере, ищите прокси, склейку HTTP/HTTPS, разные базовые адреса в .settings.php или кастомные вызовы session_regenerate_id. Когда расходится только anonymous_buyer, проблему чаще ищут в настройках магазина (время жизни FUSER cookie, мультисайтовость).

Не забыть убрать

После фикса удалите файл веб-доступа и текстовый архив дампа из каталога веб-сервера, чтобы не оставить «рентген» для посторонних.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии