🎉

PHP では rename 関数の失敗の原因が解らない件

2023/03/07に公開約1,100字

PHPでローカルファイルをリネームするにはrenameを使うが、これはリネームに失敗してもfalseしか解らない。
オフィシャルドキュメントの通りだ。

PHP: rename - Manual

成功した場合に 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

ログインするとコメントできます