0

strtotime

何回やっても忘れるのがこれ。
function datereformat($val)
{
return date("Y年m月d日 H:i:s", strtotime($val));
}

$valにはmySQLのdatetime式(2008-07-05 12:30:50)な日付が入ってます。
それをいったんunixタイムに変換してdateしてるだけ。

0

PHP_EOL

PHPで改行を表す定義済み定数。
しらんかった。

PHP_EOL

シングルクオテーション派には、ソースが少しきれいになりますね。

0

PHPで現在のURLを取得

/**
* 現在のページのURL
*/
if( isset($_SERVER['HTTPS']) ){
$http = ($_SERVER['HTTPS'])?'https://':'http://';
}else{
$http = 'https://';
}
define('CONFIG_THIS_URL',$http.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
echo CONFIG_THIS_URL;

0

PHPデバッグ

これもいっつも忘れてしまうのでここにメモ。
sshのエラーログを眺めてたけどどう考えてもめんどい。

本番環境では使わないけどテスト環境ではこれをつけておくとブラウザにエラーが出力される。
これ忘れるの!?って言われるようなことだけど、こんなことでもがんがんブログに書かかなくては。

ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL);
0

PHPを本番環境で使うときの注意点

注意点という程のものでもないが、下記のようにphp.iniをオーバーライドさせておこう。
ini_set("display_errors", 0);
ini_set("error_reporting", false);

意味は、書くまでもなくエラーをブラウザで表示しないというやつ。
デバッグ時、テスト時にはオンにしておくべきだか、本番環境ではオフにしておこう。

今回とある案件でやらかしてしまったので自戒の念も込めて。

0

HTTP_RequestでIf-Modified-Sinceを設定する

フィード関連のサービス(フィードリーダー、更新情報の集約)をつくっていると、定期的にフィードを配信するサーバーにフィードを取得しにいかなくてはなりません。
もちろんこのフィード取得のために多少なりともフィードを配信するサーバーに負荷をかけてしまいます。
フィードを配信してる人があってのこの手のサービス、相手に極力迷惑をかけずにやっていきたいものです。
そこで、一時間に一回クロールしてフィードすべてをとってくるのではなく、前回のクロール時以降更新がある場合のみ取得するというやり方がおすすめです。

導入は簡単で、If-Modified-Sinceをクローラーのヘッダーに入れ込むことで実現可能です。

これは2007年6月19日(日) 2時24分23秒以降にフィードが更新されてたら取得するという意味です。
If-Modified-Since: Sun, 19 Jun 2007 02:24:43 GMT

更新された場合はレスポンスコード200を返してくれますので、フィードを取得します。
更新されてない場合レスポンスコード304を返しますので、前回取得時とかわりがないのでそのままにして次の処理にいきます。
更新してないとスルーするのでクローリングする時間も大幅に短縮できます。

一時間前のクローリングから更新がないかチェックするPHPでのサンプルをのっけときます。

require_once "HTTP/Request.php";
$option = array(
"timeout" => "10", // タイムアウトの秒数指定
);
$UA = "hoge";
$url = "http://hoge.com";
$last_modified = gmdate('D, d M Y H:i:s T', time() - 3600);
$http = new HTTP_Request($url, $option);
$http->addHeader("User-Agent", $UA);
$http->addHeader("If-Modified-Since", $last_modified);
$response = $http->sendRequest();
if (!PEAR::isError($response)) {
$resCode = $http->getResponseCode();
if ($resCode == 304) {
echo "not changed";
}
elseif ($resCode == 200) {
echo $http->getResponseBody();
}
else {
echo $resCode;
}
}

0

Scuttle-オープンソースのソーシャルブックマーク

ソーシャルブックマークを構築しようと思った時に調べたら、Scuttleというオープンソースのソーシャルブックマークがありました。
他にも同類のOSSはありましたがPHPではこれが一番よくできるかと思います。

インストールはここを参考にさせてもらいました。
こけることなくすんなりインストールすることができました。

一点、困ったのが日本語表示を変更する部分です。
日本語化する為にconfig.inc.phpを下記のようにしました。
$locale = 'ja_JP';

で、これをxoopsとかのように、いじれば日本語の文言を変更できるだろうと思いいじってみましたが全然反映されません。
/sbm/locales/ja_JP/LC_MESSAGES/messages.po
#: ..\..\..\about.php:25
#: ..\..\..\templates\toolbar.inc.php:24
msgid "About"
msgstr "このサイトについて"

