PEAR Cache_Lite覚書

公開されているAPIデータから得られたデータからHTMLページを作成する時、表示を早くしてくれるのが、PEARの Cache_Liteです。
Cache_Liteにはいろいろな使い方があるようですが、ひとつは取得したデータをキャッシュして保存しておく方法。もうひとつは取得したデータからHTMLページとなったものをキャッシュとして保存しておく方法。覚書として。
1、ひとつは取得したデータをキャッシュに保存
APIのリクエストurlを$reqとする。

require_once('Cache/Lite.php');
//キャッシュIDのセット
$cache_id ='[リクエストパラメーターなど]';
$cacheOptions = array(
'cacheDir' => dirname(__FILE__).'/cached/',
'lifeTime' => 24*3600,
//デバッグ時は0に
);
$objCache = new Cache_Lite($cacheOptions);
if ($cache = $objCache->get($cache_id)) {
    $PHP_DATA = $cache;
}
else{
    $huubuff = file_get_contents($req);
$PHP_DATA = unserialize($huubuff);
//APIデータがPHP形式の場合
 $objCache->save($PHP_DATA,$cache_id);
}

2、書き出したHTMLをキャッシュで保存

require_once('Cache/Lite.php');
$options = array(
       'cacheDir' => dirname(__FILE__).'/cached/',
       'lifeTime' => 24*3600,
);
$cache_lite = new Cache_Lite($options);
$cached_data = $cache_lite->get($cache_id);
$cache_id = '[リクエストパラメーターなど]';
$cached_data = $cache_lite->get($cache_id);
if ($cached_data) {
      echo $cached_data;    
} else {
//リクエストURLからAPIデータ取得して処理
$XML_DATA = simplexml_load_file($req);
//この場合XML形式のデータ処理
//データ処理HTML書き出しの前に
ob_start();//スタート
//----略-----
$hu_text = ob_get_contents();
ob_end_flush();//書き出し終了
$cache_lite->save($hu_text, $cache_id);
}

Yomi-Search メモ Yomi-SearchのDBクラスを利用して特定のカテゴリを表示

忘れないための備忘録として

ローカル環境で試すため、あらかじめclass>db.phpにローカルのデータベース設定。Yomi-Searchの中でテンプレート無しで実行できるsitemap.phpを利用。
sitemap2.phpとかで保存。
function_reg.phpの内容を確認する場合もあるので
// インクルードの設定に

require './functions_reg.php';

も加えておく。
カテゴリpath 「50/01/」のタイトルを表示したい時、sitemap2.phpに

$Cate_key = "50/01/";

$query = "SELECT title,path, regist FROM {$db->db_pre}category WHERE path='{$Cate_key}'";

		$row = $db->single_assoc($query);
		$Cate_title= $row['title'];
echo $Cate_title;

とするとカテゴリpath「50/01/」のタイトルが表示される。
カテゴリ登録関係の仕組みを変えたかったので試してみました。


Yomi-search お薦めサイトと相互リンクをRSS化 メモ

忘れないためのメモです。
お薦めサイトとか相互リンクはYomi-searchのデータベースの「テーブル: yomi_log」の「mark」という項目に’1_0_0_0_0_0_0_0_0_0′というように登録されている。相互リンクは’0_1_0_0_0_0_0_0_0_0′となり、両方の場合は’1_1_0_0_0_0_0_0_0_0′となる。

Yomi-SearchのYomi-Search(PHP)modifiedにはRSSディレレクトリにrss.phpがあるのでそれを利用。

rss.phpの新着サイト、更新サイトは「テーブル: yomi_log」の「stamp」を読み込んで判定しているのでそれを「mark」に変えてピックアップ。
rss.phpの65行辺りにある

// 各モードへ分岐
//================
if (@$_GET['mode'] == 'new') {

	// 新着サイト
	//============
	$title = $cfg['search_name'] . ' (新着サイト一覧)';
	$sql = ' WHERE stamp > ' . $ntime . ' AND renew != 1 ORDER BY id DESC';
	$description = '新しく登録されたサイトの一覧です。';

} elseif(@$_GET['mode'] == 'update') {

	// 更新サイト
	//============
	$title = $cfg['search_name'] . ' (更新サイト一覧)';
	$sql = ' WHERE stamp > ' . $ntime . ' AND renew = 1 ORDER BY stamp DESC';
	$description = '登録内容が更新されたサイトの一覧です。';

} else {

	// 引数が不正な場合は処理を中断
	//==============================
	echo '引数が不正です。処理を中止します。';
	exit;

}

