【mBaaS】プロキシ環境下でのPHPの設定

ニフティクラウド mobile backendではREST APIを提供しているため、SDKが用意されている
〔iOS/Android/JavaScript/monaca/Unity〕以外のプラットフォームからでも利用することができます。

早速PHPを使ってREST APIを利用してみたいと思うのですが、
自分が作業を行っている環境では、プロキシの問題があります＞＜
そのため、今回はプロキシ環境下でのPHPの設定について書き留めておこうと思います。

# 通常環境でのデータストアへの保存方法
通常環境でPHPを使ってREST APIを利用してデータストアへ保存する場合はこちらの方法になります。

```php
<?php
    // リクエスト
    $method = 'POST';
    $fqdn   = 'mb.api.cloud.nifty.com';
    $api_version = '2013-09-01';
    $path        = 'classes/test'; //testクラスのNCMBObjectを作成
    $timestamp = date(DATE_ISO8601, time());
    $application_key = 'YOUR_APPLICATION_KEY';
    $client_key      = 'YOUR_CLIENT_KEY';
    //　シグネチャの生成
    $header_string  = "SignatureMethod=HmacSHA256&";
    $header_string .= "SignatureVersion=2&";
    $header_string .= "X-NCMB-Application-Key=".$application_key . "&";
    $header_string .= "X-NCMB-Timestamp=".$timestamp;
    $signature_string  = $method . "\n";
    $signature_string .= $fqdn . "\n";
    $signature_string .= "/" . $api_version . "/" . $path . "\n";
    $signature_string .= $header_string;
    $signature = base64_encode(hash_hmac("sha256", $signature_string, $client_key, true));

    // リクエストURL
    $url = "https://$fqdn/$api_version/$path";
    // オブジェクトに値を設定
    $data = array(
                  "key" => "value"
                  );
    $headers = array(
                     'Content-Type: application/json',
                     'X-NCMB-Application-Key: '.$application_key,
                     'X-NCMB-Signature: '.$signature,
                     'X-NCMB-Timestamp: '.$timestamp
                     );
    $http = array(
                  'method' => 'POST',
                  'content' => json_encode($data),//データ
                  'header' => implode("\r\n", $headers),//ヘッダー
                  'ignore_errors' => true
                  );
    $options = array('http' => $http);
    // データストアへの登録を実施
    print("Start to request: \n");
    $response = file_get_contents($url, false, stream_context_create($options));
    print($response);
```
しかし、こちらのコードだけでは、プロキシ環境ではエラーになってしまいます＞＜

# プロキシ用設定をしたデータストアへの保存方法
続いて、プロキシ用設定を追加してPHPを使ってREST APIを利用してデータストアへ保存する方法を記載いたします。
### ・プロキシ設定用ファイル
```php:proxy.php
<?php
    // プロキシ
    $proxy_host = "プロキシのサーバアドレス";
    $proxy_port = "ポート番号";
    $proxy_user = "ユーザー名";
    $proxy_pass = "パスワード";
    // 認証
    $proxy_auth = base64_encode("$proxy_user:$proxy_pass");
    // ヘッダー
    $proxy_header_set = "Proxy-Authorization: Basic $proxy_auth";
    // http_set
    $proxy_http_set = "tcp://$proxy_host:$proxy_port";
?>
```
### ・プロキシ設定用ファイルをincludeしたデータストアへの保存方法

```php
<?php
    // リクエスト
    $method = 'POST';
    $fqdn   = 'mb.api.cloud.nifty.com';
    $api_version = '2013-09-01';
    $path        = 'classes/test'; //testクラスのNCMBObjectを作成
    $timestamp = date(DATE_ISO8601, time());
    $application_key = 'YOUR_APPLICATION_KEY';
    $client_key      = 'YOUR_CLIENT_KEY';
    //　シグネチャの生成
    $header_string  = "SignatureMethod=HmacSHA256&";
    $header_string .= "SignatureVersion=2&";
    $header_string .= "X-NCMB-Application-Key=".$application_key . "&";
    $header_string .= "X-NCMB-Timestamp=".$timestamp;
    $signature_string  = $method . "\n";
    $signature_string .= $fqdn . "\n";
    $signature_string .= "/" . $api_version . "/" . $path . "\n";
    $signature_string .= $header_string;
    $signature = base64_encode(hash_hmac("sha256", $signature_string, $client_key, true));
    
    // プロキシ設定用ファイルの読み込み
    include 'proxy.php';

    // リクエストURL
    $url = "https://$fqdn/$api_version/$path";
    // オブジェクトに値を設定
    $data = array(
                  "key" => "value"
                  );
    $headers = array(
                     'Content-Type: application/json',
                     'X-NCMB-Application-Key: '.$application_key,
                     'X-NCMB-Signature: '.$signature,
                     'X-NCMB-Timestamp: '.$timestamp,
                     $proxy_header_set // プロキシ用設定
                     );
    $http = array(
                  'proxy' => $proxy_http_set, // プロキシ用設定
                  'request_fulluri' => true, // プロキシ用設定
                  'method' => 'POST',
                  'content' => json_encode($data),//データ
                  'header' => implode("\r\n", $headers),//ヘッダー
                  'ignore_errors' => true
                  );
    $options = array('http' => $http);
    // データストアへの登録を実施
    print("Start to request: \n");
    $response = file_get_contents($url, false, stream_context_create($options));
    print($response);
```

### ・変更箇所
元のコードに追加した箇所は３点になります。
・proxy.phpファイルをincludeする

```php
// プロキシ設定用ファイルの読み込み
include 'proxy.php';
```
・headerに$proxy_header_setをセットする

```php
$headers = array(
                 'Content-Type: application/json',
                 'X-NCMB-Application-Key: '.$application_key,
                 'X-NCMB-Signature: '.$signature,
                 'X-NCMB-Timestamp: '.$timestamp,
                 $proxy_header_set // プロキシ用設定
                 );
```

・httpにproxyとrequest_fulluriをセットする

```php
$http = array(
              'proxy' => $proxy_http_set, // プロキシ用設定
              'request_fulluri' => true, // プロキシ用設定
              'method' => 'POST',
              'content' => json_encode($data),//データ
              'header' => implode("\r\n", $headers),//ヘッダー
              'ignore_errors' => true
              );
```

これで、プロキシ環境でもPHPを使ってREST APIを利用してmBaaSのデータストアへ保存することができるはずです。

# PHP Warning:  date(): It is not safe to rely on the system's timezone settings.の警告
このままこのコードをコピーして使用した場合、もしかすると**PHP Warning:  date(): It is not safe to rely on the system's timezone settings.**の警告が出てしまうかもしれません。

その場合は、php.iniの設定で **date.timezone** を検索し、
```
date.timezone = "Asia/Tokyo"
```
と設定することで、この警告はなくなります。