PHP fopen';x+';不会';不要在ubuntu上工作


PHP fopen 'x+' doesn't work on ubuntu

我创建了一个在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应该工作,并为所有用户授予对目录的读写执行权限。