のところを、次のように変更。
出力する条件として、ランダムに10件選んで表示とした。

if (@$_GET['mode'] == 'm1') {

	// おすすめサイト
	//============
	$title = $cfg['search_name'] . ' (おすすめサイトピックアップ)';
	$sql = " WHERE mark LIKE '1___0_0_0_0_0_0_0_0' order by rand() limit 10";
	$description = 'おすすめサイトのピックアップです。';
} elseif(@$_GET['mode'] == 'm2') {

	// 相互リンク
	//============
		$title = $cfg['search_name'] . ' (相互リンクサイトピックアップ)';
	$sql = " WHERE mark LIKE '__1_0_0_0_0_0_0_0_0' order by rand() limit 10";
	$description = '相互リンクサイトのピックアップです。';

} else {

	// 引数が不正な場合は処理を中断
	//==============================
	echo '引数が不正です。処理を中止します。';
	exit;
}

のように変えて別名で保存。
特殊マークをつけた場合はマークの0をアンダースコア_に変える。


Yomi-searchにwordpressデザインと関数を呼び込む (覚書)

今まで気になっていてなかなかできていなかったYomi-searchのデザイン変更。
Yomi-searchのtemplateファイルは、拡張子htmlなんだけど実はphpファイルということを確認してから、3カラムのCSSを使ったデザインに変更していました。
ローカル環境でテストしてうまくいったのですが、今度はどうせ変えるなら、ブログで使っているwordpressのデザインをYomi-searchのデザインに使えないかと思いさらに試行錯誤。

1、まず、wordpressには、外部PHPからWordPress関数を利用する方法がある。
 「http://emylo0.com/」さんのサイトの2011/12/09 の記事に書いてあったのでローカル環境で試してみた。
wordpress以外のphpファイルに

require('/[wordpressをインストールしたディレクトリー]/wp-blog-header.php');

とすると、wordpressの関数が実行できる。
2、wordpressのテーマを決めて、yomisearch用のheadrファイル、side-bar-rightファイル、footerファイルを作成しそれぞれheader-yomi.php,sidebar-right-yomi.php,footer-yomi.phpを作成する。leftメニューは、wordpressとのメニューと共通にするのでデフォルトで使うことにする。
3、yomi-serchのテンプレートファイルをヘッダー、左サイド、本文、右サイド、フッターに分けて
作成。元のファイルは残しておいてエラーが出た時の復旧に使う。
4、top.htmlは次のような構成になる。

<?php
get_header(yomi);
   get_sidebar();
?>
<div id="content">
本文
<div>
<?php
get_template_part('sidebar-right_yomi');
get_footer(yomi);
?>

5、これでとりあえずtop.htmlとcategory.htmlを組み替えて実験してみた。
6、データベースエラー。wordpressのデータベース内にありませんというエラー。
7、調べると、データベースの競合から起きるエラー。本文のデータベースを呼び出す部分では、

mysql_connect("[yomi-searchデータベース名]", "[ユーザー名]", "[パスワード]") or die("DB接続エラー");
mysql_select_db("[yomi-searchデータベース名]") or die("DB接続エラー");

として、Yomi-searchのデータベースに接続する必要がある。
8、右サイドからもう一度wordpressの環境を取り入れるので再度wp-blog-header.phpを記述。

<?php
require('/[wordpressをインストールしたディレクトリー]/wp-blog-header.php');
get_template_part('sidebar-right_yomi');
get_footer(yomi);
?>

9、外部ファイルなので、wordpress内でプラグインを導入しないと使えないphpコードが本文に使用できる。


yomi-search php版 メモ

