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に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コードが本文に使用できる。


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に変換。


PEARのアップグレイド

PEARをインストールしたのが2007年でしたがそれからヴァージョンアップされていました。
AmazonWEBサービスが2009年8月から変更になったのですが、対処のための時間がとれずそのままになっていました。調べるとPHPのバージョンがPHP5でないと難しいようで、PHP4だとPEARのServices/Amazon.phpをつかうとできる?ようなことが書かれてあったのでそれをPEARのHPからまず、ローカルな環境にてダウンロード(アップグレイド)しようと思い試してみました。
すると悲しいかなPEARのInstallerのバージョンが古すぎてダウンロードできない。PEAR自体をアップグレードしようにもやはりInstallerのバージョンがふるいようでできません。
—-
WARNING: channel “pear.php.net” has updated its protocols,use “channel-update p
ear.php.net” to update
pear/Archive_Tar requires PEAR Installer (version >= 1.5.4),installed version i
s 1.5.1
———
最初に出たWARNINGについては
pear channel-update pear.php.net
としてOKでしたがInstallerの方はどうもよく分かりませんでした。
そこで「PEAR 強制 アップグレード」などと検索して、–force か-f を加えてやるといいとあったので実行。
PEARはアップグレイドできました。その後Services/Amazon.phpもアップグレイドしてAmazonWEBサービスを試してみましたがPHP4ではやはり難しいようです。hashに関係するエラーメッセージがでてきてつながりません。

サーバーを変えなければ駄目か!


PEARが働かない?

最近PEARを使ったプログラムが時々働いていません。

API関係はすべてPEARを使っているので全滅です。

サーバーの負荷の問題?

原因は不明ですが、調子が悪いです。

対策として、PHP4でも使えそうな

http://keithdevens.com/software/phpxml

のPHP XML Libraryを使ってみようと思います。


PHPでPDFファイルを作れるTCPDF

