我创建了一个在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
答案 0 :(得分:1)
从PHP文档(稍微转述):
x +创建并打开阅读和写作;将文件指针放在文件的开头。如果文件已存在,则fopen()调用将失败,返回FALSE并生成级别为E_WARNING的错误。如果该文件不存在,请尝试创建它。这相当于为底层open(2)系统调用指定O_EXCL | O_CREAT标志。
根据您的描述,您尝试使用&#34; x +&#34;将文件用作锁定文件。标记以确保您没有锁定已锁定的文件。
问题是从Windows迁移到* NIX系统(如Ubuntu),您需要熟悉权限系统的差异。
短篇小说是:
每个文件和文件夹&#34;属于&#34;给用户。
想要在目录中创建文件的用户至少需要对该目录执行写入权限。
考虑到这一点,您需要确保当前用户对目录具有脚本的写入和执行权限,并且为了实际执行脚本,他们还需要对目录具有读取权限(在除了对脚本的读取权限外)。确保该目录具有运行该脚本的用户的读写执行权限(标记号7)。
如果您通过网络界面运行脚本,则该用户将为www-data
。
通常chmod 777 /directory/with/script
应该工作并为所有用户授予目录的读写执行权限。