Отладка сессии в 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 дней гарантии