PHP,Rubyでの入出力まわり(文字列、ファイル、ストリーム)

最近、XML、HTMLファイルをあれこれする事が増えてきた気がする。ファイルに書き込んだり、読みこんだりするときの入出力に関するメモ。

PHP

参考。PHP: ファイルシステム関数 – Manual

まずは、fopenや、fsockopenで、ファイルポインタを取得する。

ファイルをすこしずつ読み込んでいく場合は、ファイルポインタから、
fgets(ファイルポインタから1行取得)、
fread(バイナリ・モードでファイルを読み込む)、
fgetcsv(CSV用)、
などを使う。書き込みは、fwriteで。

<?php
$handle = @fopen("/tmp/inputfile.txt", "r");
if ($handle) {
	while (!feof($handle)) {
		$buffer = fgets($handle, 4096);
		echo $buffer;
	}
	fclose($handle);
}
?>

ファイル全体を一度に処理したい場合は、filefile_get_contentsを利用すればいい。

文字列と配列の変換

データが、欲しいときに、欲しい形であるとは、限らない。
配列、文字列、ファイルなどにある情報を適当な形にしたい時。

  • explode文字列を文字列により分割する->配列
  • split正規表現により文字列を分割し、配列に格納する->配列
  • implode配列要素を文字列により連結する->文字列

これらの関数で、配列と文字列が変換できる。

ストリーム

大き目のデータをキャッシュとしてファイルに保存しておいて、あとでも利用するときなど、ファイルを使っていろいろするとき
(ファイルからデータを読み込む場合と、すでに文字列などでデータをもっていてそのまま使いたい場合の両方があるときとか)。

1.ファイルから読み込んだデータを加工して、適当な形(文字列とか)にしてから、処理に回す。

2.文字列を、ポインタを使って、ファイルからデータを読み込む場合と同じ処理にまわす。参考、データ (RFC 2397)

<?php
$TEXT =<<<EOF
data1
data2
data3
EOF;
$handle = fopen("data://text/plain,$TEXT", 'r');
if ($handle) {
	while (!feof($handle)) {
		$buffer = fgets($handle, 4096);
		echo $buffer;
	}
	fclose($handle);
}

?>

PHP 5.1.0 以降なら、
php://memory とか、
php://tempも使えるみたいです。
PHP 入出力ストリーム

Ruby

Fileや、IOクラスを使う。

openや、
File.openで返されるオブジェクトを操作する。

filename = "data.txt"
file = open(filename)
#file = File.open(filename)
text = file.read(file)
print text
file.close

ファイルを一度に読む場合、クラスメソッドを使って

data = File.read("foo.txt")

ともできる。

ファイルを一行ずつ読む場合は、

filename = "data.txt"
file = open(filename)
while text = file.gets do
	print text
end
file.close

のようにする。あるいは、

filename = "data.txt"
open(filename){|io|
	while line = io.gets
	print text
	end
}

のように、closeを省略することもできる。

Ruby メモ

  • HTTPやFTPからファイルを開きたいときは、open-uriを使う。
  • io.readlinesで、ファイルの各行を配列として取得できる。
  • io.eachとeachメソッドが使える
  • 出力は、io.write,io.print,io.printf,io << strなど。
  • io.rewindでファイルポインタを先頭にできる。

配列と文字列

配列->文字列は、joinで。

p ["a", "b", "c"].join(',') #=> "a,b,c"

文字列->配列は、splitscanで。

p "   a \t  b \n  c".split(/\s+/) # => ["", "a", "b", "c"]
p "foobarbazfoobarbaz".scan(/ba./)
# => ["bar", "baz", "bar", "baz"]

%wで、空白で分割して配列を作れる。

p %w(a b c) # => ["a", "b", "c"]

StringIO

StringIOオブジェクトを使うと、文字列のデータを、IOオブジェクトとして扱うことが簡単にできる。

require 'stringio'
str = << EOF
data1
data2
data3
EOF
io =StringIO.new(str)
#io.puts(str)
io.rewind
p io.read

