【问题标题】:PHP fopen 'x+' doesn't work on ubuntuPHP fopen 'x+' 在 ubuntu 上不起作用
【发布时间】:2016-04-15 22:13:28
【问题描述】:

我在 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

【问题讨论】:

  • @fopen 正在抑制可能的错误,否则这些错误会表明问题所在。
  • @apokryfos 删除了抑制 @。但是没有错误。我还用一段更简单的代码编辑了我的帖子。
  • 复制粘贴您的代码。在我的 14.04 ubuntu 上运行良好。确保您对目录具有执行权限,否则无法删除。
  • 我确实有错误,抱歉。我犯了一个错误。错误如下'fopen(locked.txt): failed to open stream: Permission denied'。
  • 您的网络服务器无权以读写模式打开locked.txt 文件。

标签: php linux ubuntu cron fopen


【解决方案1】:

来自 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 应该可以工作并授予所有用户对该目录的读写执行权限。

【讨论】:

  • 非常感谢!我了解问题和解决方案。一个快速的问题:什么是标准权限值(777 可能允许所有人读取、写入和编辑,标准值是什么(不允许 apache/php 写入),在我更改之前)。跨度>
  • 我认为 ubunty 中新目录的默认值是 775(用户和组可以读写执行),尽管可能有一种方法可以改变这一点,并且对于其他类似 unix 的操作系统可能会有所不同.事实是没有“执行”权限的目录不能作为目录工作,所以每个人都可以读取或写入需要还获得目录的执行权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 2019-05-31
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多