Yomi-search php版をこのサイトに導入したものの時間がなくあまり手がかけられなかったのですが、最近少し時間が出来たので色々と試行錯誤しています。
Yomi-search php版も、CGI版と同じくtemplateファイルを利用する。
しかし、CGI版と違うところは、templateファイルが拡張子htmlなのに中身はphpファイルというところです。したがって、Yomi-search php版のtemplateファイルはパーツに分けてインクルードが効くことが試してみて分かりました。周知のことだったのかも知れませんが私にとっては大発見。
まず基本になるcssのデザインを決め、2カラムの場合だと、共通になりうるheader.phpと左サイドにleft_side.php、下部にfooter.phpを作り、各templateファイルの本文をその間に記入することでyomi-serchの出力結果がブログ風になります。
top.htmlのヘッダー部分header.phpをtemplateデレクトリにpartsホルダーを作って置いた場合は次のようなインクルードです。yomi.phpからtemplateファイルを読み込むように設定すればいいようです。

[php]
<?php "template/parts/header.php"); ?>
[/php]


yomi-searchのカテゴリーを他のディレクトリーに表示-メモ2

その2
2、yomi-searchのスクリプトを活用してデータベースを読み出して表示

Mysqlを利用することに変わりはないけどせっかくのyomi-search phpのプログラムを活用するほうが合理的。
最初、うまく行かなかったから1の方法を試したのだけれど。
まず参考になったのがhoge256さんの
PHP の include, require で相対パスを指定して読み込む場合のメモ」という記事。
以下引用
この問題は、実行ファイルのディレクトリではなく、参照しているファイルのディレクトリを基にパスを取得することで回避することができます。具体的には dirname(__FILE__) を使って次のように書きます。

www/func/function.php ファイル

1
2
 
include(dirname(__FILE__) . &quot;/../class/class.php&quot;);

これで、問題無く実行されたかと思います。

__FILE__ は PHP の定数で、現在参照中のファイルのフルパスとファイル名を表します。dirname はパス中のディレクトリを取得する関数です。なお、dirname の結果は最後に / が付かないので、上記の例のように / を付け忘れないようにしましょう。

引用終わり

とあります。

そこで唯一templateを通じて結果を書き出していないsitemap.phpをyomi-searchの上部のルートデレクトリーにコピーして

1
2
3
4
// インクルード
require 'class/db.php';
require 'functions.php';
require 'ads.php';

1
2
3
4
// インクルード
require dirname(__FILE__).'/yomi/class/db.php';
require dirname(__FILE__).'/yomi/functions.php';
require dirname(__FILE__).'/yomi/ads.php';

に変更。
これでルートディレクトリーからyomiディレクトリのインクルードファイルを読み込んで、mysqlを通じてサイトマップが表示されます。
長い間できないと思って放置していたのですがよかったです。
また、総登録数は、sitemap.phpの
// textテーブルから設定情報を配列($text)へ読込
の後ろくらいに

$total_num = $db-&gt;log_count($db-&gt;db_pre.'log');

を加えると取得できました。
ちなみにローカルのxamppの環境でもこの方法は有効です。もっと早く理解していれば無駄な時間を使わずにすんだかもしれません。hoge256さんの記事は2007年8月のものでした。すばらしい情報に感謝です。


yomi-searchのカテゴリーを他のディレクトリーに表示-メモ1

今更ですが、最近yomi-search php版でいろいろ試しています。
その第一がyomi-searchのカテゴリーを他のディレクトリーに表示させるというものです。
考え方としては、
1、mysqlのデータベースをphpで読み出して表示
2、yomi-searchのスクリプトを活用してデータベースを読み出して表示

今回は1のメモ

表示のサンプルになるのが
sitemap.phpかtemplateディレクトリーにあるtop.htmlの81行目あたりの// 最上層カテゴリからのコード。
1の場合、

<div>
$mysql_con = mysql_connect("localhost","[ユーザ名]","[PASSWORD]") or die("error");
mysql_query("SET NAMES utf8",$mysql_con);//ローカルの環境で文字化けになったので
mysql_select_db("yomi");//MySQLのデータベース名
$sql= "SELECT * FROM yomi_category";
$select_db = mysql_query($sql,$mysql_con);
while($row = mysql_fetch_array($select_db)){
$rowset[]=$row;
}
</div>

rowsetの配列はyomi_categoryテーブルをつぎのように格納している。
[0] => Array
(
[0] => 1
[id] => 1
[1] => ホームページ作成
[title] => ホームページ作成
[2] => 0
[up_id] => 0
[3] => 01/
[path] => 01/
[4] => 1
[top_list] => 1
[5] => 1
[etc_list] => 1
[6] =>
[regist] =>
[7] =>
[reffer] =>
[8] => ほーむぺーじさくせい
[sort_name] => ほーむぺーじさくせい
[9] => ホームページ作成に関するサイト
[comment] => ホームページ作成に関するサイト
)
ここまでくればあとは配列を活用して表示する。


