タグ: php を抽出しています。
Total: 96

memcache, PHP

ブログ | 2010/4/9 12:18
Macportsからインストール
sudo port install -v php5-memcache

起動
sudo launchctl load -w /Library/LaunchDaemons/org.macports.memcached.plist
終了
sudo launchctl unload -w /Library/LaunchDaemons/org.macports.memcached.plist

最大容量の設定などは、
/opt/local/etc/LaunchDaemons/org.macports.memcached/memcached.wrapper
のstart()のところで、
-m 128
とかにすれば良いようだ。デフォルトは64MB。

その他の設定は、terminal
memcached -h
で参照。

設定値は、
telnet localhost 11211
stats
で参照。control+]で抜ける。で、close。

PHPでの使い方は
http://www.php.net/manual/ja/book.memcache.php
http://www.php.net/manual/ja/memcache.examples-o...

使いどころは研究。

Apache2.2 PHPで生成の画像・JS・CSSのブラウザキャッシュ

ブログ | 2010/2/20 01:06
以前に「PHPで生成したCSSなどをキャッシュする。」
http://www.rottel.net/kuwa/3126
というメモを書いたのだけれど、昨日ふとブラウザキャッシュが効いてないことに気がつきました。なんてことだ。(ブロードバンドのせいにしといてみる)

それに気がつくと、帯域を使いすぎている原因がソレだということで、いろいろ合点がいきました。

awstatsで見ると、去年の8/25からガツンと転送量が増えていて、ちょうどそのころ新しいmacminiにメインサーバーを交換したことから、その時にapache2からapache2.2にしてたんじゃないかと思い当たります。

今回検索してみたら、apache2.2でキャッシュ関係が強化されたのは、常識みたいです。

まず、下記ページを参照して、httpd.confにExpires関係を追加
http://bali.sakura.ne.jp/サーバー/apache-cache-contr...

ExpiresActive On
ExpiresByType text/css "access plus 100 days"
ExpiresByType application/x-javascript "access plus 100 days"
ExpiresByType image/gif "access plus 100 days"
ExpiresByType image/jpg "access plus 100 days"
ExpiresByType image/jpeg "access plus 100 days"
ExpiresByType image/png "access plus 100 days"

<FilesMatch ".(ico|jpg|jpeg|png|gif|js|css|swf|mov)$">
 Header set Cache-Control "max-age=8640000"
</FilesMatch>

で、PHPの出力でキャッシュを有効にする記述
例えば、jpegの場合は、
<?php

if(array_key_exists("If-Modified-Since", apache_request_headers())){
 header("HTTP/1.1 304 Not Modified");
 exit();
}

header('Content-Type: image/jpeg');
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");

?>
ブラウザから、If-Modified-Sinceがリクエストされた場合は、304だけを返して終了させてしまうのである。

ということで、様子見中。
▼追記 2010/2/20 14:48
ExpiresByType text/plain “access plus 30 days”
ExpiresByType text/html “access plus 30 days”
この辺りを入れると、PHPでのhtml出力もheaderにmax-ageが入り、キャッシュされてしまったので、削除。

なんとなく分かったこと、
ExpiresByType で設定すると、phpでのjs出力などには、headerにmax-ageが入るけれど、普通のtest.jsなどには入らない。

普通のファイルには、FilesMatchでファイル名を選び、
Header set Cache-Control "max-age=8640000"
で、 headerにmax-ageを入れる。

ということで、更に様子見。
変な挙動がでていたら、リロードしてみて下さい。
▼追記 2010/2/22 22:37
転送量、まったく改善されてない。なぜだ。

passthru()

ブログ | 2010/2/16 22:39
coreserverへ、rsyncでバックアップする訳だけれども、rsyncの負荷が上がるとすぐ止まる。
あれこれ工夫が必要だ。

で、PHPでディレクトリ毎にrsyncしていくなんて処理をする。
それでひとまず良かったのだけれど、coreserverにファイル数の制限が設けられたようなので、さらにアーカイブしてからrsyncしたりする。
が、ファイルが大きくてもrsyncはしばしば止まる。4割方失敗。

PHPのshell_exec()で、rsyncを動かしていたのだけれど、これだとエラーがわからない。
そんな時は、passthru($cmd,$res) を使うとよいようだ。

