画像ファイルの存否を確認して、ダウンロードする方法
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がセーフモードで動くサーバではファイル操作が絡むので、そのままでは動きません。
セーフモードが解除できるなら解除しましょう。
▽PHPをCGIとして動かす方法について(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
んなかんじなので、将来的には問題なし。まぁいいかと。
どうせ今だけさー