* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Framework\Session\Debug; use Framework\Debug\Collector; use Framework\Helpers\ArraySimple; use Framework\Session\SaveHandler; use Framework\Session\SaveHandlers\DatabaseHandler; use Framework\Session\SaveHandlers\FilesHandler; use Framework\Session\SaveHandlers\MemcachedHandler; use Framework\Session\SaveHandlers\RedisHandler; use Framework\Session\Session; /** * Class SessionCollector. * * @package session */ class SessionCollector extends Collector { protected Session $session; /** * @var array */ protected array $options = []; protected SaveHandler $saveHandler; public function setSession(Session $session) : static { $this->session = $session; return $this; } /** * @param array $options * * @return static */ public function setOptions(array $options) : static { $this->options = $options; return $this; } public function setSaveHandler(SaveHandler $handler) : static { $this->saveHandler = $handler; return $this; } public function getContents() : string { if (!isset($this->session)) { return '

No Session instance has been set on this collector.

'; } if (!$this->session->isActive()) { return '

Session is inactive.

'; } \ob_start(); ?>

Name:

Id: session->id() ?>

Data

renderData() ?>

Flash

renderFlash() ?>

Temp

renderTemp() ?>

Save Handler

renderSaveHandler() ?>

Cookie Params

renderCookieParams() ?>

Auto Regenerate Id

renderAutoRegenerateId(); return \ob_get_clean(); // @phpstan-ignore-line } protected function renderData() : string { $data = $this->session->getAll(); unset($data['$']); if (empty($data)) { return '

No data.

'; } \ksort($data); \ob_start(); ?> $value): ?>
Key Value Type
renderFlashOld(); $new = $this->renderFlashNew(); if ($old === '' && $new === '') { return '

No flash data.

'; } return $old . $new; } protected function renderFlashOld() : string { $data = ArraySimple::value('$[flash][old]', $this->session->getAll()); if (empty($data)) { return ''; } \ob_start(); ?>

Old

Flash data available in the current request.

$value): ?>
Key Value Type
session->getAll()); if (empty($data)) { return ''; } \ob_start(); ?>

New

Flash data available in the next request.

$value): ?>
Key Value Type
session->getAll()); if (empty($data)) { return '

No temp data.

'; } \ob_start(); ?> $value): ?>
Key Value Type TTL

Save Handler:

Serializer:

saveHandler)): ?> getSaveHandlerConfigs() as $key => $value): ?> renderSaveHandlerTableRows($key, $value) ?>
Class saveHandler::class ?>
$v): ?>
$v): ?>
Lifetime Path Domain Is Secure Is HTTP Only SameSite

Set-Cookie: options['set_cookie_permanent'] ? 'Permanent' : 'Normal' ?>

options['auto_regenerate_maxlifetime'] < 1) { return '

Auto regenerate id is inactive.

'; } $maxlifetime = (int) $this->options['auto_regenerate_maxlifetime']; $regeneratedAt = ArraySimple::value('$[regenerated_at]', $this->session->getAll()); $nextRegeneration = $regeneratedAt + $maxlifetime; \ob_start(); ?>
Maxlifetime Destroy Regenerated At Next Regeneration
options['auto_regenerate_destroy'] ? 'Yes' : 'No' ?>
*/ protected function getSaveHandlerConfigs() : array { $config = $this->saveHandler->getConfig(); if ($this->saveHandler instanceof FilesHandler) { return [ 'Directory' => $config['directory'], 'Prefix' => $config['prefix'], 'Match IP' => $config['match_ip'] ? 'Yes' : 'No', 'Match User-Agent' => $config['match_ua'] ? 'Yes' : 'No', ]; } if ($this->saveHandler instanceof MemcachedHandler) { $serverList = $this->saveHandler->getMemcached()?->getServerList(); $config['servers'] = $serverList ?: []; $servers = []; foreach ($config['servers'] as $server) { $servers[] = [ 'Host' => $server['host'], 'Port' => $server['port'] ?? 11211, ]; } return [ 'Servers' => $servers, 'Prefix' => $config['prefix'], 'Lock Attempts' => $config['lock_attempts'], 'Lock Sleep' => $config['lock_sleep'], 'Lock TTL' => $config['lock_ttl'], 'Maxlifetime' => $config['maxlifetime'] ?? \ini_get('session.gc_maxlifetime'), 'Match IP' => $config['match_ip'] ? 'Yes' : 'No', 'Match User-Agent' => $config['match_ua'] ? 'Yes' : 'No', ]; } if ($this->saveHandler instanceof RedisHandler) { $redis = $this->saveHandler->getRedis(); return [ 'Host' => $redis?->getHost() ?: $config['host'], 'Port' => $redis?->getPort() ?: $config['port'], 'Timeout' => $redis?->getTimeout() ?: $config['timeout'], 'Database' => $config['database'], 'Prefix' => $config['prefix'], 'Lock Attempts' => $config['lock_attempts'], 'Lock Sleep' => $config['lock_sleep'], 'Lock TTL' => $config['lock_ttl'], 'Maxlifetime' => $config['maxlifetime'] ?? \ini_get('session.gc_maxlifetime'), 'Match IP' => $config['match_ip'] ? 'Yes' : 'No', 'Match User-Agent' => $config['match_ua'] ? 'Yes' : 'No', ]; } if ($this->saveHandler instanceof DatabaseHandler) { $databaseConfig = $this->saveHandler->getDatabase()?->getConfig(); return [ 'Host' => $databaseConfig['host'] ?? '', 'Schema' => $databaseConfig['schema'] ?? '', 'Table' => $config['table'], 'Columns' => [ [ 'id' => $config['columns']['id'], 'data' => $config['columns']['data'], 'timestamp' => $config['columns']['timestamp'], 'ip' => $config['columns']['ip'], 'ua' => $config['columns']['ua'], 'user_id' => $config['columns']['user_id'], ], ], 'Maxlifetime' => $config['maxlifetime'] ?? \ini_get('session.gc_maxlifetime'), 'Match IP' => $config['match_ip'] ? 'Yes' : 'No', 'Match User-Agent' => $config['match_ua'] ? 'Yes' : 'No', 'Save IP' => $config['save_ip'] ? 'Yes' : 'No', 'Save User-Agent' => $config['save_ua'] ? 'Yes' : 'No', 'Save User Id' => $config['save_user_id'] ? 'Yes' : 'No', ]; } return []; } }