PHP、Perl、RubyでのPath(パス)の通し方、クラスの書き方とか

普段、PHPばかり触っているので、PerlやRubyでライブラリを使いたいと思っても、Path(パス)を設定するだけでも一苦労。各言語で、 Path(パス)を通して、ライブラリーを使ったり、クラス、オブジェクトであれこれするためのメモ。

(参考リンクは、cpan,gemsのインストールとか、クラスの書き方などの雑多なもの。)

PHPでPath(パス)を設定する方法

php.ini

「php.ini」ファイルに、include_path を記述する。区切りは“:”(UNIXで。Windowsだとセミコロンに)。ローカルにPEARを入れたときなどに、書いておく。

include_path = ".:/usr/local/lib/php"

.htaccess

「.htaccess」ファイルに、php_value include_path を記述する。php.iniとおなじく、設置場所がちゃんとしていないと動かない。

php_value include_path ".:/usr/local/lib/php"

phpファイルに直接書き込む

ini_set(),set_include_path(),get_include_path(),get_include_path(),ini_restore()などの関数を使う。

set_include_path('/inc');
ini_set('include_path', '/inc');

PHPの別ファイルや、ライブラリの読み込み方

require(),require_once(),include(),include_once()などの関数を使う。allow_url_fopenの設定が”1″なら、「require(http://~.cgi?q=~);」みたいなことも可能。

require_once('Cache/Lite.php');
include 'vars.php';

ファイルはinclude_pathで指定した所から探す。./を先頭に付けると探し方が変わったりする。

_onceが付いている関数は、一回だけ読み込む。require()とinclude()の違いは、require()だとFatalなエラーがでる所。

参考。PHP: include – Manual

PHP クラスの書き方

php4なら、

class Class
{
	var $var;
	
	//コンストラクタ
	function Class($v)
	{
		$this->var = $v;
	}

	//メソッド
	function foo()
	{
		//~
	}
}

php5だとコンストラクタは、__construct() 。メンバー変数に、
public、private、protectedとアクセス権が指定できる。

オブジェクトの使い方は、

$class = new Class($v);
$class->foo();
Class::foo();
PHP 参考リンク PEARなど

PerlでPath(パス)を設定する方法

use lib ~;

use lib qw(~);

でパスが指定でき、use ~とファイルを読み込めるようになる。

@INC

PATHは、「print join(“\n”,@INC);」で確認できる
(@INCは、PATHが入った配列)。@INCに、パスを追加するときは、

BEGIN {
push(@INC, '/usr/local/sbin');
}

とできる。

PERL5LIB

環境変数「PERL5LIB」をShell の設定ファイルに加えておく。

-Iを付ける

#!/usr/local/bin/perl

を書き換えて、オプションでパスを指定することも可能。

#!/usr/local/bin/perl -I /usr/~

Perlの別ファイルや、ライブラリの読み込み方

require

require "jcode.pl";

のように書いて、外部のパッケージを読み込む。読み込まれるファイルは

package library;
sub sub1 {
	#~
}

return 1;

の形で書いておく。library::sub1();と呼び出して使える。

use

パスの通ったところにある「~.pm」ファイルは、

use Jcode;

のようにして読み込める。「::」で階層を表せる。「Module1::Module2」なら、Module1ディレクトリの中のModule2を表している。モジュールは、

package Module;
use Exporter;
@ISA = (Exporter);
@EXPORT = qw(sub1 sub2);
@EXPORT_OK = qw(sub3);

のように書いておく。使うときは、

use Module;
sub1();
use Module qw(sub3);
sub3();

とする。

Perl クラスの書き方、オブジェクト

オブジェクト指向の基礎 Perl講座を参考にしました。
引数は、shift,@_でとっていく。第1引数はクラス名。

package Class;

sub new{
	my $class = shift;
	my $self = {v1 => 1, v2 => 2};
	return bless $self, $class;
}
sub method{
	my ($self, $v1, $v2) = @_;
	# $self->{v1} ~
}

使い方は、

$obj = new Class;
$obj->method(3, 4);
Perl 参考リンク CPANとか

RubyでPath(パス)を設定する方法

-I オプション

Perlと似ていて、-Iでファイルをロードするパスを追加できる。
-I directory

環境変数

PATHに加えて、RUBYPATH、RUBYLIBなどを設定しておく。
Rubyリファレンスマニュアル – 環境変数

Rubyの別ファイルや、ライブラリの読み込み方

load

$: , $LOAD_PATHにある場所や、絶対パスからファイルを読み込む。

load 'ruby.cgi'
load 'ruby.rb'

Rubyリファレンスマニュアル – 組み込み関数 #load

require

require は拡張子 .rb や .so を自動的に補完する。require はライブラリのロード、load は設定ファイルの読み込みなどに使われる。

require "cgi-lib"

Ruby クラスの書き方、オブジェクト

class RubyClass
	attr_accessor :v
	def initialize(v='')
		@v=v
	end
	def method(v1 ,v2)
		# @v ~
	end
end

使うときは、

require 'rubyclass'
obj = RubyClass.new()
obj.method(1,2)

階層、関係がある場合は、
「require ‘class1/class2’」とか、
「class1::class2.new()」とする。

Ruby 参考リンク gems, Ruby on Rails

JaikuのAPIで投稿をするためのPHP(XML-RPC)メモ。

Twitter系のサービスJaikuのAPIの使い方メモ。Jaiku APIでは、情報の取得については、他のサービスを同じような感じでできるのですが、新規の投稿にはXML-RPCを使うみたい。
必要になったので、PHPでXML-RPCを使うときのメモ。

XML-RPCとは

次のページを参考にした。

どうやら、XML-RPCは、HTTP-POSTリクエストで、XMLをやり取りするもののようです。

PEARのXML_RPCを使えば、クライアント側も、サーバー側も簡単に実装できるみたいなので、まずこれを使いました。

以下、PHPのサンプルスクリプトです。

PEARのXML_RPCライブラリを使う場合

$personal_keyと、$userを正しく入力して、$textに投稿したい文字を入れれば、次のスクリプトでJaikuに投稿できます。


<?php
require_once 'XML/RPC.php';
define('JAIKU_SERVER', 'api.jaiku.com');
define('JAIKU_PATH', '/xmlrpc');

$text="Test テスト";
$personal_key="personal_key";
$user="user";

$params = array(new XML_RPC_Value(array(
//"generated" => new XML_RPC_Value(false, 'boolean'),
//"icon" => new XML_RPC_Value(300, 'int'),
//"location" => new XML_RPC_Value('', 'string'),
"message" => new XML_RPC_Value($text, 'string'), 
"personal_key" => new XML_RPC_Value($personal_key, 'string'),
"user" => new XML_RPC_Value($user, 'string'),
),'struct'),);

$msg=new XML_RPC_Message('presence.send',$params);
//print $msg->serialize();
$client=new XML_RPC_Client(JAIKU_PATH,JAIKU_SERVER);

$response=$client->send($msg);
if(!$response->faultCode()){
	print "ok";
}else{
	print $msg->serialize();
	print '<br />Fault Code:' . $response->faultCode() ;
	print '<br />Fault Reason:' . $response->faultString();
}

?>

XML_RPC_Value()や、XML_RPC_Message()で、Jaikuのサーバー側に送るXMLを組み立てています。
実際の中身は、serialize()で見ることができます。

serialize()で送信するXMLを見ると、


<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>presence.send</methodName>
<params>
<param>
<value><struct>
<member><name>message</name>
<value><string>Test テスト</string></value>
</member>
<member><name>personal_key</name>
<value><string>personal_key</string></value>
</member>
<member><name>user</name>
<value><string>user</string></value>
</member>
</struct></value>
</param>
</params>
</methodCall>

のようになっているはずです。

後は、XML_RPC_Client()で、上のXMLをsend()すれば、
Jaikuに新しい記事がポストされます。

(日本語が文字化けして、なかなか、ちゃんと表示されなかった。
php.iniとか,.htaccessも見たけれども、よくわからない。
XML_RPCを新しく入れて、php.iniのinclude_path=”~”の順番を変えたら、
なんとか動くようになった。XML_RPCのバージョンが古いとうまくいかないのかも。)

PEARのXML_RPCライブラリを使わない場合

XML_RPCを使わないで、何とかする場合。
前回のDrupalのJaikuモジュール
の中身とほとんど同じです。モジュールの方では、drupal_http_request()を使いましたが、
下のサンプルでは、
PEARのHTTP_Request()を使いました。

ここでは、ヒアドキュメントで、送信するXMLを組み立てています。


<?php
require_once "HTTP/Request.php";
$req =& new HTTP_Request();

$text="Test テスト";
$personal_key="personal_key";
$user="user";
$RequestURL="http://api.jaiku.com/xmlrpc";

$data = <<< CALL_DATA
<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>presence.send</methodName>
<params>
<param>
<value><struct>
<member><name>message</name>
<value><string>$text</string></value>
</member>
<member><name>personal_key</name>
<value><string>$personal_key</string></value>
</member>
<member><name>user</name>
<value><string>$user</string></value>
</member>
</struct></value>
</param>
</params>
</methodCall>
CALL_DATA;

$req->setURL($RequestURL);
$req->setMethod(HTTP_REQUEST_METHOD_POST);
$req->addHeader('Content-Type' ,'text/xml; charset=UTF-8');
$req->addRawPostData($data);

$response = $req->sendRequest();
if (!PEAR::isError($response)) {
	print $req->getResponseBody();
	print_r($req->getResponseHeader());
}else{
	print $response->getMessage();
}

?>

$req->addRawPostData($data, false)で、urlencode()が効くようにもできるのですが、これを
使うと、うまくいかない。

あとは、ブログの記事が、新規投稿か、過去記事更新かを区別できる部分があれば、
これでJaikuとブログの両方にポストできる。

Drupalでは、
jaiku_nodeapi(&$node, $op)の$opに、’insert’とか、’update’が渡されるので、
これを使えばいいらしい。

HTMLをスクレイピングして解析(パース)する

HTMLをスクレイピング(scraping)してあれこれとするとき、僕はずっと正規表現に頼っていたのですが、
ページの構造が変化するとすぐに使えなくなってしまうし、時間がかかる割りに退屈な作業なので何とかならないかなと思っていました。

PHPで探していたのですが、XML(とかRSS)をパースする関数やライブラリは、良く目にするものの、HTMLを処理できるものはなかなか見つかりませんでした。以下は、PHP(とかRuby、Perl)でHTMLをスクレイピングしたりパースするための方法。(追記 2007/5/21)。

PHPでスクレイピング&パース

HTMLを整形式のXML文書に修正するPHPクラス

HTMLを、整形式のXMLに変換してくれるライブラリ。PEARのXML_HTMLSax3が同梱されているので、これだけでちゃんと動きます。いんちきなHTMLとか、XHTMLが整形式のXMLになるので、後は通常のXMLと同じように処理できる。

動作は、サンプルの「sample.php」ですぐに確認可。「$target = ~」で対象ファイルと、文字コードを指定し、「$output_xml = true;」でXMLファイルになる。とても便利!

rhacoのSimpleTagを試してみました

rhaco.org(らこ。PHPのWebアプリケーションフレームワーク)のSimpleTagを使うとPHPでHTMLを簡単にparseできる。使い方もシンプルです。(参考:[rhaco]SimpleTag

rhacoは、本当にいろんなことができるっぽい。ただ、ドキュメントが見当たらない?みたいなのでなかなか内容が掴めない。
テンプレートtemplate(rhaco)エンジンとかも使える。

Snoopy

スヌーピーはウェブブラウザをシミュレートするPHPのクラス。リンク(aタグ)を抜き出したり、submitして、getしたりできる。
そういえば、前に使ったMagpie RSSも中でSnoopyを使っているみたい。

PHPその他

PHP以外の他の言語の方が、この手のスクレイピング、パース(parse)周りは豊富かもしれない。
僕は、PHP以外、ほとんど使えないのですが一応メモ。

Rubyでスクレイピング&パース

「WWW::Mechanizeとか」、 「htree」、「Hpricot」とかいろいろある。
サーバーにはRubyもインストールされているようなので、初めてだけど、
VikiWiki – htreeを参考に、
“htree”あたりを使ってみたらちゃんと動いた。

こういうのをみると、Rubyもいいなって思う。

RubyでWebサイトを解析するときに強い味方となるライブラリ、HpricotとWWW::Mechanize

Perlでスクレイピング&パース

WWW::MechanizeはRubyとかに移植されているが、元は
Perlで書かれていたものだったらしい。

他にも、PerlにはWeb::Scraperというモジュールがあるようです(追記 2007/5/21)。これは使いやすそうですね。

スクレイピングとか他の雑メモ

Spidering スパイダ 参考書

Spidering hacks―ウェブ情報ラクラク取得テクニック101選
Spidering hacks―ウェブ情報ラクラク取得テクニック101選
Perl中心だけど、かなりおもしろい。Hack#84にPHPのサンプルコードも一応ある。紹介されているコードが日本のサイトに合わせてあったり(国立国会図書館、Yahoo!JAPANのサイトなど)、日本語処理にかんするパートもちゃんと載っている。ページ数500ぐらいでちょっと厚めかな。

更新2007/7/10 PHPその他のリンクに追加

JSONとPHPのメモ

JSONとは

JSON(JavaScript Object Notation)は、テキスト形式のデータ交換フォーマット。
表記が、ほとんどJavaScriptと同じで、JavaScriptからだと簡単にデータが扱えるようになっている。

他の言語(PHPなど)で、JSON形式のデータを使う場合、
適当なライブラリを使って、データを変数に変換して置くと便利。
Jsphonや、PEARのJSONなどは使いやすい。

omar kilani – projects – php-jsonは、
PHP用のエクステンションで、make インストールが必要。

PearのServices_JSONのインストール・使用

Services_JSON
の右下のリンクから、PEAR package file (.tgz)をダウンロードし、解凍。
適当なサーバー・デイレクトリーにJSON.phpをアップロードしてから、次のようにして使う。


require_once('Services/JSON.php');
$json = new Services_JSON();
$obj = array(
	'id'   => array('foo', 'bar', array('aa' => 'bb')),
	'foobar' => $string,
	'a'   => 123 ,
	'b'   => true
);
$js = $json->encode($obj);
echo $js;
print "<hr />";
$obj = $json->decode($js);
print_r($obj);

$json->encode($obj)で、配列->JSON。
$json->decodeで、JSON->配列と変換される。

Web ad Fortune(占いのデータを取得できるWebAPI)を使ってみようと思い、JSONに関して調べました。以下は、PHPでJSON形式の情報を取り扱うためのライブラリなどのメモ。

Jsphon JSON in PHPのインストール・利用

Jsphonをダウンロードし、解凍。
中身を適当なデイレクトリーにアップロードして、次のようにして使う(PHP4の場合)。


require_once('Jsphon.php');
$value = array('foo', 'bar', array('hoge' => array(1,2)));
$json = Jsphon::encode($value);
echo $json;
print "<hr />";
$var = Jsphon::decode($json);
print_r($var);

Jsphon::encodeで、配列->JSON。
Jsphon::decodeで、JSON->配列としている。

リファレンスによると、PEAR_ErrorStackとPEAR_Exceptionは、無くてもインストール&動作可能。

XMLをJSON形式に変換

XML->JSONの変換をしたい場合。

Magpie RSSを使ってRSS・AtomをPHPで取得&表示

先日作った日本語版Google News(ニュース)のRSS・Atom 表示では、RSS・Atom(XML)の取得や解析・表示にMagpie RSS – PHP RSS Parserというパーサーを使っています。以下は、PHPでRSSを使う場合のメモです。

Atom・RSS(XML)を解析(パース)する

RSSやAtomはXML文書の一種です。XML文書は解析(パース)して、欲しいデータを取り出して使います。

本当にちょっとした解析(パース)なら、正規表現を使ったりしてもいいのかもしれませんが、普通は面倒でそんなことはやっていられません!PHPのXMLパーサ関数を使ったり、各所で公開されているRSS用のライブラリーを使った方が楽ちんです。

RSS(XML)パーサ用のPHPライブラリを使う

PHPのRSSパース用のライブラリーには、
Magpie RSS – PHP RSS Parserや、
PEAR :: Package :: XML_RSS(要XML_Parser)があります。

MagpieRSSには、Cache(キャッシュ)機能も付いているし、データの取得もURLを指定するだけでOKなのでオススメです。
以下、MagpieRSSの使い方です。(PEARのXML_RSSの使い方はそのうちに…)

PHP Magpie RSSの使い方

まず、SourceForge.net: Filesで、
magpierssをダウンロードし、解凍。
解凍したフィルダの中にある4つのファイル
「rss_cache.inc」、
「rss_fetch.inc」、
「rss_parse.inc」、
「rss_utils.inc」、
とSnoopy.class.incが入っている「extlibフォルダ」を適当なフォルダ(以下、名前をrssとします)にコピーします。
次に、このrssフォルダをまるごと適当なディレクトリーにアップロードします。

後は、rssディレクトリーがあるのと同じディレクトリーに、
Cache(キャッシュ)用のディレクトリと、Magpie RSSを使うためのPHPファイルを次のように用意すれば使えるはずです。

1.Cache(キャッシュ)用のディレクトリを作成

名称cache(define~で自分で設定することもできます)でディレクトリーを作成。
パーミッションを「777」等にして、書き込みの権限を与えておきます。

2.PHP スクリプト例

ブラウザからアクセスして、RSS情報の表示をするためのPHPファイルを次のように用意します。
(以下、名前をmag.phpとします)

PHP RSS表示用のスクリプト(ソース)


<?php
$q_encode=urlencode("グーグル");//検索キーワード
$output="rss";//rss or atom
$num=10;//表示件数

define('MAGPIE_CACHE_AGE','7200');//cacheを残す時間
define('MAGPIE_CACHE_DIR', './cache');//Cache(キャッシュ)用のディレクトリ
define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');//アウトプットの文字コード

require_once './rss/rss_fetch.inc';//アップロードしたrss_fetch.incがあるところ
$rss = fetch_rss("http://news.google.com/news?hl=ja&ned=us&q=$q_encode&ie=UTF-8&output=$output&num=$num");
//print_r($rss);//取得結果

foreach($rss->items as $key => $value){
	print "<p>".$value['title']."</p>\n";
	print "<div>".$value['description']."</div>\n";
	/*
	配列のキーは、title、description以外にも
	link,guid,pubdate,summary,date_timestamp
	などが指定できます
	*/
}
?>

全体の構成は

rss
   - rss_cache.inc
   - rss_fetch.inc
   - rss_parse.inc
   - rss_utils.inc
   extlib
      -Snoopy.class.inc
mag.php
cache

ブラウザでmag.phpを表示すれば、$q_encodeで指定したキーワード関連のニュースが表示できると思います。

PHPのXMLパーサ関数を使う

ライブラリーを使わないで、用意されているXMLパーサ関数を使っても同じことができます。
RSS・Atom専用では無いので、アマゾンのWebサービスを始めとする一般的なXMLデータの解析にも使えます。

PHPのXMLパーサ関数としては、
xml_parser_create
xml_ parser_ set_ option
xml_parse_into_struct
xml_parser_free
あたりを使えばいいかもしれない。


$parser = xml_parser_create(); 
xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1); 
xml_parse_into_struct($parser,$xmldata,$values_array,$index_array);
xml_parser_free($parser); 
print_r($values_array);
print_r($index_array);

$xmldataに解析(パース)したいXMLデータを入れて、上のスクリプトを実行すれば、
$values_array,$index_arrayにXMLの構造が配列として代入されます。

XMLデータは、file
fopenとか,
Net_Socketで取得することになると思います。

PHP5からは、SimpleXML関数が追加されたので、
こちらを使うともっと簡単にできます。(参考:Do You PHP? – PHP5を試してみる – SimpleXML関数でRSSしてみる)

PHP PEARのCache_Liteでキャッシュする

PHPでキャッシュしたいときに、良くお世話になるPEARのCache_Liteの使い方メモ。使えるパラメータで知らないものが案外多かった。

基本的な使い方、インストール&導入

PEARのパッケージマネージャが入っていれば、「pear install Cache_Lite」でインストールできる。
あるいは、Cache_Lite Downloadでファイルをダウンロードし、解凍してからサーバーの適当な場所にアップロードして、「require_once(“~./Cache/Lite.php”)」とすれば、
Cache_Liteが使えるようになる。

基本的な使い方は、

require_once("Cache/Lite.php");
$cacheoptions = array(
"cacheDir" => "cache/",
"lifeTime" => 3600,
"automaticCleaningFactor" => "20",
);
$cache = new Cache_Lite($cacheoptions);

//Cacheするデータを見分ける一意的な名前
$id="id_name";

if ($cacheData = $cache->get($id)) {
	//Cacheしたファイルがあるとき
	$cacheData = unserialize($cacheData);
}else{
	//Cacheしたファイルがないとき
	//キャッシュファイルにデータを保存する
	$savedata="保存するデータ(配列なども可能)";
	$cache->save(serialize($savedata), $id);
}

ディレクトリ「cache」を作って、書き込みの権限を与えておけば、
「cache」内にファイルが作成されるはず。

「$cacheoptions」でキャッシュの仕方を設定する。
「cacheDir」は、ファイルをキャッシュするデイレクトリ、
「lifeTime」はキャッシュしたファイルを保存する時間。

「automaticCleaningFactor」は、デフォルトで0が設定され、
期限の切れた古いキャッシュファイルはそのまま残る設定になっている。
1以上の整数を入れると、自動的に古いCacheが削除される
(整数nを設定すると、n回に1回の割合でファイルの整理がされる。
数字が小さいほど、ファイルが削除されやすい)。

キャッシュするデータが単なる文字列であれば、unserialize()も、
serialize()も必要ない。
配列などのデータを保存したい場合は、シリアライズしないとデータがファイルに書き込めない。

Cache_Liteで使えるパラメータ

キャッシングのときに設定できるパラメータで使いそうなものの一覧。

パラメータ
[デフォルトの値]説明
cacheDir
[/tmp/]キャッシュを保存するディレクトリ
lifeTime
[3600]
automaticCleaningFactor
[0]自動クリーニング。古いキャッシュをを削除するか。
readControlType
[crc32]読み込みの制御。他に、md5,strlenも設定可。md5,crc32,strlenの順に安全性は高いが、逆にパフォーマンスは低くなる。
automaticSerialization
[FALSE]自動的にデータのシリアライズをするか。TRUEで、保存データのシリアライズは必要なくなる。
hashedDirectoryLevel
[0]Cacheファイルをディレクトリ構造で保存するか。整数1につき、階層1つ。

Group化してキャッシュ

キャッシュは、グループで分けることもできる。

上の例で、$groupを指定すればいい。
デフォルトで省略した場合だと、$group=”default”となっている。

$cache->get($id,$group));
$cache->save(serialize($savedata), $id,$group);

