Monthly Archives: 9月 2007 - Page 2

Fatal error: Class ‘DOMDocument’ not foundと出たら

最近のCentOSやFedoraでPHPを走らせていると、時々

Fatal error: Class ‘DOMDocument’ not found

なんてエラーに出くわしますが、これはいわゆるDOMがPHPに組み込まれていない>CentOSなどでは–with-domなconfigureでコンパイルされていない、ということですね。モジュールとして組み込めばOKです。


# yum install php-xml

php-xmlにphp-domも組み込まれています。

PREG ONLINE をリリースしました。

Preg系の関数で使用する正規表現の作成時に、逐次結果を確認しながら作成できたら便利だなあ、ということで、Ajaxで結果を逐次確認するonline版のpregを作成しました。

PREG ONLINE

preg_online

もし良ければ色々と使ってみてください。

さくらインターネットでmysqldumpしてMySQLのバックアップスクリプト習作

さくらインターネットで、mysqlのデータをバックアップしておくと、何かあった時に幸せかもしれません。

#! /bin/sh

date=`date +’%y%m%d’`
file=mysql-backup-$date
dir=$HOME/opt/backup

/usr/local/bin/mysqldump –opt -c -Q –host=[dbserver] \
–user=[user] –password=[password] [table] > \
$dir/$file
/usr/bin/bzip2 $dir/$file

バックアップ先を

$HOME/opt/backup

としてありますので、ディレクトリを作成して、そこに上記のスクリプトを置いてcronなどで回しましょう。

速く開発する努力

以前、PHPの種でもvar_dumpのエイリアスを作る話題を出していましたが、早く開発する努力という記事でこう仰っています。

アプリケーションに混入するこういった手法はとにかく良くないなと。勿論、紹介者の方はそんなことは分かっていて、TIPSの一つとして挙げているだけだと思いますが。10人開発チームで、「今日はfunction d(); 追加しました」とか周知してる現場は痛過ぎますからね ;p

うーん。確かに多人数開発の時は考慮しなくてはいけませんよね。ということは結局一人の時でもそれに則した行動をしたほうが良いでしょう。

勿論、紹介者の方はそんなことは分かっていて、TIPSの一つとして挙げているだけだと思いますが。

耳の痛い話ですね。

Fedora7@coLinuxのApacheでcssがtext/cssにならない件について。

WEB+DB Vol.40のid:naoyaさん記事で出てたcoLinuxの設定を見て、ちょいと久々にcoLinuxでもこ弄ろうと思ってインストール>設定などしていたら表題の件、Fedora7@coLinuxを入れてApacheインストール、でcssのContent-Typeがtext/cssにならなくてドはまりしてました。。
原因の1つは

/etc/mime.types

が空だったこと。最近はCentOSを使うことが多いのですが、その場合大体Cupsとかも勝手に入るので、mime.typesが空ということがなかったんですよね。というわけでFedora7のmime.types用にmailcapパッケージをインストールしました。

[code]
# yum install mailcap
[/code]

無事mime.typesが埋まりましたでしょうか。もちろんどこからかコピペしてくるのもアリです。

もう1つはすでにcssがtext/cssで送り出す設定になっているのに、(mime.typesが空の時の)ブラウザキャッシュが残っており、text/plainなCSSを読み込んでいたのでした。これが主にハマッた原因です。上記の設定やVirtualHostなど色々見て弄くってこねくりまわした挙げ句、あれ、Firefoxだとおかしいけど、IEだとちゃんとtext/cssになってる! という現象に気付き、これは設定がおかしいのではないな、、と思いLogを見てみるとステータスコードが304になってる!(最初にLogを見るのが当たり前ですね)、こっこれは!ということで、ETagを切ってみると、


(httpd.conf中)
FileETag none

無事、キャッシュを読まずにファイルを読み込み、結果きちんとtext/cssで読み込まれました。とほほ。

この騒動(?)は自分の中では壮大なSAGAでしたので、同じような悩みを持つ人のために、PHPとは関係無いですがメモしておきます。

標準入力からのメール処理でメール情報を取得する

パイプでメールを渡すのはよく知られていますが、渡したメール情報を解析するのは面倒なので、お手本が欲しいところです。
PHPプロ!さんのTIPSメーリングリストで、stdinからのメール処理でメール情報を取得するという記事があげらていましたので参考にしましょう。

ちなみにそのすぐ下の比較の落とし穴という記事なのですが、こういうチェックはPHP VALIABLE TESTで色々と簡単にチェックできますよ、と。

ページの有効期限対策

ブラウザの戻るボタンを押した時に出る「ページの有効期限切れ」対策です。
[php]
session_cache_limiter(none);
[/php]

とか

[php]
session_cache_limiter(‘private_no_expire’);
[/php]

とか。ページの有効期限切れを出したくない時の参考に。

Wordなど対応のRich Text Format(RTF)でドキュメント作り

PHPでドキュメントを作るのにRTFはどう?という記事です。

