Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

LockHandler.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 3.24 KiB


 001  <?php
 002   
 003  /*
 004   * This file is part of the Symfony package.
 005   *
 006   * (c) Fabien Potencier <fabien@symfony.com>
 007   *
 008   * For the full copyright and license information, please view the LICENSE
 009   * file that was distributed with this source code.
 010   */
 011   
 012  namespace Symfony\Component\Filesystem;
 013   
 014  use Symfony\Component\Filesystem\Exception\IOException;
 015   
 016  /**
 017   * LockHandler class provides a simple abstraction to lock anything by means of
 018   * a file lock.
 019   *
 020   * A locked file is created based on the lock name when calling lock(). Other
 021   * lock handlers will not be able to lock the same name until it is released
 022   * (explicitly by calling release() or implicitly when the instance holding the
 023   * lock is destroyed).
 024   *
 025   * @author Grégoire Pineau <lyrixx@lyrixx.info>
 026   * @author Romain Neutron <imprec@gmail.com>
 027   * @author Nicolas Grekas <p@tchwork.com>
 028   */
 029  class LockHandler
 030  {
 031      private $file;
 032      private $handle;
 033   
 034      /**
 035       * @param string      $name     The lock name
 036       * @param string|null $lockPath The directory to store the lock. Default values will use temporary directory
 037       *
 038       * @throws IOException If the lock directory could not be created or is not writable
 039       */
 040      public function __construct($name, $lockPath = null)
 041      {
 042          $lockPath = $lockPath ?: sys_get_temp_dir();
 043   
 044          if (!is_dir($lockPath)) {
 045              $fs = new Filesystem();
 046              $fs->mkdir($lockPath);
 047          }
 048   
 049          if (!is_writable($lockPath)) {
 050              throw new IOException(sprintf('The directory "%s" is not writable.', $lockPath), 0, null, $lockPath);
 051          }
 052   
 053          $this->file = sprintf('%s/sf.%s.%s.lock', $lockPath, preg_replace('/[^a-z0-9\._-]+/i', '-', $name), hash('sha256', $name));
 054      }
 055   
 056      /**
 057       * Lock the resource.
 058       *
 059       * @param bool $blocking wait until the lock is released
 060       *
 061       * @return bool Returns true if the lock was acquired, false otherwise
 062       *
 063       * @throws IOException If the lock file could not be created or opened
 064       */
 065      public function lock($blocking = false)
 066      {
 067          if ($this->handle) {
 068              return true;
 069          }
 070   
 071          // Silence error reporting
 072          set_error_handler(function () {});
 073   
 074          if (!$this->handle = fopen($this->file, 'r')) {
 075              if ($this->handle = fopen($this->file, 'x')) {
 076                  chmod($this->file, 0444);
 077              } elseif (!$this->handle = fopen($this->file, 'r')) {
 078                  usleep(100); // Give some time for chmod() to complete
 079                  $this->handle = fopen($this->file, 'r');
 080              }
 081          }
 082          restore_error_handler();
 083   
 084          if (!$this->handle) {
 085              $error = error_get_last();
 086              throw new IOException($error['message'], 0, null, $this->file);
 087          }
 088   
 089          // On Windows, even if PHP doc says the contrary, LOCK_NB works, see
 090          // https://bugs.php.net/54129
 091          if (!flock($this->handle, LOCK_EX | ($blocking ? 0 : LOCK_NB))) {
 092              fclose($this->handle);
 093              $this->handle = null;
 094   
 095              return false;
 096          }
 097   
 098          return true;
 099      }
 100   
 101      /**
 102       * Release the resource.
 103       */
 104      public function release()
 105      {
 106          if ($this->handle) {
 107              flock($this->handle, LOCK_UN | LOCK_NB);
 108              fclose($this->handle);
 109              $this->handle = null;
 110          }
 111      }
 112  }
 113