1

我有一个脚本,每隔几个小时就重写一个文件。该文件通过 php include 插入到最终用户的 html 中。

我如何检查我的脚本在这个确切的时刻是否正在运行(例如重写)文件,当它被调用给用户进行显示时?这甚至是一个问题,如果他们同时访问文件会发生什么,几率是多少,用户是否只需要等到脚本完成工作?

提前致谢!

更多关于这个主题...

这是使用file_put_contentsand的一种方式LOCK_EX吗?

当脚本不时保存其数据时

file_put_contents($content,"text", LOCK_EX);

当用户打开页面时

if (file_exists("text")) {

function include_file() {

    $file = fopen("text", "r");
    if (flock($file, LOCK_EX)) {
    include_file();
    }
    else {
    echo file_get_contents("text");
    }
}
 } else {
echo 'no such file';
}

有人可以就语法给我建议吗,这是include_file()在条件后调用的正确方法吗?如何限制此类调用的数量?

我想这个解决方案也很好,除了同样的调用include_file(),它甚至可以工作吗?

function include_file() {

$time = time();
$file = filectime("text");

if ($file + 1 < $time) {
echo "good to read";
} else {
echo "have to wait";
include_file();
}

}
4

2 回答 2

3

要检查文件当前是否正在写入,您可以使用 filectime() 函数来获取文件正在写入的实际时间。

您可以在变量中获取脚本顶部的当前时间戳,并且每当您需要访问文件时,您可以将当前时间戳与该文件的 filectime() 进行比较,如果文件创建时间是最新的,那么当您有等待该文件被写入,您可以将其记录在数据库或其他文件中。

为了防止这种情况发生,您可以更改正在写入文件的脚本,以便它首先创建临时文件,一旦完成,您只需用原始文件替换(移动或重命名)临时文件,此操作将需要非常少时间与文件写入相比,使场景发生的可能性非常小。

即使读取和替换操作同时发生,读取脚本所等待的时间也会非常少。

于 2013-06-18T05:17:10.537 回答
1

根据文件的大小,这可能是并发问题。但是你可以很容易地解决这个问题:在开始编写文件之前,你可以创建一种“锁定文件”,即如果你的文件名为“incfile.php”,你可以创建一个“incfile.php.lock”。完成写入后,您将删除此文件。

在包含方面,您可以检查“incfile.php.lock”的存在并等待它消失,在不太可能的并发访问情况下需要一些循环和休眠。

基本上,您应该考虑另一种解决方案,只需将呈现到该文件中的数据写入数据库(锁等可用)并将其呈现在模块中,然后将其包含在您的页面中。从长远来看,像您这样的解决方案很难维持......

于 2013-06-18T04:53:08.827 回答