2011-10-26 8 views
0

私のコントロール外のストリーミングサーバーを使用してストリーミングされた大きなビデオファイルがあります。ビデオファイルを削除したい場合があります。ストリーミングサーバーを使用している人がファイルを閲覧すると、PHPのエラーが「許可が拒否されました」と表示されます。PHPでファイルを削除できるかどうかを確認してください

ファイルを削除できるかどうかを確認する前に確認したいと思います。私は実際にファイルを削除しようとすると、それが失敗するかどうかを確認したくない、私は事前にチェックしたいと思います。

これは、これまでの私のコードです:

$file = "video.flv"; 
$file2 = "newvideoname.flv"; 
clearstatcache(); 
if (is_writeable($file)) { 
    echo "is writeable"; 
} 
else { 
    echo "is NOT writeable"; 
} 
echo "\n"; 
$fh = fopen($file, 'a+'); 
if (!flock($fh, LOCK_EX | LOCK_NB)) { 
    // file locked, do something else 
    echo "is locked"; 
} 
else { 
    echo "not locked!"; 
} 
fclose($fh); 
echo "\n"; 
if (touch($file)) { 
    echo "modification time has been changed to present time"; 
} 
else { 
    echo "Sorry, could not change modification time"; 
} 
echo "\n"; 
rename($file, $file2); 

コードを実行しながら、私はvideo.flvをストリーミングするときに私が得る出力:

is writeable 
not locked! 
modification time has been changed to present time 
PHP Warning: rename(video.flv,newvideoname.flv): Permission denied in ... 

は時々私は得る:

is writeable 
PHP Warning: fopen(video.flv): failed to open stream: Permission denied ... 
PHP Warning: flock() expects parameter 1 to be resource, boolean given 
is locked 
PHP Warning: fclose(): supplied argument is not a valid stream resource 
PHP Warning: touch(): Utime failed: Permission denied 
Sorry, could not change modification time 
PHP Warning: rename(video.flv,newvideoname.flv): Permission denied ... 

そのため、ファイルがPHPによってロックされず、PHPによってtouch()されないことがあります。そして、もちろん名前の変更は機能しませんがmetimes PHPは、renameコマンドまで "all is fine"と言っています。名前を変更するコマンドにはがありません。はランダムチャンスで動作します。

ファイルはどうすればよいですか?

+0

ファイルのアクセス許可はどうですか? –

+0

@KA_linビデオがストリーミングされていないときは、renameコマンドは完全に – Tominator

+0

で動作するので、問題はありますか? –

答えて

3
if (!flock(fopen($file, 'a+'), LOCK_EX | LOCK_NB)) { 

ファイルをロックしています。呼び出しが成功した場合は、再度ロックを解除してください(ちょうどecho "not locked!";

+0

は、ファイルをロック解除するために自分のコードを更新しましたが、同じ結果を持っています – Tominator

+0

あなたはファイルを閉じました。 – fredley

+1

PHPマニュアルからまっすぐに: "ロックはfclose()によっても解放されます(これはスクリプト終了時に自動的に呼び出されます)。" – Tominator

1

ファイルがflockでロックされているかどうかを確認したが、ファイルを閉じなかったという問題があります。

+0

はファイルをロック解除するために私のコードを更新しましたが、同じ結果を持っています – Tominator

+0

これは実際には理由だと思います –

+0

@Tominatorもfclose()を使ってファイルを閉じました – JRSofty

0

ストリーミングしているファイルを削除することはできません。本当にしたい場合は...コピーを作成し、ファイル名を付けてファイルを保存します(元のファイルを保存してください)。 )スタック(DB)内とcronジョブまたはそれを削除するために何かを持っている...

+0

ビデオがストリーミングされていないときに、名前変更コマンドが完全に動作する – Tominator

+0

「ロックされていません」というメッセージが表示されても、名前を変更できませんか? –

+0

実際、「ロックされていません」というメッセージと現在のコードサンプルでも、名前の変更/削除はできません。名前の変更はfcloseの後で行われるので、elseブランチに入れてもそれほど違いはありません。 – Tominator

-1

ソリューションはここにある:

$file = "test.pdf"; 

if (!is_file($file)) { 
    print "File doesn't exist."; 
} else { 
    $fh = @fopen($file, "r+"); 
    if ($fh) { 
     print "File is not opened and seems able to be deleted."; 
     fclose($fh); 
    } else { 
     print "File seems to be opened somewhere and can't be deleted."; 
    } 
} 
関連する問題