$cmd = 'rsync -avz .................';
passthru($cmd,$res);

if($res != 0){
 //ftp処理を書いてファイルを上げてしまえ
}else{
 echo 'ok';
}

mysqliやめた。

ブログ | 2009/10/22 01:59
昨日せっせと30mapsを mysql -> mysqli にしてみたのだけれど、少し多めの作業をされると、
MySQL server has gone away
的なメッセージが出たりして、困った感じだったので、先ほどさっと戻しました。

mysql_connect (ずっとこれ)

mysqli_connect (今回トライした)

mysql_pconnect (で、これにしてみた。テスト中)

あと、今までこう書いてたのだけれど、
$row = mysql_fetch_array($res, MYSQL_ASSOC);
こうした。短いから。
$row = mysql_fetch_assoc($res);

mysqliにしてみた動機は、mysqlndとやらが、mysqliでないと機能しないんじゃないかという判断からだったのだけれど、まだ情報が少ないしよくわからないので当面保留。

MySQL
http://www.php.net/manual/ja/book.mysql.php
Mysqli
http://www.php.net/manual/ja/book.mysqli.php
Mysqlnd
http://www.php.net/manual/ja/book.mysqlnd.php

肝心なところが日本語化されてなくてよくわからない。
▼追記 2009/10/23 02:53
結局、mysql_connect に戻す。
そんな人生。自棄っぱちのオプティミスト。
▼追記 2009/10/23 18:17
mysqliはマイエスキューリって読むらしい。keio-ボーイに聞いた。

Amazon

DODECAGON
キリンジ
¥ 3,150

unset()で配列の要素を削除できるんだ

ブログ | 2009/10/15 15:08
やってみたらできた。知らんかった。

http://jp.php.net/manual/ja/language.types.array...
unset($arr[5]); // 配列から要素を削除します
unset($arr);    // 配列全体を削除します

もう日も暮れるし、帰ろう。
タグ

MySQL,fulltextインデックス,Ngram化のまとめ。

ブログ | 2009/9/30 00:46
少し説明的に。
MySQLには、fulltextという全文検索用のインデックスがあります。
ただ、日本語は単語単位で区切られていないので、なんらかの方法で区切る必要があります。区切り方には、形態解析で区切る方法と、意味なんて考えずに1文字とか2文字とかで区切っていくNgramという方式があります。

(あ、その前に、検索対象が数万件くらいなら、「REGEXP」で検索するのがいいと思います。速いし、おそらく厳密だし。)

で、今までは形態解析の方でやってました(mecabなるものを利用)。
ただ、このインデックス化は、「アイスクリーム」を検索したい時に、インデックスに「アイスクリーム」しかないと、「アイス」という検索ではヒットしないというところが難点でした。

初期導入時は、、なんとなく意味で区切った方がインデックス文字列が少なくていいし、優れているのではないかというのが選択動機だったと思います。

さて、Ngram化。

1) まずインデックス文字列の作り方。PHPです。
function ngramIndex($str,$wlen){
 $str = preg_replace('/[\r\n  ]/u','',$str);
 $len = mb_strlen($str);
 $n = array();
 for($i=0; $i < $len; $i++){
   for($a=1; $a <= $wlen; $a++){
     $n[] = mb_substr($str,$i,$a);
   }
 }
 $n = array_unique($n);
 return $n;
}

$str がNgram化したい文字列。
$wlen は、何文字までインデックス化するか(僕は、5にしてみた)

で、配列が返ってくるので、
$str = ngramIndex($str,5);
$str = mysql_real_escape_string(implode(' ',$str));
こんな感じで、$strをMySQLにインサートします。

2) 検索文字列の作り方。PHPです。
function ngram($str){
 $len = mb_strlen($str);
 if($len > 5){
   $n[] = mb_substr($str,0,5);
   if($len > 10){
     for($i=5; $i <= $len-5; $i++){
       if($i%5 == 0){
         $n[] = mb_substr($str,$i,5);
       }
     }
   }
   $n[] = mb_substr($str,-5,5);
   $n = array_unique($n);
 }else{
   $n[] = $str;
 }
 return $n;
}
こんなことにしました。

