PHP fopen' x +'不适用于ubuntu

时间:2016-04-15 13:15:42

标签: php linux ubuntu cron fopen

我创建了一个在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

1 个答案:

答案 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应该工作并为所有用户授予目录的读写执行权限。