LaravelでRedisを使ってみる

先日はLaravelのscaffoldでごにょごにょやってみました。
今日は、ElastiCashでredisたてて、ゴニョゴニョしてみたいと思います。

Redisは最近では有名になってきたキーバリューストアですね。
defaultportは6379です。

AWSのElastiCacheからmemcacheかredisか選ぶところがありますので
redisを選んでcreateってやるだけで作れます。
(自前でも簡単にたてれます。)

さっそくこの前構築したプログラムで接続できるようにしてみます。

app/config/database.php

112   'redis' => array(
113
114     'cluster' => true,
115
116     'default' => array(
117       'host'     => 'myredis.xxxxxx.0001.apne1.cache.amazonaws.com',
118       'port'     => 6379,
119       'database' => 0,
120     ),
121
122   ),

controller側は下記。
app/controllers/HomeController.php

  1 <?php
  2
  3 class HomeController extends BaseController {
  4
  5   protected $member;
  6   protected $redis;
  7
  8   public function __construct(Member $member)
  9   {
 10     $this->member = $member;
 11     $this->redis = Redis::connection();
 12   }
 13
 14   public function show()
 15   {
 16     $token = $this->redis->get("home:token:{user_id}");
 17     if (!$token) {
 18       $token = Hash::make('secret');
 19       $this->redis->set("home:token:{user_id}", $token);
 20     }
 21     var_dump($this->redis->get("home:token:{user_id}"));
 22
 23     $members = Member::where('id', '>=', 1)->paginate(2);
 24     $list = DB::select('select name,email from members');
 25
 26     return View::make('home', compact('members','list'));
 27   }
 28
 29 }

無事格納されました。(※ここではまだuser_idないですけど・・・。)
token管理などに便利ですね。

続く。

参考

http://laravel.com/docs/redis

JSON情報まとめ

JSON
RFC4627

JSON ハイジャック対策

  • X-Requested-With: XMLHttpRequestを必須とする
  • Content-Type を “application/json; charset=utf-8″ にする
  • “X-Content-Type-Options: nosniff” ヘッダーを追加する
  • eval インジェクション対策
    ブラウザ上で文字列をjsonに変換する場合は下記の関数を利用する
    JSON.parse() IE8以降なら使える # セキュリティの観点からもIE7は早々に切り捨てたほうがよさそうですね
    $.parseJSON() jQuery

    クロスサイト・スクリプティング対策
    “<" と ">” は、それぞれ \u003C と \u003E にUnicodeエスケープする
    $(‘#name’).html(‘hoge’); は注意。文字列の追加なら$(‘#name’).text(‘hoge’);を使う

    参考
    JSON セキュリティ対策

    botで困った時の対処法

    robots.txtに記載してもガンガンアクセスがくるお行儀の悪いbotっていますよね。

    自分は秒間10クエリくらい投げてくるお行儀の悪いbotに下記を実行しました。
    負けた気がしますがしょうがないのです。

    iptables -I INPUT -s xxx.xxx.xxx.0/24 -j DROP

    まぁ、、、メモです。

    PHP framework Laravel その2

    laravelでのscaffoldができるようになったので実際にデータを出力したり整形したりしてみます。

    まずはwelcomeページにlaravelでのscaffoldができるようになったので
    作成したmembersテーブルの情報を出力します。

    ■routes.php
    routes.phpのデフォルトを下記のように修正し、HomeControllerに流すようにします。

    <?php

    //Route::get('/', function()
    //{
    //        return View::make('hello');
    //});
    Route::resource('', 'HomeController@show');
    Route::resource('home', 'HomeController@show');
    Route::resource('members', 'MembersController');

    また、httpsを強制にする場合は下記のように記述します。

    Route::get('foo', array('https', function()
    {
        return 'Must be over HTTPS';
    }));

    URLからパラメータを取得する場合は、下記。

    Route::get('user/{id}', function($id)
    {
        return 'User '.$id;
    });

    where句でfilterできます。

    Route::get('user/{id}/{name}', function($id, $name)
    {
        //
    })
    ->where(array('id' => '[0-9]+', 'name' => '[a-z]+'));

    ただ、同じ記述を何回も書くことになる場合はpatternで書くこともできます。

    Route::pattern('id', '[0-9]+');

    Route::get('user/{id}', function($id)
    {
        // Only called if {id} is numeric.
    });

    filterとして、

    Route::filter('foo', function()
    {
        if (Route::input('id') == 1)
        {
            //
        }
    });

    他にもいろいろありますが、とりあえず進みます。詳細はこちら

    ■ DBの切り替え
    readとwriteで向く先のサーバーを変えたい場合は app/config/app.phpで設定すればOKです。

    'mysql' => array(
        'read' => array(
            'host' => '192.168.1.1',
        ),
        'write' => array(
            'host' => '192.168.1.2'
        ),
        'driver'    => 'mysql',
        'database'  => 'database',
        'username'  => 'root',
        'password'  => '',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),

    select
    第二引数はbindしてくれます。

    $results = DB::select('select * from users where id = ?', array(1));

    DB::statementで生SQLが投げられます。

    $results = DB::statement('select * from users where id = ?', array(1));

    generateしたデフォルトは下記。

    $ vi ./app/controllers/HomeController.php
    <?php

    class HomeController extends BaseController {

      public function show()
      {
       
        return View::make('hello');
      }

    }

    member情報を取ってくる場合は、下記。

      protected $member;

      public function __construct(Member $member)
      {
        $this->member = $member;
      }
      public function show()
      {
        $members = $this->member->all();
        $list = DB::select('select name,email from members');

        return View::make('home', compact('members','list'));
        // compact使わないで下記のようにも書けます。->with使っても書けます。
        // return View::make('home', array('members' => $members, 'data' => $list));
      }

    また、DB::statement(‘select * from members’);で、生クエリが投げられます。

    transaction

        DB::transaction(function()
        {
        DB::table('users')->update(array('votes' => 1));
         
        DB::table('posts')->delete();
        });

    DB::getQueryLog();で実行済みSQLの取得もできます。
    メモリ上に乗せると大変なことになるような場合は
    disableQueryLogを実行してからSQLを実行します。(bulkInsertなど)

    DB::connection()->disableQueryLog();

    DB::flushQueryLog();で、ログのflushができます。

    ■ Pagenator

    $members = Member::where('id', '>=', 1)->paginate(2);

    getHogeHogeなアクセサでデータが取得できます。

        $members = Member::where('id', '>=', 1)->paginate(2);
        var_dump($members->getCurrentPage());
        var_dump($members->getLastPage());
        var_dump($members->getPerPage());
        var_dump($members->getTotal());
        var_dump($members->getFrom());
        var_dump($members->getTo());
        var_dump($members->count());

    ■ Validator
    Validatorは routes.phpやcontrollerで行うのが一般的なようです。参考

    routes.phpはすっきりさせたいのでContrllerに書くのがよいかな。

    // ルール
    $rules = [
        'username' => 'required|alpha_dash|unique:users',
        'email'    => 'required|email|unique:users',
        'password' => 'required|between:4,20|confirmed',
        'password_confirmation' => 'between:4,20',
    ];
    $validator = Validator::make($rules);

    // Validation 作成
    $validator = Validator::make($inputs, $rules);

    if ($validator->fails()) {
        // Validation 失敗
        return Redirect::back()->withInput()->withErrors($validator);
    }
    if ($validator->passes()) {
        // 成功
    }

    あとは、負荷かけて捌けるようならLaravelいいね!と言える。