]> git.mxchange.org Git - friendica.git/blob - src/Factory/SessionFactory.php
Merge pull request #8033 from annando/contact-logging
[friendica.git] / src / Factory / SessionFactory.php
1 <?php
2
3 namespace Friendica\Factory;
4
5 use Friendica\App;
6 use Friendica\Core\Cache\Cache;
7 use Friendica\Core\Cache\ICache;
8 use Friendica\Core\Config\IConfiguration;
9 use Friendica\Core\Session;
10 use Friendica\Core\System;
11 use Friendica\Database\Database;
12 use Friendica\Util\Profiler;
13 use Psr\Log\LoggerInterface;
14
15 /**
16  * Factory for creating a valid Session for this run
17  */
18 class SessionFactory
19 {
20         /** @var string The plain, PHP internal session management */
21         const HANDLER_NATIVE = 'native';
22         /** @var string Using the database for session management */
23         const HANDLER_DATABASE = 'database';
24         /** @var string Using the cache for session management */
25         const HANDLER_CACHE = 'cache';
26
27         const HANDLER_DEFAULT = self::HANDLER_DATABASE;
28
29         /**
30          * @param App\Mode        $mode
31          * @param App\BaseURL     $baseURL
32          * @param IConfiguration  $config
33          * @param Cookie          $cookie
34          * @param Database        $dba
35          * @param ICache          $cache
36          * @param LoggerInterface $logger
37          * @param array           $server
38          *
39          * @return Session\ISession
40          */
41         public function createSession(App\Mode $mode, App\BaseURL $baseURL, IConfiguration $config, Database $dba, ICache $cache, LoggerInterface $logger, Profiler $profiler, array $server = [])
42         {
43                 $stamp1  = microtime(true);
44                 $session = null;
45
46                 try {
47                         if ($mode->isInstall() || $mode->isBackend()) {
48                                 $session = new Session\Memory();
49                         } else {
50                                 $session_handler = $config->get('system', 'session_handler', self::HANDLER_DEFAULT);
51                                 $handler = null;
52
53                                 switch ($session_handler) {
54                                         case self::HANDLER_DATABASE:
55                                                 $handler = new Session\Handler\Database($dba, $logger, $server);
56                                                 break;
57                                         case self::HANDLER_CACHE:
58                                                 // In case we're using the db as cache driver, use the native db session, not the cache
59                                                 if ($config->get('system', 'cache_driver') === Cache::TYPE_DATABASE) {
60                                                         $handler = new Session\Handler\Database($dba, $logger, $server);
61                                                 } else {
62                                                         $handler = new Session\Handler\Cache($cache, $logger, $server);
63                                                 }
64                                                 break;
65                                 }
66
67                                 $session = new Session\Native($baseURL, $handler);
68                         }
69                 } finally {
70                         $profiler->saveTimestamp($stamp1, 'parser', System::callstack());
71                         return $session;
72                 }
73         }
74 }