2016-04-15 138 views
0

我创建了一个在Windows/Wamp环境中具有缓存脚本的应用程序。该脚本的缓存功能只允许同时运行一次。PHP fopen'x +'在ubuntu上无法运行

为了达到这个目的,我使用了一个'锁定文件'来检查它是否存在。

在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

+3

“@ fopen”正在抑制可能会导致问题出现的错误。 – apokryfos

+0

@apokryfos删除了抑制'@'。但是没有错误。我还用一段简单的代码编辑了我的帖子。 – kgongonowdoe

+1

复制粘贴您的代码。在我的14.04 Ubuntu上运行良好。确保你已经拥有目录的执行权限,因为如果你不这样做,你不能删除。 – apokryfos

回答

1

从PHP文件(转述了一下):

x+ Create and open for reading and writing; place the file pointer at the beginning of the file. If the file already exists, the fopen() call will fail by returning FALSE and generating an error of level E_WARNING. If the file does not exist, attempt to create it. This is equivalent to specifying O_EXCL|O_CREAT flags for the underlying open(2) system call.

从您的描述您尝试使用使用一个文件作为锁定文件的 “X +”标志以确保您未锁定已锁定的文件。

问题是,从Windows迁移到* NIX系统(如Ubuntu),您需要熟悉权限系统中的差异。

小故事是:

每个文件和文件夹“属于”一个用户。

想要在目录中创建文件的用户至少需要该目录的执行和写入权限。

有考虑到这一点,你需要确保当前用户已经编写和使用脚本的目录执行权限和实际执行,他们还需要在目录中读取的权限(除读取权限的脚本在脚本上)。确保该目录具有运行该脚本的用户的读写执行权限(标志编号7)。

如果您通过网络界面运行脚本,该用户将是www-data

一般而言,chmod 777 /directory/with/script应该工作并为所有用户的目录授予读写执行权限。

+0

非常感谢!我了解问题和解决方案。一个简单的问题是:什么是标准权限值(在我改变之前,其中777大概允许读,写和编辑所有的,标准值是多少(在apache/php不允许写入的地方))。 – kgongonowdoe

+1

我认为ubunty中一个新目录的默认值是775(用户和组可以读写执行),尽管可能有一种方法可以改变这种情况,对于其他类Unix操作系统,它可能会有所不同。真理是没有“执行”权限的目录不能作为一个目录工作,因此每个人都可以读或写需要同时获得目录上的执行权限。 – apokryfos

相关问题