130 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Illuminate\Session;
 | |
| 
 | |
| use Illuminate\Filesystem\Filesystem;
 | |
| use Illuminate\Support\Carbon;
 | |
| use SessionHandlerInterface;
 | |
| use Symfony\Component\Finder\Finder;
 | |
| 
 | |
| class FileSessionHandler implements SessionHandlerInterface
 | |
| {
 | |
|     /**
 | |
|      * The filesystem instance.
 | |
|      *
 | |
|      * @var \Illuminate\Filesystem\Filesystem
 | |
|      */
 | |
|     protected $files;
 | |
| 
 | |
|     /**
 | |
|      * The path where sessions should be stored.
 | |
|      *
 | |
|      * @var string
 | |
|      */
 | |
|     protected $path;
 | |
| 
 | |
|     /**
 | |
|      * The number of minutes the session should be valid.
 | |
|      *
 | |
|      * @var int
 | |
|      */
 | |
|     protected $minutes;
 | |
| 
 | |
|     /**
 | |
|      * Create a new file driven handler instance.
 | |
|      *
 | |
|      * @param  \Illuminate\Filesystem\Filesystem  $files
 | |
|      * @param  string  $path
 | |
|      * @param  int  $minutes
 | |
|      * @return void
 | |
|      */
 | |
|     public function __construct(Filesystem $files, $path, $minutes)
 | |
|     {
 | |
|         $this->path = $path;
 | |
|         $this->files = $files;
 | |
|         $this->minutes = $minutes;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * {@inheritdoc}
 | |
|      *
 | |
|      * @return bool
 | |
|      */
 | |
|     public function open($savePath, $sessionName): bool
 | |
|     {
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * {@inheritdoc}
 | |
|      *
 | |
|      * @return bool
 | |
|      */
 | |
|     public function close(): bool
 | |
|     {
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * {@inheritdoc}
 | |
|      *
 | |
|      * @return string|false
 | |
|      */
 | |
|     public function read($sessionId): string|false
 | |
|     {
 | |
|         if ($this->files->isFile($path = $this->path.'/'.$sessionId) &&
 | |
|             $this->files->lastModified($path) >= Carbon::now()->subMinutes($this->minutes)->getTimestamp()) {
 | |
|             return $this->files->sharedGet($path);
 | |
|         }
 | |
| 
 | |
|         return '';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * {@inheritdoc}
 | |
|      *
 | |
|      * @return bool
 | |
|      */
 | |
|     public function write($sessionId, $data): bool
 | |
|     {
 | |
|         $this->files->put($this->path.'/'.$sessionId, $data, true);
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * {@inheritdoc}
 | |
|      *
 | |
|      * @return bool
 | |
|      */
 | |
|     public function destroy($sessionId): bool
 | |
|     {
 | |
|         $this->files->delete($this->path.'/'.$sessionId);
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * {@inheritdoc}
 | |
|      *
 | |
|      * @return int
 | |
|      */
 | |
|     public function gc($lifetime): int
 | |
|     {
 | |
|         $files = Finder::create()
 | |
|                     ->in($this->path)
 | |
|                     ->files()
 | |
|                     ->ignoreDotFiles(true)
 | |
|                     ->date('<= now - '.$lifetime.' seconds');
 | |
| 
 | |
|         $deletedSessions = 0;
 | |
| 
 | |
|         foreach ($files as $file) {
 | |
|             $this->files->delete($file->getRealPath());
 | |
|             $deletedSessions++;
 | |
|         }
 | |
| 
 | |
|         return $deletedSessions;
 | |
|     }
 | |
| }
 | 
