[Tep-j-general] 全商品リスト作成 mklist.php

Back to archive index

hamada bungu****@leo*****
2003年 6月 23日 (月) 14:58:46 JST


こんにちわ。

http://lists.sourceforge.jp/pipermail/tep-j-general/2003-May/000714.html

にて、All Products Pageと同じ

> product_info.php/products_id/1649

形式のリンクではなく

> product_info.php/cPath/223_202_222/products_id/1649

という「カテゴリーパス情報を含む形式でのリンク」を作成する検索エンジン対
策スクリプトを作成し以後実用に供して来たのですが、この

> 223_202_222

を生成してくれる

tep_get_product_path()

という関数はカテゴリーの深さ分ループして次々とクエリーを発行し、カテゴリー
パスを得るようになってる→商品数とアクセス数の両方が増えて来た結果、この
ループによるMySQLの負荷が非常に重くなってきました。

(デフォルトではload avarage=12で接続を諦めちゃうsendmailが、同時アクセ
スの頻発する時間帯になると度々「rejecting connections on daemon MTA」を
訴えてくるくらいの負荷に…)

そこで、負荷対策として「アクセスされるたびにMySQLにクエリーを発行して全
商品一覧を得る」動的生成を諦め、「指示されたときにのみ全商品一覧のhtmlを
作成する」静的生成のスクリプトに作り直してみました。

このスクリプトは同じディレクトリ(/catalogを想定。というか決め打ち)にあ
るlist.htmlというファイルを開き、これを最新の全商品一覧に書き換えるスク
リプトです。予めlist.htmlというファイルをパーミッション666等で用意してお
く必要があります。

・/catalog(default.phpと同じトコ)に設置
・「サーチエンジン対策のURLを使用(開発中)」がTrue
・日本語のみの環境

↑以上を決め打ちしてます。また、osCommerce 2.2 20021230版のみで動作を確
認してます。MS1未確認。

「サーチエンジン対策のURL(開発中)」は、このような検索エンジン対策スク
リプトを走らせるならオンにしておくほうが好ましいと思います。

このスクリプトは、基本的に前作list.htmlのprintfをfwriteに書き換えたもの
です。全然難しい事はしていません。

このソースには「<A href="./">ショップへ戻る</A>」ボタンとかも付いてませ
ん。これは自社専用として省略されたヘッダ部分にある→実用する場合、ヘッダ
やフッタを自前で追加してください。header.phpやfooter.phpは使えません。

使い方>

・シェルから php /var/www/html/catalog/mklist.php とか
・ブラウザからmklist.phpにアクセス

のどちらかで。

前者はスクリプトを適切なパーミッションに設定しとく必要があると思いますが、
これが出来るなら「cronで定期的にリストを更新」出来るはずです。

後者の場合、リストを更新したい時にmklist.phpにブラウザでアクセスするだけ
です。認証等まったくしてませんが、「ただリストを更新するだけ」のスクリプ
トですからまぁいいかなぁ、とか。

文字色とか表の幅とかは弊社仕様→もし実用に供される場合、適当に修正して使っ
てください。

本当に稚拙なスクリプトで申し訳ないんですが、osCommerce最大の弱点とも言え
る検索エンジン対策に

・Header Tags Controller
http://lists.sourceforge.jp/pipermail/tep-j-general/2002-December/000315.html
http://lists.sourceforge.jp/pipermail/tep-j-general/2002-December/000319.html

と組み合わせる事で絶大な効果を発揮します(実験済)ので、恥を忍んで。

「商品名で飛んで来られるお客さまに対し同カテゴリの商品をお見せする」

ことは、お客さまの利便性にも大きく寄与しますし。

(All Products Pageや旧list.htmlだと、お客さまは同種商品を探すためにサイ
ドのカテゴリリストから「それらしいカテゴリ」を探し、いちいちツリーを辿っ
て商品の発見に勤める必要がある)

はまだ



mklist.php
-------------------------------------------------------

<?php

require('includes/application_top.php');

//スクリプトと同じパスにあるlist.htmlを開く
$fp=fopen("list.html","w")  or die("ファイルのオープンに失敗しました");
flock($fp,2);

fwrite($fp,"<!doctype html public \"-//W3C//DTD HTML 4.01 Transitional//EN\">" ."\n");
fwrite($fp,"<html " . HTML_PARAMS . ">" ."\n");
fwrite($fp,"<head>" ."\n");
fwrite($fp,"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=" . CHARSET . "\">" ."\n");
fwrite($fp,"<META NAME=\"ROBOTS\" CONTENT=\"NOARCHIVE\">" ."\n");
fwrite($fp,"<style TYPE=\"text/css\">" ."\n");
fwrite($fp,"<!--" ."\n");
fwrite($fp,"BODY    {  color: #444455;}" ."\n");
fwrite($fp,"a:hover {  color: #FF0000;" ."\n");
fwrite($fp,"         text-decoration: underline;}" ."\n");
fwrite($fp,"a:link  {  color: #3333ff;" ."\n");
fwrite($fp,"         text-decoration: none;}" ."\n");
fwrite($fp,"-->" ."\n");
fwrite($fp,"</style>" ."\n");
fwrite($fp,"<title>" . TITLE . " 全商品一覧</title>" ."\n");
fwrite($fp,"</head>" ."\n");
fwrite($fp,"" ."\n");
fwrite($fp,"<body leftmargin=\"0\" topmargin=\"0\" marginwidth=\"0\" marginheight=\"0\">" ."\n");
fwrite($fp,"" ."\n");

