session_set_cookie_params関数

PHPしかやっていなかったときは、極力クッキーを使って値を保存するようなことはしないようにしていた(セッションは使うけど)。クライアントサイドにデータを保存しても改ざんされる前提で使わないといけないからだ。しかし最近はいろいろ使うようにしている。そもそもGETやPOSTでの値引渡しと同じという前提でやれば問題ないわけで。ただ、GETやPOSTと違うのは値をセットする方法で、setcookie関数を使わないといけないところだ。GETやPOSTと同様にこんな感じでクッキーがセット出来ればいいのに。

$_COOKIE[‘_key’]=’_value';

まぁ、できないほうがいいという理由もわかるのだけれど。

で、最近使うようになったクッキーだが、便利な関数があることを知った。session_set_cookie_params関数だ。この関数一つでクッキー周りの設定がすべてできてしまう。

void session_set_cookie_params (
int $lifetime
[, string $path
[, string $domain
[, bool $secure = false
[, bool $httponly = false ]]]]
)

第1引数:セッション有効期限(秒)
第2引数:クッキーが動作するパス
第3引数:クッキーが有効なドメイン名
第4引数:https時のみ使用可能とするかどうか
第5引数:JavaScript等からのクッキーへのアクセスを許可するかどうか

デフォルトではPHPでセットしたクッキーを、JavaScriptから読み込むことはできないのかな。その逆はできるけど。

「この記事を読んだ人はこんな記事も見ています」を実現する

2010/11/06 | データベース

レコメンデーションの仕組みで一般的となっている「この記事を読んだ人はこんな記事も見ています」。これをSQLで実現するにはどうすればいいかを模索していて、少し先が見えてきたのでメモしておく。

まずテーブルとしてusers_pagesを作成し、カラムは2つ(user_idとpage_id)。カラムの型はそれぞれinteger。本来はusersテーブルとpagesテーブルがあるが、とりあえずここでは考慮しない。user_idとpage_idの組み合わせを主キーとし、それぞれのカラム単体でもインデックスを張っておく。こんな感じ。

CREATE TABLE `users_pages`
(
`user_id` int(11) NOT NULL,
`page_id` int(11) NOT NULL,
PRIMARY KEY (`user_id`,`page_id`),
KEY `user_id` (`user_id`),
KEY `page_id` (`page_id`)
);

訪問者が訪れるたびに、user_idを発行し、user_idがページを閲覧するたびに、当該user_idと閲覧したページの番号(page_id)の組み合わせを行として挿入していくイメージ。

「この記事を見た人は」ということなので、記事ごとにSQL文を流す方法を考える。つまりpage_id=n(nはページ番号)。一番簡単に思いつくのはこんな感じと思う。

  1. 当該page_idを閲覧したuser_idを検索する
  2. 検索結果のuser_idが閲覧したpage_idを検索する(ただし当該ページは除く)
  3. page_idでGROUP BYして件数をカウントする
  4. ORDER BYで降順にソートする

つまりサブクエリを使う方法。しかしこれはどうも速度が出ない。1万件程度のデータ(ページ数500平均5ページビューとして2,000人のデータ)で以下のSQL文を実行してみた(nはページ番号)。

SELECT * FROM users_pages up1 WHERE up1.page_id IN (SELECT up2.user_id FROM users_pages up2 WHERE up2.page_id=n);

実行時間は・・・数分たっても結果が帰ってこなかった(非実用的)。次に自己結合を使って書き直してみた。

SELECT * FROM users_pages up1 LEFT JOIN users_pages up2 ON up1.user_id=up2.user_id WHERE up2.brand_id=n;

クエリ実行時間0.01秒。こちらは実用的な速度。後者のSQLでpage_id=nを閲覧した人が、他に閲覧したpage_idを抽出することができる。

ただこれ、50万件のデータになると処理速度がクエリ実行時間が1.25秒になった。ブラウザでSQLを流してから結果を受け取るまではすごく時間がかかった。「SELECT *」ではなくて必要なカラムを指定すれば早くなるけど。おそらく数万件程度のデータなら都度実行してもよさそうだが、それ以上はバッチ処理にしておかないとダメそう。COUNTしてORDER BYするともっと遅そうだから。

SQL苦手だな・・・。

ウェブ屋で集まる会(参加者募集)

2010/11/01 | その他

このブログに訪れる人はきっとプログラマが多いだろうと思ったので。PHPな人、JavaScriptな人に是非。

去年、自分で「ウェブ屋の飲み会」を企画・主催した。それが結構好評で、去年のメンバーと話していて「今年もやろう」ということになった。去年はプログラマが4人ほど、HTMLコーダーが2人ほど、デザイナーが2人ほどを集めた。自分ともう一人が、普段付き合いのある(もしくは最近知り合った)ウェブ屋さんをそれぞれ声をかけてメンバーを集めた。結果集まった人同士はほとんどが初対面。でもとりあえずウェブ業界という共通のくくりの中にいる人ばかりなのでそれなりに盛り上がった。

その後仕事でつながったりしている人達もいて、当初の目標(人をつなげる)を達成できた感があった。

今年は10人超くらいでメンバーを集めようとしているけれど、今のところデザイナーさん、コーダーさんは集まりそうだけど、声を掛けるべきプログラマさんがいなくて・・・。というわけで、テクメモで声をかければ誰か来るんじゃないかと思って記事にしてみた。

日程は12月の1週目か2周目を予定していて、場所は吉祥寺あたり。最近のウェブ制作で一番よく使われていそうなPHPもしくはJavaScriptをメインにしている人を探しています。でもデザイナーさんとかコーダーさん、フラッシャーさんでもOK。ただしあまり人数を多くしたくないので、たくさんの人数になっちゃった場合は後日別口で場を設けます。現在お声がけ中のメンバーは30代前半から50代までくらい。男女それぞれ。

今のところメンバーは、それぞれ相応にスキルがあるので、ウェブ業界駆け出しの人はあまり楽しくないかもしれない。プログラマの目安を言うと、PHPなら自分で汎用的なクラスを書けること、JavaScriptならAjaxとか普通にできちゃう人。あと社交的でお酒と会話を楽しめる人だとメンバーと打ち解けやすいと思う。男女は問わず。何でも屋さん的な人はこの集まりに向かないので、ずばり「これにはそこそこ自信があるよ」というのを持っている人がいいです。

参加してみたい人はコメント欄に入力してください。メールアドレスもよろしくです。連絡いただいたコメントは公開しません。個別にメールで連絡します。では、誰か、よろしくです。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net