PHP の unlink() を実行したとき、Permission denied エラーが出てしまったらまずは次の3点をご確認ください:)
1. ディレクトリの権限
削除したいファイルが保管されているディレクトリの権限をご確認ください。
削除するためには、実行者(ブラウザ経由なら apache など)が読み取り・書き込み・実行のすべての権限を持っている必要があります。
もし権限が足りない場合は、権限の付与または所有者の変更をお試しください。
全権限付与の例
$ sudo chmod 700 /storage/sample_dir
所有者変更の例
$ sudo chown apache:apache /storage/sample_dir
2. ファイルの権限
次に、削除したいファイルの権限をご確認ください。
削除するためには、実行者(ブラウザ経由なら apache など)が読み取り権限を持っている必要があります。
もし権限が足りない場合は、1のときと同様に権限の付与または所有者の変更をお試しください。
読み取り権限付与の例
$ sudo chmod 400 /storage/sample_dir/sample.txt
3. ファイルの状態
3つめは、ファイルの状態確認です。
fopen() などでファイルを開いている最中は削除できません。 fclose() などで閉じてから unlink() を実行するようにしてみてください。
fopen() と併用する例
$file = '/storage/sample_dir/sample.txt';
$handle = fopen($file, 'r');
// ここでは削除できません
// unlink($file);
fclose($handle);
unlink($file);
Note
フレームワークのファイル削除機能などでも unlink() がよく使われています。たとえば Laravel の Storage::delete() で削除がうまくいかないようなときにもこれらの項目を確認してみてください。