没能了解的一个‘类’,求解释

WBOY
Lepaskan: 2016-06-13 12:55:12
asal
800 orang telah melayarinya

没能理解的一个‘类’,求解释
以下代码是一个程序中的一个类文件(lock.php),先说下他lock.php实际的作用:
在未知(是我不理解)的情况下,会在缓存文件夹 cache下生成一个.lock文件,例如index.php.lock  如果出现这个index.php.lock文件,那网站的首页就打不开了,必须手动删除它,再刷新首页,出现正常的缓存文件index.php 才能正常打开系统。

这个故障是不定时发生的,我现在也不理解在什么情况下才会发生,不理解为什么源码的作者为什么要设置这个功能。因为不知道最终来源,也没办法找源码的作者咨询了。

前几天,我把这个类文件lock.php删除了,网站一直正常,我以为这样就不会再有index.php.lock 文件了,但今天系统又打不开了,发现正常的cache/index.php缓存不见了,把这个类文件还原,然后再刷新系统,出现正常的cache/index.php,系统也就正常了。

lock.php的源码如下:

<?php<br />
<br />
class lock{<br />
private $num,$lock_marker,$lock_file,$timeout;<br />
public $islock;<br />
private function file_timeout(){<br />
if(file_exists($this->lock_file)){<br />
if(time()-filemtime($this->lock_file)>=$this->timeout){<br />
@unlink($this->lock_file);<br />
return true;<br />
}<br />
return false;<br />
}else return true;<br />
}<br />
function __construct($num=1,$timeout=3,$wait=false,$wait_time=0,$marker = ''){<br />
$this->num=$num;<br />
$marker ||$marker = $_SERVER['SCRIPT_FILENAME'];<br />
$marker = md5($marker);<br />
$this->lock_marker = $marker;<br />
$this->timeout=$timeout;<br />
$this->lock_file=d('./cache/lock/'.$this->lock_marker.$this->num.'.lock');<br />
if(file_exists($this->lock_file)){<br />
$this->islock=!$this->file_timeout();<br />
}else $this->islock=false;<br />
if(!$this->islock)touch($this->lock_file);<br />
else {<br />
if($wait){<br />
$wait_start=0;<br />
while(!$this->file_timeout()){<br />
if($wait_time>0){<br />
$wait_start+=100000;<br />
if($wait_start>$wait_time)break;<br />
}<br />
}<br />
file_exists($this->lock_file)&&@unlink($this->lock_file);<br />
touch($this->lock_file);<br />
$this->islock=false;<br />
}<br />
}<br />
}<br />
function __destruct(){<br />
$this->close();<br />
}<br />
public function close(){<br />
!$this->islock&&file_exists($this->lock_file)&&@unlink($this->lock_file);<br />
}<br />
}<br />
<br />
?>
Salin selepas log masuk


------解决方案--------------------
我怎么觉得你这个代码不能正常运行呢?
if(!$this->islock) touch($this->lock_file);//修改缓存文件的访问时间
执行的条件是 $this->islock 为假
而 $this->islock 为假的一个情况是:
$this->islock=!$this->file_timeout();
即方法 $this->file_timeout 返回真
而 $this->file_timeout 方法返回真时有
@unlink($this->lock_file);//删除缓存文件
return true;

既然缓存文件被删除了,那么 touch($this->lock_file) 不就要报错了吗?
Warning: touch() [function.touch]: Unable to create file because Invalid argument

另外下面还有
file_exists($this->lock_file)&&@unlink($this->lock_file);//缓存文件存在就删除掉
touch($this->lock_file);//又在修改不存在的文件的访问时间
Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!