我创建了一个在Windows/Wamp环境中具有缓存脚本的应用程序。此脚本的缓存功能只允许同时运行一次。
为了实现这一点,我使用了一个"锁定文件"来检查它是否存在。
在windows上,此脚本仍然可以正常工作。但现在它被转移到Ubuntu环境中是不起作用的。
<?php
date_default_timezone_set('Europe/Amsterdam');
ini_set('max_execution_time', 300);
ignore_user_abort(true);
$path = 'locked.txt';
if ($lock = fopen($path,'x+')) {
fwrite($lock,time());
fclose($lock);
sleep(10);
unlink($path);
}
?>
错误:fopen(locked.txt): failed to open stream: Permission denied
来自PHP文档(转述一下):
x+创建并开放阅读和写作;将文件指针放在文件的开头。如果文件已经存在,则fopen()调用将失败,返回FALSE并生成E_WARNING级别的错误。如果文件不存在,请尝试创建它。这相当于为基础open(2)系统调用指定O_EXCL|O_CREAT标志。
根据您的描述,您正试图使用"x+"标志将文件用作锁定文件,以确保您没有锁定已锁定的文件。
问题是,从windows迁移到*NIX系统(如Ubuntu),您需要熟悉权限系统的差异。
短篇小说是:
每个文件和文件夹都"属于"一个用户。
想要在目录中创建文件的用户至少需要该目录的执行和写入权限。
考虑到这一点,您需要确保当前用户对带有脚本的目录具有写入和执行权限,并且要实际执行脚本,他们还需要对目录具有读取权限(除了对脚本的读取权限)。确保目录对运行脚本的用户具有读写执行权限(标志号7)。
如果您通过web界面运行脚本,则该用户将是www-data
。
一般来说,chmod 777 /directory/with/script
应该工作,并为所有用户授予对目录的读写执行权限。