【发布时间】:2011-02-05 13:04:48
【问题描述】:
我正在尝试创建一个 PHP 文件,如果它已经在运行,它将不会运行。这是我正在使用的代码:
<?php
class Test {
private $tmpfile;
public function action_run() {
$this->die_if_running();
$this->run();
}
private function die_if_running() {
$this->tmpfile = @fopen('.refresher2.pid', "w");
$locked = @flock($this->tmpfile, LOCK_EX|LOCK_NB);
if (! $locked) {
@fclose($this->tmpfile);
die("Running 2");
}
}
private function run() {
echo "NOT RUNNNING";
sleep(100);
}
}
$test = new Test();
$test->action_run();
问题是,当我从控制台运行它时,它运行良好。但是当我尝试从浏览器运行它时,许多实例可以同时运行。这是在 Windows 7、XAMPP、PHP 5.3.2 上。我猜操作系统认为这是相同的过程,因此功能下降。有没有跨平台的方式来创建这种类型的 PHP 脚本?
【问题讨论】:
-
flock 文档说 LOCK_NB 在 Windows 上不受支持。使用静默运算符 (@) 是一个非常糟糕的主意,您实际上可能会抑制您遇到的错误。
-
@Evert,感谢您的建议,我复制了锁定代码,但没有删除@,但它没有显示任何错误