phalcon phpのincubatorでcurlを使ったバッチ処理(Task)を書いてみる



##概要
phalcon phpの検証中です。
curlを使ったhttpリクエストとかってどうやるんだろ？と思い、調べてみました。
公式ドキュメントを見ると、[Requestクラス](http://docs.phalconphp.com/en/latest/api/Phalcon_Http_Request.html)は存在するのですが、
これはリクエストパラメータの取得だったりを担うモノでどうも違うなと。
で、[phalconのgithub](https://github.com/phalcon/)を見たところ、[incubator](https://github.com/phalcon/incubator)というライブラリがあるようで。

##サンプル用のプロジェクトを作成
ここでは「sample-phalcon」という名称でプロジェクトを作成します。

```
$ phalcon project sample-phalcon

Phalcon DevTools (1.3.4)


  Success: Controller "index" was successfully created.


  Success: Project 'sample-phalcon' was successfully created.
```

##incubatorのインストール
自分の環境のphalconがver1.x系なので、READMEに従ってver1.3.5を入れてみる。

```
$ cd sample-phalcon/
$ curl -sS https://getcomposer.org/installer | php
$ vim composer.json
$ cat composer.json
{
  "require": {
    "phalcon/incubator": "~1.3.5"
  }
}
$ php composer.phar install
```

##Bootstrap(cli.php)を書く
バッチ(Task)実行用のBootstrapを書く。
書き方は[公式ドキュメント](http://docs.phalconphp.com/en/latest/reference/cli.html#tasks)に記載がある。
これに、[incubatorのREADME](https://github.com/phalcon/incubator#autoloading-from-the-incubator)に記載のライブラリ読み込みを追記すればOK

```
$ vim app/cli.php
```

```php:cli.php
<?php

 use Phalcon\DI\FactoryDefault\CLI as CliDI,
     Phalcon\CLI\Console as ConsoleApp;

 define('VERSION', '1.0.0');

 //Using the CLI factory default services container
 $di = new CliDI();

 // Define path to application directory
 defined('APPLICATION_PATH')
 || define('APPLICATION_PATH', realpath(dirname(__FILE__)));

 /**
  * Register the autoloader and tell it to register the tasks directory
  */
 $loader = new \Phalcon\Loader();
 $loader->registerDirs(
     array(
         APPLICATION_PATH . '/tasks'
     )
 );

$loader->registerNamespaces(array(
    'Phalcon' => __DIR__.'/../vendor/phalcon/incubator/Library/Phalcon/',
));

 $loader->register();

 // Load the configuration file (if any)
 if(is_readable(APPLICATION_PATH . '/config/config.php')) {
     $config = include APPLICATION_PATH . '/config/config.php';
     $di->set('config', $config);
 }

 //Create a console application
 $console = new ConsoleApp();
 $console->setDI($di);

 /**
 * Process the console arguments
 */
 $arguments = array();
 foreach($argv as $k => $arg) {
     if($k == 1) {
         $arguments['task'] = $arg;
     } elseif($k == 2) {
         $arguments['action'] = $arg;
     } elseif($k >= 3) {
        $arguments['params'][] = $arg;
     }
 }

 // define global constants for the current task and action
 define('CURRENT_TASK', (isset($argv[1]) ? $argv[1] : null));
 define('CURRENT_ACTION', (isset($argv[2]) ? $argv[2] : null));

 try {
     // handle incoming arguments
     $console->handle($arguments);
 }
 catch (\Phalcon\Exception $e) {
     echo $e->getMessage();
     exit(255);
 }
```

##Taskクラスを作成

処理を実行するTaskクラスを作成する。
Http ClientのRequestクラスの使い方は[README](https://github.com/phalcon/incubator/tree/master/Library/Phalcon/Http/Client)に書いてある。

```
$ mkdir -p app/tasks
$ vim app/tasks/RequestsampleTask.php
```

```php:RequestsampleTask.php
<?php

use Phalcon\Http\Client\Request;

class RequestSampleTask extends \Phalcon\CLI\Task
{
    const RSS_URL = 'http://feeds.feedburner.com/mtl/feed';

    public function mainAction() {

        $response = $this->getResponse(self::RSS_URL);
        $response = $this->parseResponse($response);

        print_r($response);
    }

    private function getResponse($url) {

        $provider  = Request::getProvider();
        $provider->setBaseUri($url);
        return $provider->get('', array());
    }

    private function parseResponse($response) {

        return simplexml_load_string($response->body);
    }
}
```

##実行
```
$ php app/cli.php Requestsample
```
成功すればRSSフィードが取得できます。