2 月 5, 2010
$1 ではなく %1 のお話です。
今まで画像をキャッシュしたり生成したりというのは
全部プログラム側で書いてたわけですが、
if (file_exists(IMG_CACHE_DIR.$cacheFile)) {
$image = imagecreatefromjpeg (IMG_CACHE_DIR.$cacheFile);
} else {
$image = imagecreatefromjpeg ($imgBack);
//画像加工処理
imagejpeg($image,IMG_CACHE_DIR.$cacheFile);
}
header("content-type: image/jpg");
imagejpeg($image);
imagedestroy($image);
まあこんなかんじで、キャッシュヒットもプログラム側で書いてたわけで、
これがどうにも地味に遅いので、何とか回避するべく頭をひねったお話です。
でまあ結論から言うと .htaccess のほうで
キャッシュヒットの処理を書いてしまうことに。
こんなかんじです。
//ファイルが画像の場合
RewriteCond %{REQUEST_URI} ^(.*\.(jpg|gif|png|jpeg))$
//cacheフォルダのキャッシュとヒットするか確認
RewriteCond %{DOCUMENT_ROOT}/cache/%1 -f
//ヒットしたらリライトして表示させる
RewriteRule .* /cache/%1 [L]
ポイントは %1 を使ってRewriteCondでヒットさせた参照を使用することで、
http://a.com/a.gif がキャッシュファイルである http://a.com/cache/a.gif
にヒットさせるってとこですかね。
今まで$1とかしか使ってなかったわけですが、%のが便利だなーと。
1 月 15, 2010
さくらで運用しているアプリを弄っていたら
突然こんなエラーが
ERROR 2013: Lost connection to MySQL server at 'reading initial communication packet' Error 61
無論DBにアクセスできない状態になったので、なんなのかなーと探っていたら
10分ほどして勝手に直った。
直った?っていうか本当に直ったの?ってことで
一応作業を終えた後色々調べていたら
どうもプロセスが死んでリスタートされてる間にアクセスすると
こんなエラーになるらしい。
このエラーが出た間に裏側ででたmysqlのエラーログはこんなかんじ。
Server shutdown in progress
Lost connection to MySQL server during query
Can't connect to MySQL server on '***.db.sakura.ne.jp'
てっきり作業でUPDATE文とかINSERT文とか1000行単位でぶちこんでいたから
それのせいなのかと思ってただけによかったよかった。
なんかのタイミングでmysqlサーバが再起動してたぽいですね
ということでまたおきた時の為にメモ。
1 月 14, 2010
シングルトン君を書いてる時にふと
try-catchのとこをきれいにかけないかなと思って
(今までいちいちtry文の中で throw new Exception() してたので)
set_error_handlerを使って書き直してみました。
//今までこんなかんじでめんどくさい
public function hogehoge() {
try {
if (TRUE === $error) {
throw new Exception($e);
}
if (~~~) {
throw new Exception($e);
}
} catch(Exception $e) {
}
}
//set_error_handlerを使うとこうなる
public function hogehoge() {
set_error_handler("Class名::dbErrorHandler");
try {
} catch(Exception $e) {
}
restore_error_handler();
}
public static function dbErrorHandler($enNo,$eStr,$eFile,$eLine) {
throw new Exception($eStr,$enNo);
}
おーやっとそれっぽくなった。
ちなみに set_error_handler() は staticで書いておけば
set_error_handler("クラス名::dbErrorHandler");
set_error_handler("self::dbErrorHandler");
set_error_handler(array($this,'dbErrorHandler');
のどれでもいけます。