PHPでServer Sent Eventを簡単に試してみる

これを読んでるとやたらと楽しそうかつ簡単に導入できそうだったので試してみる。

参考:https://developer.mozilla.org/ja/docs/Server-sent_events/Using_server-sent_events

see_test1.php

<?php
header("Content-Type: text/event-stream\n\n");

$counter = rand(1, 10);
while (1) {
  // "ping" イベントを毎秒送信
  
  echo "event: ping\n";
  $curDate = date(DATE_ISO8601);
  echo 'data: {"time": "' . $curDate . '"}';
  echo "\n\n";
  
  // シンプルなメッセージをランダムな間隔で送信
  
  $counter--;
  
  if (!$counter) {
    echo 'data: This is a message at time ' . $curDate . "\n\n";
    $counter = rand(1, 10);
  }
  
  ob_flush();
  flush();
  sleep(1);
}

index.html

<html>
    <head>
        <title>Server Sent Event テスト</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">

        <script>
            window.onload = function() {
                var evtSource = new EventSource("sse_test1.php");
                var eventList = document.getElementById("log");
                
                evtSource.onmessage = function(e) {
                    var newElement = document.createElement("li");

                    newElement.innerHTML = "message: " + e.data;
                    eventList.appendChild(newElement);
                }
                evtSource.addEventListener("ping", function(e) {
                    var newElement = document.createElement("li");

                    var obj = JSON.parse(e.data);
                    newElement.innerHTML = "ping at " + obj.time;
                    eventList.appendChild(newElement);
                }, false);
            }
        </script>

    </head>
    <body>
        <div>TODO write content</div>

        <div id ="log"></div>
    </body>
</html>

これで、index.htmlにアクセスしてみるとずらずらとテキストストリームが表示される。

PHPのcurlでeuc-jpのページを取得したときに文字化けするのを防ぐ

俺日記のしんじです。一人称は僕です。

下記のようなcurlの関数を用意し、euc-jpのページを取得し、シェル内でで取得したページを確認すると文字化けしていることに気づいた。

function curl_get_contents($url, $timeout = 60) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

上記コードを下記のように変更することで文字化けを防ぐことができる。

function curl_get_contents($url, $timeout = 60) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    $result = curl_exec_utf8($ch);
    curl_close($ch);
    return $result;
}

/** The same as curl_exec except tries its best to convert the output to utf8 * */
function curl_exec_utf8($ch) {
    $data = curl_exec($ch);
    if (!is_string($data))
        return $data;

    unset($charset);
    $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);

    /* 1: HTTP Content-Type: header */
    preg_match('@([\w/+]+)(;\s*charset=(\S+))[email protected]', $content_type, $matches);
    if (isset($matches[3]))
        $charset = $matches[3];

    /* 2:  element in the page */
    if (!isset($charset)) {
        preg_match('@ element in the page */
    if (!isset($charset)) {
        preg_match('@<\?xml.+encoding="([^\s"]+)@si', $data, $matches);
        if (isset($matches[1]))
            $charset = $matches[1];
    }

    /* 4: PHP's heuristic detection */
    if (!isset($charset)) {
        $encoding = mb_detect_encoding($data);
        if ($encoding)
            $charset = $encoding;
    }

    /* 5: Default for HTML */
    if (!isset($charset)) {
        if (strstr($content_type, "text/html") === 0)
            $charset = "ISO 8859-1";
    }

    /* Convert it if it is anything but UTF-8 */
    /* You can change "UTF-8"  to "UTF-8//IGNORE" to 
      ignore conversion errors and still output something reasonable */
    if (isset($charset) && strtoupper($charset) != "UTF-8")
        $data = iconv($charset, 'UTF-8', $data);

    return $data;
}

参考:http://stackoverflow.com/questions/2510868/php-convert-curl-exec-output-to-utf8

以上。

Vineの非公式APIとTwitterAPIを使ってVineまとめサイトを作った。

俺日記のしんじです。一人称は僕です。

ふと何かVineで作りたくなったので。

Vineの人気動画をTwitterでまとめました。viny(バイニー)

screencapture-localhost-8888-viny-index-retweet-month

TwitterからvineのURLの載ったツイートを収集して、RT数やファボ数等でランキング化しています。

html5のビデオタグを使って、vineの公式サイトのようにマウスをのせるだけで再生されるようにしてるんだけど、vineから提供される動画ファイルがmp4のみなので、firefoxではその部分が動かないから残念だ(クリックしたら再生できるようにしているが…)。

差別ネタとか暴力系とかまざっててたまに驚くけどそれもまた一興。

2014/06/23追記:やたらとサーバーのリソースをくってしまうので停止しました・・・

2015/07/28追記:復活させました。

2015/11/06追記:やっぱり停止しました。。

CakePHP 2.4.5 にsmartyをインストール

cakephpへsmartyをインストールし、動作確認をサクっとやりたかったが、web上の記事によってはリンク切れがあったりといろいろ煩わしかったのでメモとして記す。

“CakePHP 2.4.5 にsmartyをインストール” の続きを読む