Locker.php
См. документацию.
1 <?php
2 
3 /**
4  * @file
5  * @brief блокировка файлов
6  *
7  */
8 
9 namespace Wrong\File;
10 
11 
12 /**
13  * @brief Locker блокировщик файлов
14  *
15  * отвечает за блокировку файлов для крон задач, может использоваться при необходимости любых иных блокировок потоков и их ограничения
16  * usage example:
17  *
18  * if (Locker::lock(basename(__FILE__, '.php'))) {
19  * Locker::unlock(basename(__FILE__, '.php'));
20  * }
21  *
22  */
23 
24 class Locker
25 {
26  /** путь к каталогу, в котором будут храниться файлы блокировки. */
27  const LOCK_PATH = __DIR__ . '/../../../temp';
28 
29  /** префикс файла блокировки. */
30  const LOCK_PREFIX = 'lock';
31 
32  /** время блокировки в секундах */
33  const CLEAN_TIME = 3600;
34 
35  /** Переменная класса, используется для хранения пути к файлу блокировки. */
36  private static $path;
37 
38  /** Используется, чтобы определить, заблокировал ли текущий процесс файл. */
39  private static $lock = false;
40 
41  /**
42  * создает файл с именем блокировки и записывает текущее время плюс максимальное время, в
43  * течение которого блокировка должна удерживаться в файле.
44  *
45  * Если файл уже существует, проверяет, истек ли срок действия блокировки, и если да, то удаляет
46  * файл и возвращает значение true.
47  *
48  * Если срок действия блокировки не истек, возвращается false.
49  *
50  * Если файл не существует, создает файл и возвращает true
51  *
52  * @param int $id Имя файла блокировки.
53  * @param int $max_time Максимальное время удержания блокировки в секундах.
54  */
55  public static function lock($id, $max_time = self::CLEAN_TIME)
56  {
57  self::setPath($id);
58  if (file_exists(self::$path) && self::cleaner()) {
59  return false;
60  }
61  $file = new \SplFileObject(self::$path, 'a+b');
62  $file->flock(LOCK_EX);
63  $file->rewind();
64  $time = $file->fgets();
65  $file->ftruncate(0);
66  $file->fwrite(time() + $max_time);
67  if (!$time) {
68  touch(self::$path, time() + $max_time);
69  $file->flock(LOCK_UN);
70  self::$lock = true;
71  return true; // блокировка получена
72  }
73  $file->flock(LOCK_UN);
74  return false; // блокировка не получена
75  }
76 
77 
78  /**
79  * создает каталог, если он не существует, а затем устанавливает в self::$path имя файла блокировки
80  *
81  * @param Уникальный идентификатор блокировки, который используется для создания имени файла
82  * блокировки.
83  */
84  private static function setPath($id)
85  {
86  try {
87  file_exists(self::LOCK_PATH) or mkdir(self::LOCK_PATH, 0755);
88  if (!file_exists(self::LOCK_PATH)) {
89  throw new \Error('Path does not create');
90  }
91  } catch (\Throwable $th) {
92  exit($th);
93  }
94  self::$path = self::LOCK_PATH . '/' . self::LOCK_PREFIX . '-' . $id . '.lock';
95  file_exists(self::$path) && clearstatcache(true, self::$path);
96  }
97 
98  /**
99  * Удаляет файл блокировки
100  *
101  * @param int $id Имя файла блокировки.
102  * @param bool $forse истинное означает что блокировка будет снята, даже если она не была создана текущим процессом.
103  */
104  public static function unlock($id, $forse = false)
105  {
106  self::setPath($id);
107  if (file_exists(self::$path) && (self::$lock || $forse)) {
108  unlink(self::$path);
109  return true;
110  }
111  return false;
112  }
113 
114  /**
115  * удаляет любые файлы блокировки, которые старше текущего времени.
116  *
117  * @return bool Логическое значение, истинное означает что текущий файл блокировки по прежнему существует.
118  */
119  private static function cleaner()
120  {
121  foreach (glob(self::LOCK_PATH . '/' . self::LOCK_PREFIX . '-*.lock') as $path) {
122  if (filemtime($path) < time() && intval(file_get_contents($path)) < time()) {
123  unlink($path);
124  }
125  }
126  return file_exists(self::$path);
127  }
128 }
if($_POST['code']==file_get_contents($_SERVER['DOCUMENT_ROOT'] . $row->file)) $file
Definition: edit-code.php:30
Locker блокировщик файлов
Definition: Locker.php:25
const LOCK_PATH
Definition: Locker.php:27
static $path
Definition: Locker.php:36
static unlock($id, $forse=false)
Definition: Locker.php:104
const CLEAN_TIME
Definition: Locker.php:33
static $lock
Definition: Locker.php:39
static setPath($id)
Definition: Locker.php:84
const LOCK_PREFIX
Definition: Locker.php:30
static cleaner()
Definition: Locker.php:119
static lock($id, $max_time=self::CLEAN_TIME)
Definition: Locker.php:55
setcookie('FROM_UID', $uid, [ 'expires'=> time()+31536000, 'path'=> '/', 'domain'=> $_SERVER['HTTP_HOST'], 'secure'=> Wrong\Start\Env::$e->IS_SECURE, 'httponly'=> false, 'samesite'=> Wrong\Start\Env::$e->IS_SECURE ? 'None' :'Lax']) or setcookie('FROM_UID' time()+31536000
Definition: from-user.php:36
if(($dbh=Connect::getInstance(true) ->dbh) && $dbh->query("SHOW TABLES") ->fetchAll() && $dbh->query("SELECT COUNT(*) FROM `users`") ->fetchColumn()) if(!empty($_POST)) exit
Definition: install.php:198