2016-04-15 16 views
0

Windows/Wamp環境にキャッシュスクリプトを持つアプリケーションを作成しました。このスクリプトのキャッシング機能は同時に1回だけ実行できます。ubuntuでPHPの 'x +'が動作しない

これを達成するために、「ロックファイル」を使用して、それが存在するかどうかを確認しました。

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); 
    } 
?> 

エラー:あなたが "X +" を使用してロックファイルとしてファイルを使用しようとしているあなたの説明から、

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.

:PHPのドキュメント(ビットを言い換え)からfopen(locked.txt): failed to open stream: Permission denied

+3

'@fopen'は、問題が何であるかを示す可能性のあるエラーを抑制しています。 – apokryfos

+0

@apokryfosは抑止 '@'を削除しました。しかし、エラーはありません。私はまた、簡単なコードで自分の投稿を編集しました。 – kgongonowdoe

+1

コードをコピーして貼り付けました。私の14.04 ubuntuでうまく動作します。ディレクトリに対して実行権限があることを確認してください。そうしなければ削除できません。 – apokryfos

答えて

1

すでにロックされているファイルをロックしていないことを確認してください。

問題は、Windowsから* NIXシステム(Ubuntuなど)に移行する際に、権限システムの違いを理解する必要があることです。

ショートストーリーは次のとおりです。

各ファイルとフォルダは、ユーザーに「所属します」。

ディレクトリにファイルを作成するユーザーは、少なくともそのディレクトリに対して実行権限と書き込み権限が必要です。

これを念頭に置いて、現在のユーザーがディレクトリに書き込み権限と実行権限を持っていることを確認し、スクリプトを実際に実行するには、ディレクトリに対して読み取り権限が必要です(読み取り権限スクリプト上で)。スクリプトを実行しているユーザーのディレクトリに読み取り/書き込み実行権限(フラグ番号7)があることを確認します。

ウェブインターフェイス経由でスクリプトを実行している場合、このユーザーはwww-dataになります。

一般に、chmod 777 /directory/with/scriptは、すべてのユーザーのディレクトリに対して読み取りと書き込みの実行権限を与え、許可する必要があります。

+0

ありがとうございました!私は問題と解決策を理解しています。しかし、私はそれを変更する前に、標準のパーミッション値(777はおそらくすべてのものの読み込み、書き込み、編集が可能で、標準値(apache/phpは書き込めない)は何ですか? – kgongonowdoe

+1

ubuntyの新しいディレクトリのデフォルトは775(ユーザとグループは読み書き可能)ですが、おそらくこれを変更する方法がありますが、これは他のUNIX系オペレーティングシステムでは異なるかもしれません。真実は、 "実行"権限のないディレクトリです。ディレクトリとしては動作しませんので、誰もが読み書きできるようにするためには、ディレクトリに対する実行権限も必要です。 – apokryfos

関連する問題