作成されるCacheファイルの名前は、$group+$idから決定される。

「”cacheDir” => “cache/$group/”」とか、「”hashedDirectoryLevel” => ~」で適当なディレクトリにCacheが作れる。

cleanとremoveでキャッシュの削除

僕は、使ったことはないけれど、
clean()とremove()でキャッシュを指定して削除できるみたいです。

$cache->remove($id,$group="default");
$cache->clean($group="default",$mode='ingroup');

$modeは「old」、「ingroup」、「notingroup」から指定できる。

  • old 古いキャッシュをクリア
  • ingroup 指定されたグループ内のキャッシュをクリア
  • notingroup 指定されたグループ内以外のキャッシュをクリア

ページをキャッシュする

Cache/Lite.phpは、ページ内の一部のデータを保存するという感じですが、
ページの一部を保存するのに、Cache/Lite/Output.phpも用意されています。

require_once("Cache/Lite/Output.php");
$cacheoptions = array(
"cacheDir" => "cache/",
"lifeTime" => 3600,
"automaticCleaningFactor" => "20",
);
$cache = new Cache_Lite_Output($cacheoptions);

//Cacheするデータを見分ける一意的な名前
$id="id_name";

if (!$cache->start($id)) {
	//キャッシュしたいページの部分
	$savedata=date("G:i:s");
	$cache->end();
}

