2016-04-15 89 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

相關問題