画像ファイルの存否を確認して、ダウンロードする方法

phpは便利ですねぇ……ほんと既存の関数だけでなんとかなっちゃう(^_^;

phpでファイルが存在するか確認する

file_exists ($filename);


PHP: file_exists -Manual-
 http://php.net/manual/ja/function.file-exists.php


phpディレクトリを作成する

mkdir($pathname,$mode,true);


trueにしておくと途中のディレクトリがない場合、ついでに?作ってくれます。


PHP: file_get_contents -Manual-
 http://php.net/manual/ja/function.mkdir.php


phpでファイルをダウンロードする

$data=file_get_contents($filename , FILE_BINARY);


PHP: file_get_contents -Manual-
 http://php.net/manual/ja/function.file-get-contents.php


phpでダウンロードしたファイルを保存する

file_put_contents($filename2 , $data)


PHP: file_put_contents -Manual-
 http://php.net/manual/ja/function.file-put-contents.php



まとめると……

<?php
// 以上略
if (file_exists "/home/sample/img/$id/hoge.jpg")){
} else{
	mkdir("/home/sample/img/$id/",0644,true);
	$imgdata = file_get_contents("http://example.com/img/$id/hoge.jpg" , FILE_BINARY);
	file_put_contents("/home/sample/img/$id/hoge.jpg" , $imgdata);
}
// 以下略
?>

で、セーフモードにぶちあたる


これでソース自体はいいんだけど。
phpがセーフモードで動くサーバではファイル操作が絡むので、そのままでは動きません。


セーフモードが解除できるなら解除しましょう。


PHPCGIとして動かす方法について(CORESERVER.JP)
 http://www.coreserver.jp/help/index.php/phpcgi/


ただし私の場合、CGIとして動かしても駄目でした。
キャッシュをクリアすればみられるんだけど、、、。


2回目のアクセスの時にはhttpのheaderに以下の内容を付加してるんですよね。

If-Modified-Since: Wed, 15 Jul 2009 10:02:30 +0000
If-None-Match: "40ad31f2242d72b8e4ffd8c27605750d"
Cache-Control: max-age=0


で、サーバ側がこれを返してくる。

Etag: "40ad31f2242d72b8e4ffd8c27605750d"
Status: 304 Not Modified


こういうのが関係しているのかと思いましたが、


PHPでのエラー対策について
 http://www.coreserver.jp/help/index.php/phperror/


.htaccessにつけても駄目です。
うーん。


▽用語「If-Modified-Since」について(鳩丸ぐろっさり)
 http://bakera.jp/glossary/If-Modified-Since




今回は、HTMLScrapingのサンプルスクリプトHTMLToFeed.class.phpを使う際に、上記事例にぶちあたってます。
HTMLScrapingのキャッシュ機能とバッティングしているのでしょうか……わかりません。


頭を抱えたあげく、セーフモードのまま使う方法がないか検討しました。


ディレクトリの作成/削除…PHPのmkdirやらrmdirは使いまへんでした(XTREC)
 http://www.xtrec.com/column/1206735656.html


ディレクトリの作成/削除まとめ(XTREC)
 http://www.xtrec.com/column/1207932727.html


なるほど、Perlですか、という感じです。
ただ私、Perlについては、1ヶ月前ぐらいのphpぐらいの経験しか持っていません。
うん、怖いから使用は避けたい……



なんかいい方法がないかと改めてマニュアルを読みました。


PHP: セーフモードにより制限を受けるか無効となる関数 - Manual
 http://php.net/manual/ja/features.safe-mode.functions.php


mkdirはもちろん制限を受けるんですけど、file_put_contentsは、、、載ってない( ̄□ ̄;


「この関数は、fopen()、fwrite()、 fclose() を続けてコールしてデータをファイルに書き込むのと等価」。そしてfopen()は、mkdir同様、「処理を行うディレクトリが実行するスクリプトと同じ UID を有しているかどうかを確認」する。にもかかわらず、file_put_contentsは対象外。


うーん(笑)
試しにmkdirを除いてセーフモードで動かしてみたら動きました。


なんだったんだ、今までの苦労は……<半日つぶれてふて寝した人


解決策じゃなくて回避策なので、後ろ向きですけど。
まあ

セーフモードは、PHP 6.0.0 で削除されます。


PHP: セーフモード
 http://www.php.net/manual/ja/features.safe-mode.php


んなかんじなので、将来的には問題なし。まぁいいかと。
どうせ今だけさー