llHTTPRequest() を用いた外部鯖との通信に関するメモ

1-a) llHTTPRequest() を使って POST 送信する (LSL)

  • HTTP_MIMETYPE を “application/x-www-form-urlencoded” にする
  • 送信内容は BODY に記載する
string URL = "http://hoge.com/foo/bar.php";
list PARAMS = [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"];
string BODY = "key1=value1&key2=value2";
 
key RequestID = llHTTPRequest(URL, PARAMS, BODY);

1-b) 外部鯖で PST/PDT を取得する (PHP)

date_default_timezone_set を America/Los_Angeles に設定すると通信発生時の PST / PDT を取得できるため、LSL 側からタイムスタンプを送信する必要はない。PST / PDT の切替も PHP 任せで良い(勝手に夏時間に変更してくれる)。

<?php
date_default_timezone_set("America/Los_Angeles");
$today = date("Y-m-d H:i:sT");
 
// ex) 2018-03-30 22:33:03PDT

1-c) 外部鯖で送信元の情報を取得する (PHP)

llHTTPRequest() を使いインワールドから外部鯖にアクセスした場合、$_SERVER に以下の情報が格納されている1)ため、特に LSL 側から送信せずとも情報を取得できる。

  • $_SERVER[“HTTP_X_SECONDLIFE_OBJECT_NAME”] ⇒ 送信元オブジェクト名
  • $_SERVER[“HTTP_X_SECONDLIFE_OBJECT_KEY”] ⇒ 送信元オブジェクト UUID
  • $_SERVER[“HTTP_X_SECONDLIFE_REGION”] ⇒ 送信元オブジェクトが置かれているリージョン名とその座標 ex) Serpentata (257792, 263168)
  • $_SERVER[“HTTP_X_SECONDLIFE_LOCAL_POSITION”] ⇒ 送信元オブジェクトのリージョン座標 ex) (164.346359, 106.232956, 104.000000)
  • $_SERVER[“HTTP_X_SECONDLIFE_OWNER_NAME”] ⇒ 送信元オブジェクトの所有者名 ex) fk0724 Resident
  • $_SERVER[“HTTP_X_SECONDLIFE_OWNER_KEY”] ⇒ 送信元オブジェクトの所有者 UUID

2-a) LSL側の仕様

  1. 以下のログを収集し、外部鯖の PHP に投げる
    • ギフトお持ち帰りログ
    • ブロガーパックお持ち帰りログ
    • ガチャのアイテム交換ログ
  2. 実装はユーザ関数で行い、各種スクリにコピペで動くようにする

2-b) ユーザ関数 : uuPushLog(string type, string av_name, key av_key, string extension)

  • string type : 何に関するログなのか(G : ギフト / B : ブロガーパック / E : 交換)
  • string av_name : アバター名
  • key av_key : アバターの UUID
  • string extension : 通信内容の拡張
key uuPushLog(string type, string av_name, key av_key, string extension){
    string URL = "http://hoge.com/foo/bar.php";
    list PARAMS = [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"];
    string BODY = "type=" + llEscapeURL(type);
    BODY += "&avname=" + llEscapeURL(av_name);
    BODY += "&avkey=" + (string)av_key;
    BODY += "&extension=" + llEscapeURL(extension);
    return llHTTPRequest(URL, PARAMS, BODY);
}

2-c) PHP 側の仕様

  1. 受け取ったデータをどうするのか? という部分は逐次変更する可能性があるため、LogSaveClass として切り離しておく
    • 1日単位のテキストデータとして鯖に保管する ⇒ ./save/oneday.php
    • 種類別のテキストデータとして鯖に保管する ⇒ ./save/type.php
    • とにかく全データを MySQL に入れてしまう ⇒ ./save/mysql.php  e.t.c.
  2. LogSaveClass に以下のデータを受け渡す
    • 受信日時
    • $_SERVER 各種
    • $_POST 各種

2-d) PHP での受信部分の実装

LogSaveClass にデータを渡すだけのもの。

<?php
date_default_timezone_set("America/Los_Angeles");
header("content-type: text/plain; charset=utf-8");
 
require_once('save/oneday.php');
$LOG = new LogSaveClass;
$LOG->save(date("Y-m-d H:i:sT"), $_SERVER, $_POST);