lockDir = $lockDir ? rtrim( $lockDir, '/' ) : dirname( __FILE__ ); } public function get_lock( $key, $autoUnlockPeriod = NULL, $timeOutPeriod = NULL ) { if ( in_array( $key, $this->lockedKeys ) ) { return TRUE; } if ( ! is_dir( $this->lockDir ) ) { return FALSE; } $autoUnlockPeriod = empty( $autoUnlockPeriod ) ? $this->autoUnlockPeriod : $autoUnlockPeriod; $timeOutPeriod = empty( $timeOutPeriod ) ? $this->timeOutPeriod : $timeOutPeriod; $path = "{$this->lockDir}/{$key}"; if ( is_dir( $path ) && $autoUnlockPeriod ) { $mtime = filemtime( $path ); if ( ( time() - $mtime ) > $autoUnlockPeriod ) { rmdir( $path ); } } $oldUmask = umask(0); $connectTime = time(); while ( ! @mkdir( $path, 0777 ) ) { if ( time() - $connectTime > $timeOutPeriod ) { return FALSE; } usleep(100000); } umask( $oldUmask ); $this->lockedKeys[] = $key; register_shutdown_function( array( $this, 'release_lock' ), $key ); return TRUE; } public function release_lock( $key ) { $path = "{$this->lockDir}/{$key}"; if ( is_dir( $path ) ) { rmdir( $path ); } if ( in_array( $key, $this->lockedKeys ) ) { unset( $this->lockedKeys[ $key ] ); } } } // end of file locker.class.php