12月
21
2008
0

WordPressでrealpathが警告を・・・

この間、サーバの総アップデートをかけた影響か、Wordpress がエラーを吐くようになりました。

メディアライブラリの画面で、

Warning: realpath() [function.realpath]: Unable to access /home/<(^o^)>/wp-admin/wp-content/uploads in /home/<(^o^)>/wp-includes/functions.php on line 1767

という警告が出るようになりました。一応ただの警告なので無視ってもいいのですが、
警告文のせいでかなりインターフェイスが崩れてしまっています。

見た感じ・・・存在しないアドレスに対してアクセスをしている模様。
(wp-admin/wp-contentは存在しない)

というわけで、Wordpress の該当箇所のソースを見たところ・・・

PHP:
  1. /**
  2. * Test if a give filesystem path is absolute ('/foo/bar', 'c:\windows').
  3. *
  4. * @since 2.5.0
  5. *
  6. * @param string $path File path
  7. * @return bool True if path is absolute, false is not absolute.
  8. */
  9. function path_is_absolute( $path ) {
  10.   // this is definitive if true but fails if $path does not exist or contains a symbolic link
  11.   if ( realpath($path) == $path )
  12.     return true;
  13.  
  14.   if ( strlen($path) == 0 || $path{0} == '.' )
  15.     return false;
  16.  
  17.   // windows allows absolute paths like this
  18.   if ( preg_match('#^[a-zA-Z]:\\\\#', $path) )
  19.     return true;
  20.  
  21.   // a path starting with / or \ is absolute; anything else is relative
  22.   return (bool) preg_match('#^[/\\\\]#', $path);
  23. }

となっていました。
用は、引数で与えられたパスに対して、絶対パスをrealpath関数で取得し、それと引数で与えられた元のパスを比較することで絶対パスかどうかの判定を行っているようです。

絶対パスが与えられた場合はいいのですが、相対パスが与えられた時、(カレントディレクトリ + 相対パス)が存在しないパスになってしまい、警告を発しているのでしょう。
今までのバージョンでは警告がでなかった仕様だったのが、最近のバージョンで警告がでるようになったのでしょう。

となれば、解決案は簡単。

PHP:
  1. if ( realpath($path) == $path )

この一行を、

PHP:
  1. if ( file_exists($path) && realpath($path) == $path )

と書き換える事で解決しました。

Apache/2.2.8
PHP/5.2.4-2

Powered by WordPress | Aeros Theme | TheBuckmaker.com