PHPを利用してPDFファイルが作れるTCPDFを使ってみました。
他にもFPDFという無料のライブラリがあるそうですが、TCPDFはそれをさらに発展させた無料のライブラリです。
現在のバージョンは、4.0.030 です。特徴は、

  • PHP4とPHP5に対応
  • 日本語が使える(但し、エンコードUTF-8でファイル保存する必要有り)
  • HTMLのタグが使用可能(但し、制限有り、また< br /><img src=”" />のようにタグの終わりの区切りが必要)
  • テーブルタグは使用可能だが文字数が多いとタイムエラーになる。またボーダーの色は指定できないようです)
  • マルチセル関数を使ってタイトル、本文を自由に配置できる
  • イメージ関数を使って、イメージ画像を自由に配置できる
  • 配置の位置決めはミリ単位でできる。(tcpdf_config.phpでpt,mm,cmをいづれか指定できる)
  • ライン関数を使って縦横斜めに線が色と太さと形状を変えて指定できる
  • グラフィック関数もあるので、角丸の長方形をマルチセルにかぶせて体裁を整えることが出来る
  • 文字の大きさ、色はマルチセル単位で変更できる
  • などですが、CSVのようなデータファイルを元に動的にPDFを作成することが可能です。

    日本語での情報は、チーターエンジニア(TCPDFドキュメント)が最新情報に適応しています。

    チータ-エンジニアさんに感謝いたします。


    CGIでセットしたクッキーがPHPで読める?

    CGIで作られた会員用プログラムはクッキーがセットしてあるのですが、そのクッキーを利用してPHPで追加のプログラムを作ってみようかと思いました。

    そこで、クッキーを学んだことのない私には、CGIでセットしたクッキーがPHPで読める?ということがなかなか分からず苦労しました。

    原因は、クッキーが作成されたディレクトリの配下でしか読めないという基本的なことに気づくのが遅れたためです。

    Aというディレクトリで作成されたCGIのクッキー(名前を仮にcokkiename)をPHPのテストプログラムで上位のルートから読み込もうと無駄なことをしていました。Aディレクトリにテスト用のPHPのプログラム「echo $_COKKIE['cokkiename'];」をおいて実行。

    結論は、CGIでセットしたクッキーがPHPで読めました。でももう少し基礎から勉強しておけばすぐ分かったことですね。


    includeとパス <メモとして>

    PHPでプログラムを書く時、includeでファイルを読み込むことは欠かせません。しかし、相対パスで記入していると、あるカレントディレクトリのデータファイルを読み込んで処理するプログラムをそのカレントディレクターに作った場合、それを上位のディレクトリで実行すると、ファイルがありませんというPHPエラーとなります。

    それを解消するには、データファイルをフルパスで読み込む必要があります。しかし、通常、ローカルの環境で試行してサーバーにアップするので、ローカルの場合は、「http://localhost/・・・」、サーバーの場合は「http://www.ドメイン名/・・・」というふうに切り替えなければなりません。

    いちいちローカルで試した後、書き換えてアップしてもいいのですがこういう作業はミスを招きます。

    そこで、PHPでは、実行するファイルの絶対パスを表示してくれる関数がありますのでそれを利用することにします。

    使うのは、dirname()と__FILE__という関数と定数で、dirname(__FILE__)とすれば、現在のファイルの絶対パスが得られます。例えば、aaa.phpというファイルに、print dirname(__FILE__);という行を加えると、”var/HTML/abcdefg.com/web/aaa.phpのように絶対パスが表示されます。この文字のうち、ローカルのディレクトリ名に使っていない文字を抜き出してくる関数を使用します。strstrという関数は指定した部分文字があれば、その文字以降を抜き出しますが、なければFALSEを返します。したがって、if文でFALSEでなければ「http://www.abcdefg.com/ 」を、FALSEなら、「http://localhost/ 」をカレントデレクトリ/データファイルに加えれば

    いいということになります。

    ドメイン名:abcdefg.com
    データファイル名:data.csv
    データファイルのカレントディレクトリ:data
    実行するファイル:ルートディレクトリのtest.php

    と仮定。

    test.phpに以下の記述を加えます。


    他にもやり方はありそうですがとりあえず覚えとして。


    Yomi-Search(PHP) modifiedへの移行完了

    岡山WEBネットの検索エンジンがCGI版のYomi-SearchからPHP版に移行しました。

    動作確認にはもう少し時間がかかりそうなので、旧来のCGI版も今のところ残してあります。

    但しCGI版からは新規登録はできません。

    動作の最終確認後、ご登録してくださった方にお知らせしようかと思っております。


    Yomi-Search(PHP)modifiedのインストールで得られたもの

    PHPを勉強しているのだから岡山WEBサーチのYomi-SearchもCGI版からPHPに変えようかと思いつき、インストールを試行。
    実は、以前もPHP版に一時的に移行したことがあったのだけれど、バックアップが文字化けとなり断念したことがあったのです。今度は、それから年数もたっていることだし進化したに違いないと思い、テスト的にインストール。
    しかし、不思議なことにインストールしたら英数字以外がすべて??という文字に。データベースの照会順序ががlaten1_swedish_ci になり、yomisearchの管理画面から見ても文字は????のまま。新規登録した文字も英数字以外の日本語は????に変換。おかしいと思いながら、インターネットで検索していると
    XAMPP+Yomi-Search(PHP)modified で 文字化け(PHP+MySQL の文字化け) (masha.webTechLog)というところで
    「データベースとテーブルの文字コード設定が原因 データベースの文字コード(MySQL 接続照会順序)が初期状態「latin1」のままだったことが直接の原因。phpMyAdmin 上で「ALTER DATABASE `DB名` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci」を実行し文字コードを utf8 へと変更。そして Yomi-Search(PHP)modified を再セットアップすると文字化けは解消した。(以上引用)」
    を発見。
    そして、phpMyAdminを見て見ると、「操作」という画面でテーブルごとに文字の照会順序が変更できることにやっと気がつきました。yomi_categoryのテーブルをlaten1_swedish_ci から utf8_unicode_ci に変更すると既に入っているデータは??のままですが新規に入力したり、データベースに修正でカタカナや漢字ををいれると文字化けも無くなりました。
    私が借りているサーバーの問題と思いますが、自分としては、やっと解決したのでほっとしています。
    つぎにインストールした後でいちいちテーブルごとに照会順序を変えたのでは面倒なので、データベースを作成した時に照会順序をutf8にしたらどうなるかと思い、Yomi-Search用にデータベースを作成し、phpMyAdminでそのデータベース名を確認し、操作ボタンで見ると、照会順序が laten1_swedish_ci になっているので をそれを utf8_unicode_ci 変更。そしてセットアップを実行するとすべてのテーブルがutf8_unicode_ciに。文字化けも無くセットアップ完了しました。

    後は、既存データの移動とバックアップがうまくいけばPHP版に移行しようかと思います。