start()は、$idと$groupが指定できます。

PHP PEAR 参考にした本

PEAR入門 PHP標準ライブラリを極める!
PEAR入門 PHP標準ライブラリを極める!

PEAR::DBとか、PEAR::Pager、PEAR::XML_Serializerとかも、いろいろ載っていた。
php5は、simplexmlがあるからいいのだけれど、
php4ではPEAR::XML_Unserializerが結構便利。

Windows XP(+Apache)にPHPをインストール(2)

ApacheをWindows XPにインストールの次の記事。Apacheを入れたWindows XPに、PHPをインストールしました。

PHPをダウンロード

PHP(本家)から、
「PHP 4.4.2 installer」をダウンロード。後でextensionsなどのファイルも使いたくなったので、
結局「PHP 4.4.2 zip package 」の方をダウンロードして使うことに…。

PHPをWindows XPにインストール

PHP 4.4.2 installerを解凍してできるphp-4.4.2-installer.exeを起動。
standardで「C:\PHP」をインストール先に設定。
サーバー、メールアドレスは適当に入力。連携させるサーバーは「Apache」で。

インストールが完了するとhttpd.confファイルの設定を促すメッセージが表示。
(httpd.confファイルは、「C:\Program Files\Apache Group\Apache2\conf」に)

httpd.confファイルの設定

