xref: /plugin/combo/ComboStrap/Mutex.php (revision c3437056399326d621a01da73b649707fbb0ae69)
1*c3437056SNickeau<?php
2*c3437056SNickeau
3*c3437056SNickeau
4*c3437056SNickeaunamespace ComboStrap;
5*c3437056SNickeau
6*c3437056SNickeau/**
7*c3437056SNickeau * Class Mutex
8*c3437056SNickeau * @package ComboStrap
9*c3437056SNickeau * Based on https://www.php.net/manual/en/function.flock.php
10*c3437056SNickeau *
11*c3437056SNickeau * May use also:
12*c3437056SNickeau * https://www.php.net/manual/en/class.syncmutex.php
13*c3437056SNickeau * https://github.com/php-lock/lock
14*c3437056SNickeau *
15*c3437056SNickeau */
16*c3437056SNickeauclass Mutex
17*c3437056SNickeau{
18*c3437056SNickeau    /**
19*c3437056SNickeau     * @var string
20*c3437056SNickeau     */
21*c3437056SNickeau    private $filePath;
22*c3437056SNickeau    /**
23*c3437056SNickeau     * @var false|ResourceCombo
24*c3437056SNickeau     */
25*c3437056SNickeau    private $filePointer;
26*c3437056SNickeau
27*c3437056SNickeau
28*c3437056SNickeau    /**
29*c3437056SNickeau     * Mutex constructor.
30*c3437056SNickeau     */
31*c3437056SNickeau    public function __construct($filePath)
32*c3437056SNickeau    {
33*c3437056SNickeau        $this->filePath = $filePath;
34*c3437056SNickeau    }
35*c3437056SNickeau
36*c3437056SNickeau    function lock($wait=10)
37*c3437056SNickeau    {
38*c3437056SNickeau
39*c3437056SNickeau        $this->filePointer = fopen($this->filePath,"w");
40*c3437056SNickeau
41*c3437056SNickeau        $lock = false;
42*c3437056SNickeau        for($i = 0; $i < $wait && !($lock = flock($this->filePointer,LOCK_EX|LOCK_NB)); $i++)
43*c3437056SNickeau        {
44*c3437056SNickeau            sleep(1);
45*c3437056SNickeau        }
46*c3437056SNickeau
47*c3437056SNickeau        if(!$lock)
48*c3437056SNickeau        {
49*c3437056SNickeau            trigger_error("Not able to create a lock in $wait seconds");
50*c3437056SNickeau        }
51*c3437056SNickeau
52*c3437056SNickeau        return $this->filePointer;
53*c3437056SNickeau    }
54*c3437056SNickeau
55*c3437056SNickeau    function unlock(): bool
56*c3437056SNickeau    {
57*c3437056SNickeau        $result = flock($this->filePointer,LOCK_UN);
58*c3437056SNickeau        fclose($this->filePointer);
59*c3437056SNickeau        @unlink($this->filePath);
60*c3437056SNickeau
61*c3437056SNickeau        return $result;
62*c3437056SNickeau    }
63*c3437056SNickeau}
64