ログ日記

作業ログと日記とメモ

PHPで内部用ストリームAPI

内部用のAPIを作ろうと思ったときに、データが多い場合のことを考えると面倒だったりする。
offsetでページ切り替えするか?とか。


で、基本に返ってストリームから少しずつデータを取得すればいいんじゃないか、というC言語の初歩的なやつをPHPで。


put.php

<?php

$first = true;
for ($i = 0; $i < 100; $i++){
    if (!$first)
        echo "\n";
    else
        $first = false;

    $json = json_encode(array('data' => "$i\n"));
    echo $json;
    usleep(100000);
    ob_flush();
    flush();
}

沢山のデータを表示する代わりにsleepして表示する。


get.php

<?php
echo str_pad(' ', 1024);

$stream = fopen('http://localhost/stream/put.php', 'r');
while(!feof($stream)){
    $line = fgets($stream);
    $line = json_decode($line);
    var_dump($line);
    echo '<br>';
    ob_flush();
    flush();
}

str_padは確認のためにブラウザ上で逐次表示するため。
少しずつデータが流れてくるようならOK。
json_encodeは改行をエスケープするのでデータに改行があっても大丈夫。
これをIteratorで包めば10000件とかのデータも普通にDBをループするのと同じように処理できるんじゃないか?