//更新日付を出力。ついでに戻り先(top)として定義
$today = getdate(); 
$month = $today['month']; 
$mday = $today['mday']; 
$year = $today['year']; 

$redundancy = "◆";
//重複商品に付ける接頭記号

fwrite($fp,"<A name=\"top\">$month $mday, $year</a><br>" ."\n");
fwrite($fp,"品名の先頭に" . $redundancy . "のついた商品は複数カテゴリーに(重複)登録されている商品です<br>" ."\n");

//ここから表作成。leftmargin="0"なので<blockquote>ではさむ
fwrite($fp,"<BLOCKQUOTE>" ."\n");

$db = tep_db_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD);

$result = tep_db_query("SELECT manufacturers_id, manufacturers_name FROM manufacturers ORDER BY manufacturers_name");

while ($myrow = tep_db_fetch_array($result)) {

/*
$myrow[0]	manufacturers_id
$myrow[1]	manufacturers_name
*/

$products = tep_db_query("SELECT p.products_id,  d.products_name, p.products_model, t.categories_id, c.categories_name, p.products_status, k.status FROM products p, products_description d, products_to_categories t, categories_description c, categories k WHERE p.manufacturers_id=$myrow[0] and p.products_id=d.products_id and p.products_id=t.products_id and t.categories_id=c.categories_id and t.categories_id=k.categories_id ORDER BY c.categories_name , p.products_model");

$num_prod = tep_db_num_rows($products);   //メーカー毎の商品数

//表の色設定
$bgcolor = "#fafaff";
$bdcolor = "#bbbbbb";
$thcolor = "#eeeeee";

fwrite($fp,"<a href=default.php/manufacturers_id/$myrow[0]><b>$myrow[1]</b></a> [$num_prod]<br>" ."\n");

fwrite($fp,"<table bgcolor=\"" . $bgcolor . "\" border=\"1\" cellspacing=\"0\" cellpadding=\"1\" bordercolor=\"" . $bdcolor . "\">" ."\n");
fwrite($fp,"<tr><img height=\"1\" width=\"640\" src=\"images/pixel_trans.gif\"></tr>" ."\n");
fwrite($fp,"<tr bgcolor=\"" . $thcolor . "\"><th>品名</th><th>品番</th><th>カテゴリー</th></tr>" ."\n");

//ここから表の中身作成
while ($prod = tep_db_fetch_array($products)) {

/*
products p
products_description d
products_to_categories t
categories_description c
categories k 

$prod[0]	p.products_id
$prod[1]	d.products_name
$prod[2]	p.products_model
$prod[3]	t.categories_id
$prod[4]	c.categories_name
$prod[5]	p.products_status
$prod[6]	k.status
*/

$p_path = tep_get_product_path($prod[0]);
//製品のカテゴリーパス。重複登録されてるとnullが返る

if ($prod[6] == 0)		//カテゴリーがオフ(商品は自動的にオフ)

fwrite($fp,"<tr><td>$prod[1]</td><td>$prod[2]</td><td>$prod[4]</a></td></tr>" ."\n");

elseif ($prod[5] == 0)		//商品がオフ。カテゴリーはオン

	if ($p_path == "")		//かつ重複登録商品

	fwrite($fp,"<tr><td>$redundancy$prod[1]</td><td>$prod[2]</td><td><a href=\"default.php/cPath/$prod[3]\">$prod[4]</a></td></tr>" ."\n");

	else				//重複登録商品ではない

	fwrite($fp,"<tr><td>$prod[1]</td><td>$prod[2]</td><td><a href=\"default.php/cPath/$p_path\">$prod[4]</a></td></tr>" ."\n");

elseif ($p_path == "")		//重複登録商品はパスが取れない→単純パスで出力

fwrite($fp,"<tr><td>$redundancy<a href=\"product_info.php/products_id/$prod[0]\">$prod[1]</a></td><td>$prod[2]</td><td><a href=\"default.php/cPath/$prod[3]\">$prod[4]</a></td></tr>" ."\n");

else				//それ以外。全部出力

fwrite($fp,"<tr><td><a href=\"product_info.php/cPath/$p_path/products_id/$prod[0]\">$prod[1]</a></td><td>$prod[2]</td><td><a href=\"default.php/cPath/$p_path\">$prod[4]</a></td></tr>" ."\n");

}

fwrite($fp,"</table>" ."\n");
fwrite($fp,"<A href=\"#top\">ページの先頭に戻る</A><br><br>" ."\n");
fwrite($fp,"" ."\n");

}

fwrite($fp,"" ."\n");

fwrite($fp,"</BLOCKQUOTE>" ."\n");

fwrite($fp," 商品の入荷状況等により、予告なく販売を停止したり価格を改定する場合が有ります。" ."\n");
fwrite($fp,"<br>" ."\n");
fwrite($fp,"</body>" ."\n");
fwrite($fp,"</html>" ."\n");

flock($fp,3);
fclose($fp);

echo("Update works Completed!");

?>







Tep-j-general メーリングリストの案内
Back to archive index