PHPプロ!TIPS+

1. PEAR::Logでログ管理

みなさん、ログの出力はどのように行っていますでしょうか?fwrite関数で書き出したり、error_log関数、syslog関数等を使用されている方もいると思いますが、PEAR::Logを使用すると、出力方法にファイルやメール、DB等、数種類選択でき、ログの管理が非常に簡単に行えるようになります。

PEAR::Log (http://pear.php.net/package/Log)

マニュアル(英語)

http://www.indelible.org/pear/Log/guide.php

日本語マニュアル

http://www.townmedia.org/tips/index.php?doc=PEAR/peardoc_ja&_pear=package.logging.html

PEAR::Logでサポートする出力方法は次のとおりです。

  • file → ローカルファイルシステム上の任意のファイルにデータを格納します。
  • mcal → カレンダアプリケーション。このデータタイプを利用するには、libmcal と mcal PHP 拡張モジュールが必要です。
  • sql → PEAR::DB を使ってデータベースに格納します。
  • syslog → Unix 系システムではsyslog を、 Windows NT/2000/XP 系システムでは イベントログ を使ってデータを格納します。
  • mail → メールボックスにログメッセージを送信します。
  • console → テキストコンソールにログメッセージを書きます。

以下のようなコードでログを出力することができます。

--ファイルに出力する場合--

<?php
require_once 'Log.php';
$file = &Log::factory('file''out.log''TEST');
$file->log('ログ内容');
?>

--出力内容--

Sep 27 12:10:48 TEST [info] ログ内容

指定した場所にout.logファイルが作成され、以降はログが追記されていきます。引数にオプションで、ファイルのパーミッションや日付のフォーマット等を指定することができます。

--日付フォーマット変更・パーミッション777を指定する場合--

<?php
require_once 'Log.php';
$conf array('mode' => 0777'timeFormat' => '%X %x');
$file = &Log::factory('file''out.log''TEST'$conf);
$file->log('ログ内容');
?>

--出力内容--

12:15:11 09/27/06 TEST [info] ログ内容

--メールに出力する場合--

<?php
require_once "Log.php";
$conf array('from'=>'example@co.jp''subject'=>'Log Subject');
$to 'webmaster@example.com';
$logger = &Log::singleton('mail'$to'ident'$conf);
$message "ログ内容";
$logger->log($message);
?>

--受信メール--

件名: Log Subject
差出人: example@co.jp
宛先: webmaster@example.com
本文 : Sep 27 12:25:20 ident [info] ログ内容

以上のコードだけで、指定したアドレスにログ用のメールを送信できます。

※詳細な使用方法・設定等はマニュアルを参考して下さい。

このように、PEAR::Logを使用すれば、簡単にログの出力が行えます。エラーログ管理等に是非、使用してみてはいかがでしょう。

2. 連想配列でハッシュの使用

常識的なことですが、キーと値が対応した連想配列を使用することはよくあると思います。何回も使用するマスターの値を配列として保存して、複数回アクセスする場合、switch文やif文を使用している場合は参考にしてみてください。

今回考えるのは「はい」、「いいえ」、「無回答」といった値が yes、no、 no_answer という文字列に対応して保存されているとします。

さらに、はい・いいえを表すために yes、no、no_answer という値がリストに入っている場合を考えます。

$list = array(
  array(
    'yes_no' => 'yes', '...' => '...', ......
  ),
  array(
    'yes_no' => 'no', '...' => '...', ......
  ),
  ......
);

このリストの一覧表示ではい・いいえを出力するために、変数の内容を変更するロジックを書く場合、以下のようなスクリプトを書いてはいないでしょうか。

foreach ($list as $k => $v) {
// IF文を使用する場合
  if ($v['yes_no'] == 'yes')
    $list[$k]['yes_no_val'] = 'はい';
  if ($v['yes_no'] == 'no')
    $list[$k]['yes_no_val'] = 'いいえ';
  if ($v['yes_no'] == 'no_answer')
    $list[$k]['yes_no_val'] = '無回答';

// switch文を使用する場合
  switch ($v['yes_no']) {
  case 'yes':
    $list[$k]['yes_no_val'] = 'はい';
    break;
  case 'no':
    $list[$k]['yes_no_val'] = 'いいえ';
    break;
  case 'no_answer':
    $list[$k]['yes_no_val'] = '無回答';
    break;
  }
}

これは以下のような連想配列のハッシュを使用すればもっと簡単に、高速に処理することができます。

// ハッシュとなる配列
$YES_NO_LIST = array(
  'yes'       => 'はい',
  'no'        => 'いいえ',
  'no_answer' => '無回答'
);

foreach ($list as $k => $v) {
  $list[$k]['yes_no_val'] = $YES_NO_LIST[$v['yes_no']];
}

ハッシュの使用は特にバッチ処理などで大量のデータを扱うときに有効です。また、テーブルにキーと文字列の情報が保存されている場合、テーブル結合をするSQL文を複数実行よりも、一度その内容を連想配列形式のハッシュで保存して使用すると、実行スピードが向上する場合もあります。

3. WinBinder でデスクトップアプリケーション

PHPで作れるGUIアプリケーションは、Webアプリケーションだけではありません。 WinbBnderを使えば、Windows上でデスクトップアプリケーションを作成すること も可能です。

WinBinderは、http://winbinder.org/download.php から入手可能です。自動インストール版とマニュアルインストール版があります。

自動インストールの場合、特に設定を変更せずにインストールすれば、Cドライ ブの直下にWinBinderディレクトリが作成され、同時にその中にPHPも含めたファイルが展開されます。PHPも同時にインストールするかどうかは、選択可能です。

では、実際にアプリケーションを作成していく手順を説明します。今回は使用法ということで、まずは単純にボタン押下で「Hello World」がポップアップするアプリケーションを作成します。

任意の場所にexample.phpwという名前でファイルを作成します。拡張子が.phpではなく、phpwであることに注意してください。中身は普通のPHPスクリプトです。

example.phpwのソースは以下のようになります。日本語を含む場合には、Windows上で文字化けを起こさないようにShift_JISで保存してください。

<?php

include "c:/winbinder/phpcode/include/winbinder.php";

$mainwin wb_create_window(NULLAppWindow"ようこそ!"300200);
  
// 新しいウィンドウを作成。引数は順に、parent ウィンドウ、作成するウィンドウの種類、
  // ウィンドウのタイトルバー(キャプション)、x方向サイズ、y方向サイズ。

wb_create_control($mainwinPushButton"ここを押す"1108080401);
  
// 新しいコントロールを作成。今回の場合はボタン。引数は、parentウィンドウ、作成するコントロールの種類、
  // ウィンドウ左上端からのコントロールの配置位置(x,y),x,y方向のコントロールのサイズ、コントロールのID。

wb_set_handler($mainwin"process_main");
  
// ウィンドウへ"process_main"関数をイベントハンドラとして割り当てている。

wb_main_loop();
  
// ここでウィンドウ のメインループに入る。これより後に、実行文を書いてはならない。


function process_main($window$id)
{  
//ハンドラ関数。第1引数にウィンドウのハンドラ、第2引数にウィンドウ内のオブジェクトに割り当てられたIDが入る。
  
switch ($id) {
    case 
1:
      
wb_message_box($window"Hello World");
        
// ポップアップを生成。第1引数はparentウィンドウ、第2引数は表示テキ
スト。
        
break;
    case 
IDCLOSE:
      
// 【x】ボタンが押された場合
      
wb_destroy_window($window);
        
// ウィンドウを終了する。
      
break;
  }
}
?>

上記のようなスクリプトを作成し、保存したexample.phpwを実行すると、GUIの デスクトップウィンドウが起動します。

さて、これを少しだけ変更して、ボタンを押すと値をカウントアップし、10でリ セットされる、というアプリケーションを作りましょう。

<?php

include "c:/winbinder/phpcode/include/winbinder.php";

$mainwin wb_create_window(NULLAppWindow"カウンター"300200);

wb_create_control($mainwinPushButton"スタート!"10080100401);
wb_create_control($mainwinLabel"0"1455020202);
  
// コントロールとして新たにLabelを追加。IDを2とする。

wb_set_handler($mainwin"process_main");

wb_main_loop();

function 
process_main($window$id$ctrl)
// 第3引数として$ctrlを取る。この引数は、ウィンドウにメッセージを渡したコントロールを取得します。
  
$counter wb_get_control($window2);
    
// IDが2のコントロールを取得
  
$count_value wb_get_value($counter);
    
// そのvalueを取得
  
switch ($id) {
    case 
1:
      if (
$count_value 9) {
        
wb_set_text($ctrl"再スタート!");
          
// wb_set_text()関数でボタンの表記を書き換え
        
wb_set_value($counter0);
        break;
      } else if (!
$count_value) {
        
wb_set_text($ctrl"カウント");
      }
      
wb_set_value($counter$count_value 1);
      break;
    case 
IDCLOSE:
      
wb_destroy_window($window);
      break;
  }
}
?>

非常に簡単なスクリプトですが、これだけでGUIアプリが作れるのですから、面白いと思いませんか?用意された関数などを詳しく知りたい場合は、WinBinderのページのマニュアルをご覧ください。

WinBinder: http://winbinder.org/index.php

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)