「マルボロ」-> 「マルボロ」
「クリーニング」-> 「クリーニン, リーニング」
「トールラテで腹下ルのです」-> 「トールラテ, で腹下ルの,下ルのです」

このように配列が返ってくるので、これを展開して、
SELECT ~~~~ WHERE MATCH (ngram) AGAINST ('+クリーニン +リーニング' IN BOOLEAN MODE) ~~~
こんなクエリーにセット。

実際は、複数単語で、AND、OR、除外やらという検索をさせるから、そのあたりはグルグリ関数を書きました。

さて、結果はいかに。今、ポストマップのインデックスを再作成中。
現在、482,436件くらいのデータのようです。
http://postmap.org/list

Rottelも後日、変更していきます。
▼追記 2009/9/30 10:36
5文字までやってたら、longtext型の4294967295byteを超えてエラーで止まった。とりあえず4文字にして、insertする文字数をちゃんと容量内にするように書いて継続。

インデックス作りはもう少し研究が必要だ。
▼追記 2009/9/30 11:44
あー、インデックスづくりで、遅延だ、遅延だ。
▼追記 2009/9/30 15:15
インデックスづくりは休み休みやろう。

...
コメントの検索って、あれ使ってるのかな。
▼追記 2009/10/1 03:29
インデックス作りをなめてた。
朝までに終わるかな・・・。

ポストが終わったら、電話やって、Rottelに行こう。
▼追記 2009/10/2 00:29
なんか、検索スピードが納得いかない。
ヒット件数が少ないと速いみたいだけれど。

インデックスが大きすぎるのが原因のような気がするので、3文字に減らしてみる。
▼追記 2009/10/2 03:05
インデックス更新を回して寝る。
いろんなサイトでDBが遅延してしまいますが、すみません。(投稿したものがすぐに出てくなかったりすると思います)

朝までに終わらない気もする。
▼追記 2009/10/2 19:08
200件インデックス作成したら、30秒スリープしてDBの同期を待つ。これでいい感じ。FULLTEXTインデックスの更新はなかなか遅いらしく、テストするのも何かと大変だ。

文字列のNgram化

ブログ | 2009/9/29 02:43
function ngram($str){
 $str = preg_replace('/[\r\n  ]/u','',$str); //...(1)
 $len = mb_strlen($str);
 $n = array();
 for($i=0; $i < $len-1; $i++){
   $n[] = mb_substr($str,$i,2);  //....(2)
 }
 $n = array_unique($n);   //...(3)
 return $n;
}
こんな感じかな。

(1) 改行とスペースの削除
(2) 2文字ずつ配列に
(3) 重複をまとめる

で、配列で返す。
▼追記 2009/9/29 04:15
2文字のインデックスだけだと、「駅」みたいな1文字が検索できないんだな。
$n[] = mb_substr($str,$i,1);
も追加しとくか。
▼追記 2009/9/29 22:58
1文字2文字だけだと、長いフレーズが遅いと思う。
ということで、1〜5文字でインデックス化したる。

PHP5.3メモ

ブログ | 2009/8/27 03:04
http://www.php.net/manual/ja/language.operators....
「PHP 5.3 以降では、三項演算子のまんなかの部分をなくすこともできるようになりました。 式 expr1 ?: expr3 の結果は、expr1 が TRUE と同等の場合は expr1、 それ以外の場合は expr3 となります。」

こんな書き方。
$host = @$_SERVER['HTTP_X_FORWARDED_FOR'] ?: $_SERVER['REMOTE_ADDR'];
でも、これの場合@がないとエラーが出るから、真偽値が返るものに使うのが正しいのかもしれない。
$host = !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
やっぱり、こう書くべきなのかも。

http://www.php.net/manual/ja/migration53.php
いずれじっくり眺めてみようと思うけれども、
「GD関数では、imagefilter() 関数を使ってモザイク効果を適用できるようになりました。」
とある。ちょっと使ってみたい。

http://www.php.net/manual/ja/migration53.other.p...
タグ
| 1 | 2 | 3 | 4 | 5 | 6 | ..... | 11 | 12 |

Rottel内コンテンツ

ユーザー一覧

Rottelとは?
利用規約
開発飲料
利用者の声
ヘルプ
close