[解決済]Windows10環境でAmazonS3にアップしたファイルをunlinkするとPermission deniedのエラーが発生する

Read More



Windows10環境においてAWS SDK for PHPを使ってAmazonS3に画像ファイルをアップロードしたあと元の画像ファイルを削除しようとしたらPermission deniedというエラーが出た。

AWS Linux環境では発生しなかったのでWindows10環境特有のエラーか、
あるいはPHPのVerによる差異で発生したものかなあと推測できる。
ちなみに現在のPHPのVerは5.6.33。

とりあえず、一応は解決できたので回避方法を残しておくものとする。

まずWindows10環境でunlinkのPermission deniedのエラーが発生する例を記す。

■unlinkでエラーが発生する例
<?php
$response = $s3->putObject(array(
  'Bucket' => 'production',
  'Key'    => 'topdir/'.$s3_filepath),
  'SourceFile' => $filepath,
));
unlink($filepath);

繰り返すがWindows10環境のみエラーが発生した。
AWS Linux環境ではエラーは発生していない。


さてunlinkのPermission deniedのエラー回避方法。

■unlinkのエラー回避方法
<?php
$response = $s3->putObject(array(
  'Bucket' => 'production',
  'Key'    => 'topdir/'.$s3_filepath),
  'SourceFile' => $filepath,
));
gc_collect_cycles();
unlink($filepath);


s3アップロードをした直後にgc_collect_cyclesを実行させる、これだけ。
これでunlink()がエラーを吐かずに正しく動作するようになる。



--
正直どうしてこれで解決するようになるのかさっぱりわからん。わかっとらん。

gc_collect_cycles()とはすべての既存ガベージサイクルを強制的に収集する、というもの。

PHPのガーベジコレクションについては昔調べたことがあるからあれはそれなりに知見があるけど、
ガベージサイクルを強制的に収集するって具体的にどういうことなん。

最初はs3の中でstaticな変数にfpが残ってるのかなぁとか考えたんだけど、
それだとLinux環境で問題なく動いてる理由がわからんくなる。

もちろんWin環境とLinux環境で動いてるコードが違うのかも知れん(追えてない)。