CGI版PHP、モジュール版PHPのどちらでPHPを動すかを、httpd.confで決定。
Apache 2.0と、Apache1.3では設定の仕方が違うらしい。

一番上のページにはApache 2.0、下の二つのページには、Apache1.3の解説があります。
今回はApache 2.0を使っているので、次のように書き加えてみました。

Apache 2.0でCGI版PHPを動かす

ScriptAlias /php/ "C:/PHP/"
AddType application/x-httpd-php .php
Action application/x-httpd-php /php/php.exe

Apache 2.0でモジュール版PHPを動かす

LoadModule php4_module c:/php/sapi/php4apache2.dll
AddType application/x-httpd-php .php

モジュール版で使う場合、さらに「C:/PHP/sapi/php4apache2.dll」を「C:\WINDOWS\SYSTEM32」にコピーしなくてはならない。
php4apche.dllとphp4apache2.dllの違いに気が付かず、なかなかエラーが取れなかった…。

Apacheをrestart、どちらの方法でもちゃんと動く!
(「<?php phpinfo() ;?>」とだけ書いたinfo.phpで確認OK)

後はGD/マルチバイト環境の設定を参考に、設定をいじる。

(文字化け対策に、AddDefaultCharsetとLanguagePriorityを書き換えなければらないと
」に書いてあったので早速書き換えようと思いましたが、Googledで検索したところ、
こんな記事が「AddDefaultCharset none の謎」、
LanguagePriority の意味」。
危うくセットで、間違ってしまう所でした。
core – Apache HTTP サーバ
公式のドキュメントには、ちゃんと目を通して置かないと…。)

次はWindows XP(+Apache)にMySQLをインストール