こんにちは。yuzoです。
今回はPHPをwindowsのサービスとして動作させるwin32serviceを試してみました。
準備した環境
- Windows 7 Professional(32bit)
- PHP 5.3.3
- win32service 0.1.0-dev
インストール
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
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」が存在するか確認してみましょう。
サービスを開始すると指定した場所 "C:\PHP\" 以下にポコポコとファイルが作られます。
このままファイルを生成し続けるのも困り者なので急いでサービスを停止しましょう。
サービスを解除する
動作確認を終えたので、さっさとサービスを解除します。
php C:\PHP\scripts\win32service.php uninstall
普段はwindowsを利用する機会がほとんどないのですが、
どうしても利用しなければならなくなった時に試してみるのもいいかもしれませんね。
それでは、またいつかお会いしましょう。