🎉
PHP では rename 関数の失敗の原因が解らない件
PHPでローカルファイルをリネームするにはrenameを使うが、これはリネームに失敗してもfalseしか解らない。
オフィシャルドキュメントの通りだ。
成功した場合に true を、失敗した場合に false を返します。
失敗するには例えば次のような理由が考えられる。
- 親ディレクトリが存在しない
- ファイル名が長すぎる
しかもPHPではWarning扱いなのだ。
故に Warning メッセージとしては存在しており、ログに出力される。例えば次の通り
[Fri Mar 03 13:32:50.692503 2023] [:error] [pid 310452:tid 140355815065280] [client 192.168.0.18:57337] PHP Warning: rename(***,***): File name too long in ********.php on line 127, referer: ****
ログに出力してる状態であれば、この文字列をPHPのプログラムの中で受け取る機能は存在する。
PHP: error_get_last - Manual https://www.php.net/manual/en/function.error-get-last.php
戻り値は連想配列になってる。["message"]の文字列には前述のログのような文字列がそのまま入ってるので、ここからエラーの文字列を改めて判定する必要がある。
ぇぇぇ....面倒なんだが.....
他の大抵のモダンな言語実装では、例外を吐いてくれる場合が多い
python3では os.OSError例外のcodeでerrnoが採れる。 組み込み例外 — Python 3.11.2 ドキュメント
rubyではerrnoが戻るらしい。 File.rename (Ruby 3.2 リファレンスマニュアル)
nodejs fs.rename では Errorを吐くらしい File system | Node.js v19.7.0 Documentation
Discussion