ありがとうございます。
当方の本番サイトはこれまでimages, random の各ディレクトリ …… 0755
ですが、公式ドキュメントに合わせ(テストサイトも705)、またファイルそのものも705
として試しましたが変化はありません。が、opendir関数が機能するためにはディレクトリ、ファイルのパーミッションをどのように設定したらよいか、本番サイトの業者に確認したうえで、また確かめてみたいと思います。
ちなみに、前々回にご指摘いただいたように、rotate.php?img=test.jpgで表示されたのは、rotate.phpを強制的に動作させた、ということになるのでしょうか?phpファイルは、直接urlをたたく際はパーミッションには依存なく動作するものなのでしょうか?
レンタルサーバ側に問い合わせたところ、
・パーミッションをフルアクセス「777」にして試しても変化がなければパーミッションの問題ではない可能性があるとの話でした。実際に777に変更しても状況に変化はありませんでした。
・また、opendir関数が機能しているかどうか下記のスクリプトを示してもらったのでこれを置いてアクセスしてみたところ、randomディレクトリ内の全てのファイル名(画像及びrotate.php)が列挙されたので、opendir()自体は機能するような感じです。
<?php
$dir = "/home/sites/サイト・ドメイン/web/wordpress/wp-content/themes/my_theme/images/random/";
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
echo "filename: $file : filetype: " . filetype($dir . $file) . "<br />\n";
}
closedir($dh);
}
}
?>
やはり何らかの原因でheader.phpから呼び出すとrotate.phpが動作しない何か、があるのでしょうか?
レンタルサーバ屋さんから意味ある情報がもたらされました。
エラーログ上では、以下のような警告が発生しておりました。
PHP Notice: Undefined index: extension in /home/sites/サイト・ドメイン/web/wordpress/wp-content/themes/my_theme/images/random/rotate.php on line 175,
コメント行などがあり、正確にはどの位置か不確かですが、
if (isset($_GET['img'])) {
$imageInfo = pathinfo($_GET['img']);
if (
isset( $extList[ strtolower( $imageInfo['extension'] ) ] ) &&
file_exists( $folder.$imageInfo['basename'] )
) {
$img = $folder.$imageInfo['basename'];
}
} else {
$fileList = array();
$handle = opendir($folder);
while ( false !== ( $file = readdir($handle) ) ) {
$file_info = pathinfo($file);
if (
isset( $extList[ strtolower( $file_info['extension'] ) ] )
) {
$fileList[] = $file;
}
}
closedir($handle);
if (count($fileList) > 0) {
$imageNumber = time() % count($fileList);
$img = $folder.$fileList[$imageNumber];
}
}
の中で、
isset( $extList[ strtolower( $file_info['extension'] ) ] )
を指しているようです。ここから何か分かりそうなことはないでしょうか?画像ファイルの「拡張子」は、画像を変更する前も後も「.jpg」です。(画像ファイル名すら変えていないので。)
エラーログから推測するに、173行目の
$file_info = pathinfo($file);
でファイル情報を読み取り、175行目の
isset( $extList[ strtolower( $file_info['extension'] ) ] )
にてファイルの拡張子を判定する流れがうまくいってないようですね。配列 $file_info に拡張子の値が格納されてないので Undefined index: extension のエラーを出しているようです。
エラーを回避するため、試しに
isset( $extList[ strtolower( $file_info['extension'] ) ] )
をコメントアウトして1行上に
preg_match( "/jpg$/", $file )
と挿入するとどのような挙動になるでしょうか?
ありがとうございます。
お蔭様で正常に動作するようになりました。原因解明と原状復旧へのご尽力ありがとうございました!
今後、ipg以外のファイルが混在するようになった場合にも対応していけるように、
preg_match( “/jpg$/”, $file )
の正規表現部分にgif,png,等を追加していけばよさそうな感じですが、
isset( $extList[ strtolower( $file_info[‘extension’] ) ] )
と等価的な記述方法にしておくことは可能でしょうか?
一例ですが
preg_match( "/jpg$/", $file )
の代わりに
eregi( '(' . implode( '|', array_keys( $extList ) ) . ')$', $file )
という記述はどうでしょう?(当方の環境で検証しました) 143~147行で定義される配列のキーを流用しているので正規表現を追記しなくてもよいかと思います。
ありがとうございました。
お蔭様で、今後も心配なく運用できる見通しが立ちました。
また、いろいろ勉強になりました。
この度は、誠にありがとうございました。