-->

2010-02-12

fifo

この記事は php で fifo を扱う例です。

1つのfifoを複数のプロセスで監視します。
<?php
$log_file = "/tmp/abc.txt";
$log_fp = fopen($log_file, "a");
$read_file = "./fifo_read";
posix_mkfifo($read_file, 0600);
$read_fp = fopen($read_file, "r");
$pid = posix_getpid();
while (true)
{
    $buf = stream_get_contents($read_fp);
    if (is_string($buf) && $buf != "")
    {
        foreach (preg_split("/\r\n|[\r\n]/", $buf, -1, PREG_SPLIT_NO_EMPTY) as $line)
        {
            fwrite($log_fp, $pid . ":" . date("Y-m-d H:i:s") . ":" . $line . "\n");
        }
    }
    fopen($read_file, "r");
}
?>

確認します。
for i in $(seq 1 10); do (php test.php &); done
echo -n "" > /tmp/abc.txt
for xx in $(seq 1 100); do ((for i in $(seq 1 1000); do echo "cat /proc/meminfo" > fifo_read; done) &); done
wc -l /tmp/abc.txt
grep /proc/meminfo /tmp/abc.txt |wc -l
cat /tmp/abc.txt |awk -F\: '{print $1}'|sort|uniq -c
killall php

1つプロセスで複数の fifo を監視するには inotify, dio (pecl)などを使うらしいです。
open(file, O_RDONLY)でノンブロックではないので止まります。strace
ログの書き込みが遅れます。
openの動作で一時停止させるのは、良くないかもしれません。

0 件のコメント: