我有一个每隔几个小时重写一个文件的脚本。此文件通过php include插入到最终用户html中。
如何在检查用户显示文件时检查我的脚本在此时刻是否正常工作(例如重写)?它甚至是一个问题,就如果他们同时访问文件会发生什么,用户只需要等待几率,直到脚本完成其工作?
提前致谢!
有关此主题的更多信息......
这是使用file_put_contents
和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();
}
}
答案 0 :(得分:3)
要检查当前是否正在写入文件,可以使用filectime()函数来获取文件的实际写入时间。
您可以在变量中获取脚本顶部的当前时间戳,并且无论何时需要访问该文件,您都可以将当前时间戳与该文件的filectime()进行比较,如果文件创建时间是最新的,则会出现该场景当你必须等待写入该文件时,你可以将其记录在数据库或其他文件中。
为了防止这种情况发生,您可以更改正在编写文件的脚本,以便首先创建临时文件,一旦完成,您只需用原始文件替换(移动或重命名)临时文件,此操作将与文件写入相比,所需时间更少,并且使场景发生的可能性非常小。
即使读取和替换操作同时发生,读取脚本必须等待的时间也会非常少。
答案 1 :(得分:0)
根据文件的大小,这可能是并发问题。但是你可以很容易地解决这个问题:在开始编写文件之前,你可能会创建一种“锁定文件”,即如果你的文件名为“incfile.php”,你可能会创建一个“incfile.php.lock”。一旦你完成了写作,你将删除这个文件。
在include方面,你可以检查“incfile.php.lock”的存在并等到它消失,需要一些循环并在不太可能的并发访问情况下休眠。
基本上,您应该考虑另一种解决方案,只需将呈现在该文件中的数据写入数据库(锁等可用),然后在模块中呈现该数据,然后将其包含在您的页面中。像你这样的解决方案从长远来看很难维持......