omoon.org の裏側 〜fuelphp の task 活用例〜

Post on 11-Jun-2015

5.244 Views

Category:

Technology

5 Downloads

Preview:

Click to see full reader

DESCRIPTION

2013/10/12 の FuelPHP&CodeIgniter ユーザの集い LT 資料です。

TRANSCRIPT

omoon.org の裏側FuelPHP の task 活用例

FuelPHP&CodeIgniter ユーザの集い(FuelPHP東京勉強会#5、CodeIgniter talk #2)October 12, 2013

Sotaro OMURA@omoon

About Me

About Me

• Sotaro OMURA

About Me

• Sotaro OMURA•大阪から来ました

About Me

• Sotaro OMURA•大阪から来ました•Kansai PHP Users Group Staff

About Me

• Sotaro OMURA•大阪から来ました•Kansai PHP Users Group Staff• PHP歴は12年ほど(最近はFuelPHP)

About Me

• Sotaro OMURA•大阪から来ました•Kansai PHP Users Group Staff• PHP歴は12年ほど(最近はFuelPHP)• omoon.org

About Me

• Sotaro OMURA•大阪から来ました•Kansai PHP Users Group Staff• PHP歴は12年ほど(最近はFuelPHP)• omoon.org•@omoon

About Me

• Sotaro OMURA•大阪から来ました•Kansai PHP Users Group Staff• PHP歴は12年ほど(最近はFuelPHP)• omoon.org•@omoon

めんどくさがり

About Me

About Me

フレームワークを使ったサンプルアプリケーション

 1  <?php  2  require  __DIR__  .  '/../vendor/autoload.php';  3    4  $app  =  new  Silex\Application();  5    6  $app-‐>register(new  Silex\Provider\TwigServiceProvider(),  array(  7          'twig.path'  =>  __DIR__.'/../views',  8  ));  9  10  //  データベース接続情報の読込11  $env  =  getenv('APP_ENV')  ?:  'development';12  $config  =  require  __DIR__  .  "/../config/$env.php";13  $app-‐>register(new  Silex\Provider\DoctrineServiceProvider(),  array(14          'db.options'  =>  $config['db'],15  ));16  17  //  トップ画面18  $app-‐>get('/',  function(Silex\Application  $app)  {19          $posts  =  $app['db']-‐>fetchAll('20                  SELECT  name,  message,  unix_timestamp(created)  as  created21                  FROM  posts  ORDER  BY  created  DESC  LIMIT  522          ');23          return  $app['twig']-‐>render('index.twig',  array(24                  'posts'  =>  $posts,25          ));26  });27  28  //  投稿処理29  $app-‐>post('/speak',  function(Silex\Application  $app)  {30          $name  =  $app['request']-‐>get('name');31          $message  =  $app['request']-‐>get('message');32          if  ($name  &&  $message)  {33                  $app['db']-‐>insert('posts',  array('name'  =>  $name,  'message'  =>  $message));34          }35          return  $app-‐>redirect('/');36  });37  38  $app-‐>run();

 1  <?php  2  require  __DIR__  .  '/../vendor/autoload.php';  3    4  $app  =  new  Silex\Application();  5    6  $app-‐>register(new  Silex\Provider\TwigServiceProvider(),  array(  7          'twig.path'  =>  __DIR__.'/../views',  8  ));  9  10  //  データベース接続情報の読込11  $env  =  getenv('APP_ENV')  ?:  'development';12  $config  =  require  __DIR__  .  "/../config/$env.php";13  $app-‐>register(new  Silex\Provider\DoctrineServiceProvider(),  array(14          'db.options'  =>  $config['db'],15  ));16  17  //  トップ画面18  $app-‐>get('/',  function(Silex\Application  $app)  {19          $posts  =  $app['db']-‐>fetchAll('20                  SELECT  name,  message,  unix_timestamp(created)  as  created21                  FROM  posts  ORDER  BY  created  DESC  LIMIT  522          ');23          return  $app['twig']-‐>render('index.twig',  array(24                  'posts'  =>  $posts,25          ));26  });27  28  //  投稿処理29  $app-‐>post('/speak',  function(Silex\Application  $app)  {30          $name  =  $app['request']-‐>get('name');31          $message  =  $app['request']-‐>get('message');32          if  ($name  &&  $message)  {33                  $app['db']-‐>insert('posts',  array('name'  =>  $name,  'message'  =>  $message));34          }35          return  $app-‐>redirect('/');36  });37  38  $app-‐>run();

 1  <?php  2  require  __DIR__  .  '/../vendor/autoload.php';  3    4  $app  =  new  Silex\Application();  5    6  $app-‐>register(new  Silex\Provider\TwigServiceProvider(),  array(  7          'twig.path'  =>  __DIR__.'/../views',  8  ));  9  10  //  データベース接続情報の読込11  $env  =  getenv('APP_ENV')  ?:  'development';12  $config  =  require  __DIR__  .  "/../config/$env.php";13  $app-‐>register(new  Silex\Provider\DoctrineServiceProvider(),  array(14          'db.options'  =>  $config['db'],15  ));16  17  //  トップ画面18  $app-‐>get('/',  function(Silex\Application  $app)  {19          $posts  =  $app['db']-‐>fetchAll('20                  SELECT  name,  message,  unix_timestamp(created)  as  created21                  FROM  posts  ORDER  BY  created  DESC  LIMIT  522          ');23          return  $app['twig']-‐>render('index.twig',  array(24                  'posts'  =>  $posts,25          ));26  });27  28  //  投稿処理29  $app-‐>post('/speak',  function(Silex\Application  $app)  {30          $name  =  $app['request']-‐>get('name');31          $message  =  $app['request']-‐>get('message');32          if  ($name  &&  $message)  {33                  $app['db']-‐>insert('posts',  array('name'  =>  $name,  'message'  =>  $message));34          }35          return  $app-‐>redirect('/');36  });37  38  $app-‐>run();

なんかすみません

FuelPHPとのなれそめ

お好きですね

他に

最近は

JSONでやりとり

ありがとう

さて

omoon.org

omoon.org

omoon.org

• 2002年ごろスタート

omoon.org

• 2002年ごろスタート•写真と一行コメントだけ

omoon.org

• 2002年ごろスタート•写真と一行コメントだけ•最初は HTML + FTP アップロード

めんどくさがり

簡易化の歴史

簡易化の歴史

• Flickr

簡易化の歴史

• Flickr• PHP + MySQL

簡易化の歴史

• Flickr• PHP + MySQL• Flickr + Eye-Fi

簡易化の歴史

• Flickr• PHP + MySQL• Flickr + Eye-Fi•独自 cron job

オレオレなので完成しない

Tasks are classes that can be run through the command line or set up as a cron job. They are generally used for background processes, timed tasks and maintenance tasks. Tasks can calls models and other classes just like controllers.

Tasks

Tasks

•コマンドラインから呼べる

Tasks

•コマンドラインから呼べる• cron jobとして使える

Tasks

•コマンドラインから呼べる• cron jobとして使える•バックグラウンド処理とか

Tasks

•コマンドラインから呼べる• cron jobとして使える•バックグラウンド処理とか•定期的な処理とか

Tasks

•コマンドラインから呼べる• cron jobとして使える•バックグラウンド処理とか•定期的な処理とか•メンテナンスに

Tasks

•コマンドラインから呼べる• cron jobとして使える•バックグラウンド処理とか•定期的な処理とか•メンテナンスに•モデルやクラスをコントローラから呼ぶ時みたいに呼べる

いけるかも

やってみた

▾  fuel/    ▾  app/        ▸  cache/        ▾  classes/            ▸  controller/            ▸  model/            ▸  twig/            ▸  view/                flickr.php        ▾  config/            ▸  development/            ▸  production/            ▸  test/                config.php                db.php                parser.php                rest.php                routes.php        ▸  lang/        ▸  less/        ▸  logs/        ▸  migrations/        ▸  modules/        ▾  tasks/                flickr.php                robots.php        ▸  tests/        ▸  tmp/        ▾  vendor/            ▸  Goutte/            ▾  phpFlickr/                    auth.php                    example.php                    getToken.php                    phpFlickr.php                    README.txt            ▸  Twig/                .gitkeep

外部ライブラリ

▾  fuel/    ▾  app/        ▸  cache/        ▾  classes/            ▸  controller/            ▸  model/            ▸  twig/            ▸  view/                flickr.php        ▾  config/            ▸  development/            ▸  production/            ▸  test/                config.php                db.php                parser.php                rest.php                routes.php        ▸  lang/        ▸  less/        ▸  logs/        ▸  migrations/        ▸  modules/        ▾  tasks/                flickr.php                robots.php        ▸  tests/        ▸  tmp/        ▾  vendor/            ▸  Goutte/            ▾  phpFlickr/                    auth.php                    example.php                    getToken.php                    phpFlickr.php                    README.txt            ▸  Twig/                .gitkeep

クラス

require_once  APPPATH  .  'vendor'  .  DS  .  'phpFlickr'  .  DS  .  'phpFlickr.php';class  Flickr{        protected  static  $_instance  =  null;        private  function  __construct()        {                $this-‐>api  =  new  phpFlickr(                        'xxxxxxxxxxxxxxxxxxxx'  //Config::get('app.flickr_api_key')                );        }        public  static  function  forge()        {                if  (empty(self::$_instance))  {                        static::$_instance  =  new  static();                }                return  static::$_instance-‐>api;        }}

▾  fuel/    ▾  app/        ▸  cache/        ▾  classes/            ▸  controller/            ▸  model/            ▸  twig/            ▸  view/                flickr.php        ▾  config/            ▸  development/            ▸  production/            ▸  test/                config.php                db.php                parser.php                rest.php                routes.php        ▸  lang/        ▸  less/        ▸  logs/        ▸  migrations/        ▸  modules/        ▾  tasks/                flickr.php                robots.php        ▸  tests/        ▸  tmp/        ▾  vendor/            ▸  Goutte/            ▾  phpFlickr/                    auth.php                    example.php                    getToken.php                    phpFlickr.php                    README.txt            ▸  Twig/                .gitkeep

タスク

namespace  Fuel\Tasks;class  Flickr{        public  static  function  run($limit  =  4)        {                $response  =  \Flickr::forge()-‐>photos_search(                        array(                                'user_id'  =>  '94387617@N00',                                'per_page'  =>  $limit,                                'tags'  =>  'asgt,cover',                                'tag_mode'  =>  'all',                                'sort'  =>  'date-‐taken-‐desc'                        )                );                foreach  ($response['photo']  as  $photo)  {                        $r  =  \Flickr::forge()-‐>photos_getInfo($photo['id']);                        $e  =  \Flickr::forge()-‐>photos_getExif($photo['id']);                        //print_r($e['camera']);                        if  (null  ===  \Model_Coverphoto::find_by('flickr_id',  $r['photo']['id']))  {                                $r['photo']['dates']['taken'];                                $coverphoto  =  \Model_Coverphoto::forge();                                $coverphoto-‐>flickr_id  =  $r['photo']['id'];                                $coverphoto-‐>title  =  $r['photo']['description'];                                $coverphoto-‐>taken_at  =  $r['photo']['dates']['taken'];                                $coverphoto-‐>camera  =  $e['camera'];                                $coverphoto-‐>data  =  json_encode($r['photo']);                                $coverphoto-‐>save();                        }                }        }}

#  crontab  -‐e

*  *  *  *  *  cd  /var/www/omoon.org;  /usr/bin/php  oil  refine  flickr:run

omoon.org

タグ付けだけで更新可能

iPhoneのflickrアプリでも

今後の展望

task を積極的に使いましょう

ありがとうございました

top related