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