呼び出し元を取得

2009/01/26 | PHPの基本

最近は基本的にべたでプログラムを書くことはなくて、フレームワークを使ってクラスやら関数やらを書くことがほとんど。そのクラスとか関数から、さらにクラスや関数を呼び出すわけだが、呼び出された側で、呼び出し元の情報にアクセスする際、今までは引数で渡す処理にしていた。もちろんこれはこれで「必要以上の変数にはアクセスさせない」というフールプルーフ的なメリットが大きいが、その都度引数を渡す必要がある。いろいろ調べたら、PHPには呼び出し元のクラス(オブジェクト)にアクセスできる仕組みが用意されていた。

debug_backtrace関数だ。

読んで字のごとく、バックトレースしてくれるわけだ。呼び出し元クラス名やオブジェクト名、関数名やファイル名など、いろいろな情報にアクセスできる。しかし、まぁdebugとついているくらいだから、本来はデバッグ用で使用するためのものだろう。使うのには注意が必要かな。

関数emptyの引数

2009/01/16 | PHPの基本

値が空かどうかをチェックするのにempty関数をよく使っている。でも、あるとき、以下のようなエラーが出た。

Fatal error: Can’t use method return value in write context in /path/to/script

ぱっと見ただけでは意味がわからない・・・しばらく考える・・・「メソッドの戻り値は使えない」・・・。

プログラムの中では以下のように記述していた。

empty($hoge->fuga())

しかし、以下のように記述するとエラーにならない。

$value=$hoge->fuga();
empty($value); 

あ、ひょっとして・・・。

マニュアルを見たら書いてあった。「emptyの引数は関数であってはならない」そうだ。これは知らなかった。というよりも、よく今までこういう記述をしていなかったものだと思った。

重複行

2009/01/09 | MySQL

開発を始めて間もない頃に作ったサイトをリニューアル中。まだまだ駆け出しの頃だったので、プログラムもデータベースの構造もひどいものだ(だからサイトが重い)。そんなサイトでも月間数万ページビューあるのでリニューアルすることにしたのだ。

プログラムは全て新しく書き直すので、以前のプログラムはまったく気にならないけど、データベースの構造が大変。古いのをそのまま持ってくるのも重そうだし。新しく設計しなおしてデータをコンバートする過程で問題が起きた。テーブルに主キーを設定していなかったので、データの重複が起こっていた。そもそもプログラム側でも特に制御していなかったし、重複が起こっても当時のプログラムでは問題にならなかったのだが、今回はしっかりと主キーを設定したが故に、一筋縄では移行できなくなってしまったわけだ。

データの重複を削除する方法をウェブで探したら、ちゃんと見つかった。

CREATE TABLE temp as SELECT * FROM original GROUP BY column1, column2
DROP TABLE original
ALTER TABLE temp RENAME TO original

最初に、元のテーブルから全ての列をグループ化して、別名でテーブルを作る(この時点で重複行は一つにまとめられている)。次に元のテーブルを消して、最後にテーブル名を変更してそれで完了。ちょっとキツネにつままれたような感じだけどすごく簡単にできた。ほんとに大丈夫なのかどうかわからないんだけど、とりあえずこれでよしとした。

datetime型をunix timestampに一発変換

2009/01/08 | MySQL

最近はあまり使うことはないのだが、以前はカラムを定義する際にdatetime型やdate型をよく使っていた(最近はint型にしてunix timestampでデータを入れるのが好き)。当然のことながら昔作ったプログラムをリニューアルするとき、違和感を覚えることがある。そんなときに便利な関数がunix_timestamp。例えばSELECT文で、以下のように使用する。

SELECT unix_timestamp(timestamp_type_column) FROM table

これでdatetime型やdate型の値をunix timestampにして返してくれる(ちなみにその逆の関数はfrom_unixtime)。SQL文を発行する際にその都度関数を呼び出してもいいだろうけど、それではオーバーヘッドがバカにならないこともある(もちろん相応の負荷があるサイトの場合だが)。なので、元のテーブルを、上記の関数やその他の関数を使って一旦吐き出し、新しいテーブルを作ってそこにデータを流し込むほうがいい。でも、型の変更が原因で諸々問題が出る可能性があることを理解して使わないといけないけれど。

ウェブページのサムネイルをWindowsサーバで

以前、ウェブページのサムネイル生成をLinuxサーバ環境で構築する方法をさんざん検討し、なんとか実現できることを確認できた。でも格安レンタルサーバ(もしくはVPS)で構築するのはかなり面倒そう。最近はWindowsのレンタルサーバもたくさん出てきたので、Windowsサーバでウェブページサムネイルを作成する方法を探してみた。あっけなく見つかった。

記事元はサイボウズラボの秋元さんとかDo You PHPの下岡さんとか。さすがに識者だ。以下下岡さんのサイトにあったものを引用。

<?php
$browser = new COM("InternetExplorer.Application");
$handle = $browser->HWND;

$browser->Visible = true;
$browser->FullScreen = true;
$browser->Navigate("http://www.doyouphp.jp/");

/* Is it completely loaded? (be aware of frames!)*/
while ($browser->Busy) {
    com_message_pump(4000);
}
$im = imagegrabwindow($handle, 0);
$browser->Quit();

$new_x = 320;
$new_y = imagesy($im) * $new_x / imagesx($im);
$newim = imagecreatetruecolor($new_x, $new_y);
imagecopyresized($newim, $im, 0, 0, 0, 0,
  $new_x, $new_yimagesx($im), imagesy($im));
imagepng($newim, "test.png");

imegecopyresizedはimagecopyresampledに変更して使うとのこと。この部分は以前トリミングプログラムを作成したときに把握したところだ。さっそくどこかサーバを借りて試してみたいところではあるけれど・・・。


					

守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net