赤心慶福

talk about rss feed #12

フィードリーダーを cli な PHP スクリプトとして書いている。

つまりコンソールアプリケーションということになる。したがって、ctrl-c を押すと中断する。

ところで Windows + cli な PHP って、ctrl-c をキャッチできないのが *ものすごく* 欠陥だと思うのだけどどうか。そういうのを PHP で処理するときは、pcntl_signal() とかを使ったりするのだけど、そもそも pcntl 関数群が Windows 版 PHP に存在しない。基本無限ループで動作し、かつ終了時にクリーンアップの必要な処理というのをどう書けばいいのか?

フィードリーダーに関しては特にクリーンアップ処理はないのでまあいいけど。強いて言えば、起動中の softalkw.exe がそのまま残り続けることくらいか。これは発声の終了と同時にプロセスも終了する(たまに発声が途中で止まることもあるのでまったく問題ないというと嘘になる)。

何とか無理やり ctrl-c をキャッチできないのか。

たとえば、a.php と b.php を用意する。

ユーザーが起動するフロントエンドは a.php とする。実際の処理は b.php に書き、a.php は b.php を子プロセスとして起動する。

a.php は
子プロセスを起動();

while (true) {
  touch(適当なファイルA);

  if (子プロセスが終了してる())
    exit(0);

  sleep(10);
}


b.php は
while (true) {
  素敵ななにか();

  if (ファイルAのmtimeから十分な時間が経過()) {
    exit(0);
}


こうすれば、ctrl-c だろうがなんだろうが a.php が終了したことを b.php 側で間接的に知ることができないか。

試してないけど。

talk about rss feed #11talk about rss feed #13