XML_Unserializerについて

PHP5になったのでPEARのXML_Unserializerを使用しなくてもAPIに対応できそうですが、今までPHP4の時に使用していたので修正する時間もないので継続して使用しています。

ところであるAPIが文字コードshift_jisで出力されているようでXML_Unserializerで文字化けとなりました。

そこで以前、経験したようにXML_Unserializerのオプションを使用してコードをUTF-8に変換するとUTF-8でAPIを配列に出力してくれます。
require_once "XML/Unserializer.php";
$xml_data = file_get_contents(’リクエストURL’);
$parser = new XML_Unserializer(array('parseAttributes' => true,'targetEncoding' => 'UTF-8'));
$parser->unserialize($xml_data);
$XML = $parser->getUnserializedData();

これで後は配列$XMLから取り出した変数をHTMLに書き出せばいいのです。
対象のHTMLはshift_jisなので配列$XMLの出力をUTF-8からshift_jisに変更しなくてはいけません。

mb_convert_encodingはひとつの文字列ごとの変換でのでコードが煩雑になるなと思って配列$XMLを一括してshift_jisに変更する方法はないかと探したら

mb_convert_variables
がありました。PHP関数リファレンスによると
「エンコーディング from_encoding の変数 vars をエンコーディング to_encoding に変換します。 」
「vars(3番目以降の引数)は、変換する変数への リファレンスです。文字列、配列、オブジェクトを指定することが可能です。 mb_convert_variables() は全てのパラメータが 同じエンコーディングを有することを仮定します。 」
ということで

mb_convert_variables("Shift_Jis", "UTF-8", $XML);

とすることで配列$XMLが一括でShift-Jisに変換。


サーバー移動完了

サーバーをPHP5対応に移動しました。
しかし、サイトのすべてにチェックがいき届いていません。

PEARのインストールからPHP5.1から5.2へのアップグレードまでサーバー自体の設定を試行錯誤しながらやってきましたのでそちらに手がかかりすぎたようです。

これから時間をみつけては手直しを行って行きたいとおもいます。

yomiサーチも設置変更しましたが、設定で管理者の許可で登録するはずが、すぐに登録できるようになっていました。現在は設定を直しましたが、9月初旬の登録のうち、申し訳ありませんがサイトの趣旨に合わないので岡山に関係のないものは削除させていただきます。


サーバー変更の準備

サーバーの変更を予定しています。

現在のサーバーはPHP4での動作ができますが、PHP5は動きません。

PHP4は既にサポートサービスも終了し、順次PHP5への移行をしなければなりません。

しかし、このサーバーはPHP5へのバージョンアップは対応できないのです。

やむをえず別の会社のサーバーを探しています。

動きの悪くなったパソコンをWINDOWS7 64ビット搭載のパソコンを購入してメインのパソコンにし、サーバー移行の準備を進めています。

まずはローカルの環境をということで、使い慣れた「AN HTTPD」を導入使用と思いましたが現状では64ビットには対応していませんでした。

そこでXAMPPの最新バージョン1.7.3をインストール。

参考にしたのは

XAMPP をWindows 7 RC 64-bit に導入

[XAMPP]WinXP ローカル環境で複数ドメイン管理

のふたつのブログ。おふたりに感謝します。

ところで、XAMPPの以前のバージョンではPHP4とPHP5の二つが入っていて切り替えできるようになっていましたが、バージョン1.7.3ではPHP5のみです。それでも作成済みのものをローカル環境で実行してみましたがエラーだらけ。

その原因を探しているうちにある事実に気がつきました。

XAMPPの1.7.3はデフォルトでPHPのショートタグを実行できない設定になっている!

<?= $test ?>とか<? echo $test; ?>ではだめで

<?php echo $test; ?>

のような記述でないとだめだということです。

PHPプロのショー トタグ形式によると「XMLとの衝突を避けるために、今では<?phpで始まることが推奨されている。」ということでした。

PHP.iniを変更することで対応は出来そうですがこの際すべて正規の記述にへんこうすることにしました。