調べてみるとこれをバイナリにコンパイルしないといけないみたいです。
コンパイルはLinuxなら下記のようにします。
msgfmt -o messages.mo messages.po

すると新たにmessages.moというファイルが生成されます。
Scuttleは日本語の文言をここから拾ってくるようになります。

テンプレートファイルに直接日本語を書くのもOKですが、デフォルトでSJISになっています。
必要に応じてUTF8に変更してください。

0

phpでcsvを開く

perlでcsvを開く際、一行づつ読み込んで、splitで細かくしていくってのが一般的だけどphpの場合、fgetcsvっていう便利な関数が用意されている。
簡単にすればこんな形になります。
$DATAに配列として代入されます。
別にそのまま処理してもOK

sample.csv
001,山田,654-0024
002,河合,005-0424
003,歌田,541-0041

setlocale(LC_ALL, 'ja_JP.UTF-8');
$i = 0;
$handle = fopen("sample.csv", "r");
while (($data = fgetcsv($handle, 1000, ",")) !== false) {
$num = count($data);
for ($c=0; $c < $num; $c++) {
$DATA[$i]["id"] = $data[0];
$DATA[$i]["name"] = $data[1];
$DATA[$i]["zip"] = $data[2];
}
$i++;
}
fclose($handle);

気をつける部分は、一行目のsetlocale(LC_ALL, ‘ja_JP.UTF-8’)
fgetcsvがマルチバイトに対応してないため、UTF8で記述されたcsv等はこのようにエンコード名を明記する必要があります。
phpの関数は便利だねー。

まえ、どっかのブログでphpの関数が多すぎるって書いてたけど多くて何が悪いのだろうと思う。
関数名が長くなるのも当然、いやならオーバーライドしてやればOK。
LL万歳!!

0

MeCabインストールメモ

fedora7にMeCabをインストールした際のメモです。
ほとんどここのパクリです。

MeCab本体をソースからインストール
# wget http://nchc.dl.sourceforge.net/sourceforge/mecab/mecab-0.96.tar.gz
# tar -xvzf mecab-0.96.tar.gz
# cd mecab-0.96
# ./configure
# make
# make install

辞書は別なので辞書もインストール
# wget http://nchc.dl.sourceforge.net/sourceforge/mecab/mecab-ipadic-2.7.0-20070610.tar.gz
# tar -xvzf mecab-ipadic-2.7.0-20070610.tar.gz
# cd mecab-ipadic-2.7.0-20070610
# ./configure
# make
# make install

デフォルトではEUCなのでUTF8に変更しておく。
# /usr/local/libexec/mecab/mecab-dict-index -f euc-jp -t utf-8
# make install

PHPからMeCabを使う
phpizeがない場合
# yum install php-devel

phpで利用できるようにPHPモジュール(MeCab extension)をインストール
# wget http://page2.xrea.jp/pub/php_mecab-0.2.0.tgz
# tar -xvzf php_mecab-0.2.0.tgz
# cd php_mecab-0.2.0
# phpize
# ./configure --with-php-config=/usr/bin/php-config --with-mecab=/usr/local/bin/mecab-config
# make
# make install

デフォルトの辞書では不十分に感じてくると思うので自分で単語を追加するユーザー辞書を用意します。
デフォルトの辞書+ユーザー辞書で運用します。
適当なフォルダに移って編集用のcsvファイルと実際の辞書となるdicファイルを作成します。
# touch userDic.csv
# touch userDic.dic
ブラウザから操作する時のために
# chmod 666 userDic.*

csvファイルに一行一単語で登録していく
詳しくはこちら
# vi userDic.csv
ほげ,-1,-1,10,名詞,一般,*,*,*,*,ほげ,ホゲ,ホゲ

ユーザー辞書をMeCab認識させる
# vi /usr/local/etc/mecabrc

下記の一行を追加
userdic = /home/www/userDic.dic

csvのをdicファイルのコピー
/usr/local/libexec/mecab/mecab-dict-index -d/usr/local/lib/mecab/dic/ipadic -u /path/to/userDic.dic -f utf8 -t utf8 /path/to/userDic.csv

perlで使う際はcpanにモジュールがあるけどインストールで必ずこけるの要注意。
これは後日。

これとタグクラウドを組み合わせたら最近流行りのものが作れそう。