unoh.github.com

PHPでwin32serviceを使ってみる

Sun Nov 14 03:21:00 -0800 2010

こんにちは。yuzoです。
今回はPHPをwindowsのサービスとして動作させるwin32serviceを試してみました。

準備した環境

インストール

PHPは「VC9 x86 Non Thread Safe」を利用しました。
http://windows.php.net/download/
どこに配置してもいいと思うのですが、
便宜上

C:\PHP\5.3.3

にインストールしたことにします。
もちろんPATHもとおします。

win32serviceについては、別途こちらからダウンロードが必要です。
http://downloads.php.net/pierre/
今回は「php_win32service-svn20091206-5.3-nts-vc9-x86.zip」を利用しました。
先ほどPHPをインストールした配下、

C:\PHP\5.3.3\ext

にdllをコピーしましょう。

php.iniを配置する

windows7の場合だとphp.iniの格納場所は "C:\Windows" らしいので、
php.exeと一緒にzipに入っていたphp.ini-development(もしくはphp.ini-production)
を "C:\Windows\php.ini" にコピーします。
windows7なんて使わない方は

php --ini

で各自格納場所を調べて下さい。

php.iniを編集する

配置したphp.iniにextension_dirとwin32serviceのextensionを定義します。

extension_dir = "C\PHP\5.3.3\ext"
extension=php_win32service.dll

ついでにtimezoneのWarningがウザイので 、

date.timezone = Asia/Tokyo

を定義しておきましょう。
これで環境は整いました。以下のコマンドで確認してみましょう。

php --re win32service

win32serviceのextension情報が出力されていれば成功です。

サービススクリプトを書く

subversionのサンプルソースを参考に以下のようなソースを準備しました。

C:\PHP\scripts\win32service.php

<?php
/**
 * win32service.php
 * usage:
 * サービス登録 / php win32service.php install
 * サービス解除 / php win32service.php uninstall
 **/
if ($argv[1] == 'install') {
    // win32serviceを登録する
    $x = win32_create_service(array(
        'service'       => 'PHPwin32service',
        'display'       => 'PHP win32service sample', // サービスの「名前」に表示される
        'description'   => 'Zynga is not Janga!',
        'params'      => __FILE__ . ' run',
    ));
    debug_zval_dump($x);
    exit;
} elseif ($argv[1] == 'uninstall') {
    // win32serviceを解除する
    $x = win32_delete_service('PHPwin32service');
    debug_zval_dump($x);
    exit;
} else if ($argv[1] != 'run') {
    die("Woops you are TENGA!!");
}

// SCMへcheckin
$x = win32_start_service_ctrl_dispatcher('PHPwin32service');
// サービス状態の更新
win32_set_service_status(WIN32_SERVICE_RUNNING);

// service loop
while (WIN32_SERVICE_CONTROL_STOP != win32_get_last_control_message()) {
    // ここにservice処理かく
    file_put_contents("C:\PHP\dummy".time().".txt","hoge");
    // ご利用は計画的に
    usleep(2000000);
}
動作確認のため、 "C:\PHP\dummy_{xxxx}.txt" に永遠とファイルを作成し続ける処理を書きました。

サービス登録/実行

それではさっそくサービス実行してみましょう。
以下のコマンドでサービス登録します。

php C:\PHP\scripts\win32service.php install
bool(true) refcount(2)

これでサービスが登録されているはずです。
サービスコンソールで「PHP win32service sample」が存在するか確認してみましょう。

win32service.gif
サービスを開始すると指定した場所 "C:\PHP\" 以下にポコポコとファイルが作られます。
このままファイルを生成し続けるのも困り者なので急いでサービスを停止しましょう。

サービスを解除する

動作確認を終えたので、さっさとサービスを解除します。

php C:\PHP\scripts\win32service.php uninstall

普段はwindowsを利用する機会がほとんどないのですが、
どうしても利用しなければならなくなった時に試してみるのもいいかもしれませんね。

それでは、またいつかお会いしましょう。