帳票を手間とお金をかけずに作るには、RTFがいいんじゃないだろうか。その手順と、日本語対応について。

RTFはその名の通りテキストで出来てますので、PHPで修正も出力も可能ですね。

CSV出力について、

頻繁に利用される妥協策は、CSVを出力してExcelなんかでユーザーに加工してもらう方法。でも、この方法って安易すぎると思う。

CSVを出力するのだって無料ではなくて、それなりに開発費はかかる。仮に、1時間で作れて1万円だとします。開発費が1万円で済んだとしても、ユーザーの利便性は全く向上しない。

お客さんが毎日毎日CSVをいじっている姿を想像してみてほしい。
お客さんにとって、そのナケナシの1万円は、おおよそムダ金だし、こんな提案で逃げようとするエンジニアは、まったくもって無粋だ。

こう触れられていますが、まったく耳の痛い話です(^_^;)
PEARのSpreadsheet_Excel_Writerに文字数制限のバグが無ければバリバリ使いたいんですけど。という言い訳を残しておきます。

同じ処理が行える時、forを使うかforeachを使うか?

配列を順次読み出していくような処理を行う時など、forでもforeachでも大体同じ処理を行うことができますね。そうした場合、どちらの構文を使うべきでしょうか?
とりあえず、処理速度に優劣があるか調べてみましょう。調べてみましょうといっても、私あまりベンチ的なことはしたことがないため、マニュアルのmicrotimeの項を参考にしました。ベンチの基本はこうだ!とかもっと上手くて楽なやり方はこうだ!というのをご存じの方は是非ご教示願えればと思います。

[php]
// マニュアルからそのまんまの、microtimeを取得する関数。
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}

// for文を使った処理。
function usefor()
{
$a = range(1,10000);
$sum = 0;
for ($i = 0,$length = count($a); $i < $length; $i++) {
$sum += $a[$i];
}
echo($sum . ",");
}

// foreach文を使った処理。
function useforeach()
{
$a = range(1,10000);
$sum = 0;
$i = 0; // forのハンデとならないように、カウンタを進めてみます。
foreach ($a as $val) {
$i++;
$sum += $val;
}
echo($sum . ",");
}

// for文、foreach文ともに10回実行し、平均値実行時間を取得。
$sum = 0;
for ($i = 0; $i < 10; $i++) {
$time_start = microtime_float();
usefor();
$time_end = microtime_float();
$sum += $time_end - $time_start;
}
echo("

for平均:” . $sum / 10 . “

“);

$sum = 0;
for ($i = 0; $i < 10; $i++) {
$time_start = microtime_float();
useforeach();
$time_end = microtime_float();
$sum += $time_end - $time_start;
}
echo("

foreach平均:” . $sum / 10 . “

“);

?>
[/php]

1~10000までの数値が入った配列から値を取り出し、加算していくという単純な処理です。配列から中身を取り出すのはforでもforeachでも同じように可能です。結果はこうなりました。

50005000,50005000,50005000,…
for平均:0.0321362018585

50005000,50005000,50005000,…
foreach平均:0.0234318971634

若干差はあるものの、ほぼ変わりませんね。foreachのほうが遅くなる場合もあります。実行する順番を逆にしてもそれほど差はでません。

速度に差が無いのであれば、私のオススメはforeachです。その理由はコードのミスが減る(かもしれない)からです。全ての配列を操作する、といった構文を作る際に、forだと、

  • for ($i = 0; $i < $length; $i++) {…
  • なのか

  • for ($i = 0; $i <= $length; $i++) {…
  • なのか迷ってしまったり、間違いに気づかなかったりする場合があったりしませんか? foreachのようなイテレータ操作ならこういうミスはまず無いですから。

    と、長々と書いてきたワリにはあまり大したことの無い話で申し訳ありません(^_^;)

    ちなみに、よく言われることですが、
    [php]
    for ($i = 0; $i < count($a); $i++) {
    $sum += $a[$i];
    }
    [/php]
    のようなfor文の条件評価にcount()を使ったりすると、毎回count()が発生してしまいます。最初の実験スクリプト中のfor文を上記のようにcount()で条件判定に変更した結果は

    50005000,50005000,…
    for平均:1.1242749691

    50005000,50005000,…
    foreach平均:0.0304559707642

    このように、とても遅くなってしまうので気をつけましょう。

    PHPできちんとセッション廃棄

    セッション廃棄は気をつけようということで、session_destroy()だけでは不完全だよ、という教えです。

    1.メモリ上のセッション情報を消す。
    2.ブラウザのクッキーからセッションを消す。
    3.セッションファイルを消す。

    //1.メモリ上のセッション情報を消す。
    $_SESSION = array();

    //2.ブラウザのクッキーからセッションを消す。
    if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), ”, time()-42000, ‘/’);
    }

    //3.セッションファイルを消す。
    session_destroy();

    ブラウザのクッキーからセッションを消す、というのは気をつけていないと忘れそうですね。勉強になります!