IBM Cloud FunctionsでPHPアプリケーションを作る

[IBM Cloud Functions](https://console.bluemix.net/openwhisk/)というFaaS環境でPHPアプリケーションを作る。IMB Cloud Functionsは[Apache OpenWhisk](https://openwhisk.apache.org/)というOSSをベースに作られている。

## IBM Cloudのアカウントを作る

IBM Cloudのアカウントをまだ持っていない場合は[このページ](https://www.ibm.com/cloud-computing/jp/ja/bluemix/lite-account/)などから登録しよう。このページでなくとも、登録時はライト・アカウントという無償プランになるっぽい。

## 値段

値段は[IBM Cloud Functions - Pricing](https://console.bluemix.net/openwhisk/learn/pricing)に書いてある。

「1 GB のメモリー割り振りにつき、実行 1 秒あたり $ 0.000017」という値段設定。

400,000 GB 秒までは無料。

例ではアクション実行時間が500ミリ秒、アクション・メモリーが128MB、一ヶ月あたりの実行が5,000,000回のときは無料と書いてある。

実際

0.5 s * 0.128 GB * 5,000,000 = 320,000 GB 秒 &lt; 400,000 GB 秒

なので、無用枠に収まる。ちなみに一秒ごとに一回実行したとすると一ヶ月で60*60*24*30=2,592,000回になる。

## 実行できるアクション

[Create and invoke Actions](https://console.bluemix.net/docs/openwhisk/openwhisk_actions.html#openwhisk_actions)（日本語版は更新が遅いので英語版を見たほうがよい）によれば使える環境はJavaScript, Swift, Python, Java, PHP, Docker。Dockerが使えるので基本的になんでもできる。より詳しくは[Cloud Functions システムの詳細](https://console.bluemix.net/docs/openwhisk/openwhisk_reference.html#openwhisk_reference)に書いてある。

## CLI

実行するコードが単一ファイルならweb UIで設定できるが、複数ファイルからなる場合はzipにして、CLIでアップロードする必要がある。

CLIのダウンロード方法は[ここ](https://console.bluemix.net/openwhisk/learn/cli)に書いてある。

ログインのコマンドが

```
$ bx login -a api.ng.bluemix.net -o  -s
```

となっているが、`-o`に「CLOUD FOUNDRY 組織」、`-s`に「CLOUD FOUNDRY スペース」を設定する必要がある。「CLOUD FOUNDRY 組織」には登録したメールアドレス、「CLOUD FOUNDRY スペース」にdevを指定するとログインできる。

```
$ bx login -a api.ng.bluemix.net -o <メールアドレス> -s dev
```

## アクションの作成

[Create and invoke Actions](https://console.bluemix.net/docs/openwhisk/openwhisk_actions.html#creating-php-actions)（英語版）にPHPアクションの作り方が書いてある。PHPのバージョンは7.1。例えばhello.phpというファイル名で以下のソースコードを含んだファイルを作る。

```php
<?php
function main(array $args) : array
{
    $name = $args["name"] ?? "stranger";
    $greeting = "Hello $name!";
    echo $greeting;
    return ["greeting" => $greeting];
}
```

PHPアクションではmainという関数が実行される。mainには連想配列をパラメータとして渡すことが出来て、戻り値として連想配列を返す様に書く。

```
$ bx wsk action create helloPHP hello.php
```

でhelloPHPという名前でアクションを作る。ドキュメントにはbxが最初についてないが、つけないとwskというコマンドが無いエラーになるので、bxを最初に付ける必要がある。

作ったアクションは以下のコマンドで実行できる。

```
$ bx wsk action invoke --result helloPHP --param name World
```
```
  {
      "greeting": "Hello World!"
  }
```

複数パラメータを与えたい時は

```
$ bx wsk action invoke --result helloPHP --param key1 value1 --param key2 value2
```

などとする。

複数ファイルから成る場合はzipで固める。そのときエントリーポイントとなるmain関数が書かれているファイルは`index.php`という名前でなくてはいけない。composerで入れた依存するパッケージを加えたい場合は

```
$ zip -r helloPHP.zip index.php vendor
```

でzip化して

```
$ bx wsk action create helloPHP --kind php:7.1 helloPHP.zip
```

でアクションを作る。zipにした場合は拡張子から判断できないため`--kind php:7.1`で種類を指定してあげる必要がある。更新したい時は`update`を使う。

```
$ bx wsk action update helloPHP --kind php:7.1 helloPHP.zip
```

## アクションの設定

ここから先はWeb UIでやったほうがわかりやすい。

https://console.bluemix.net/openwhisk/actions でアクション名をクリックするとアクションの詳細画面に移る。

デフォルトパラメータでアクションのデフォルトパラメータを設定できる。

ランタイムに行くと、使用するメモリなどを修正できる。デフォルトでは256MBになっているので、そんなに必要ない時は変更しよう。最小値は128MB。[memory_get_peak_usage](http://jp2.php.net/manual/ja/function.memory-get-peak-usage.php)を使うとPHP によって割り当てられたメモリの最大値がわかるので参考になるかも。

```php
echo number_format(memory_get_peak_usage(true)). PHP_EOL;
```

などで確認できる。

## トリガーとルールの作成

https://console.bluemix.net/openwhisk/triggers からトリガーを作成できる。

トリガーの種類は以下の通り。

<dl>
<dt>Cloudant</dt>
<dd>特定の Cloudant データベースが更新されるたびにアクションをトリガーします。</dd>
<dt>Custom Trigger</dt>
<dd>特定の REST エンドポイントが POST されるたびにアクションをトリガーします。</dd>
<dt>GitHub</dt>
<dd>GitHub リポジトリーが更新されるたびにアクションをトリガーします。</dd>
<dt>MessageHub</dt>
<dd>新規メッセージがキューに書き込まれるたびにアクションをトリガーします。</dd>
<dt>Mobile Push</dt>
<dd>プッシュ通知がモバイル・アプリに送信されるたびにアクションをトリガーします。</dd>
<dt>Periodic</dt>
<dd>時刻に基づいてアクションをトリガーします。</dd>
</dt>

例えばPeriodicで1分ごとに実行できる。トリガーにアクションを設定することでアクションを実行できる。

## モニター

モニターからログを見ることができる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/58084/b031c41b-73b2-d3fe-a39e-8df9733846a1.png)

このようにレスポンスが見れる。✔マークをクリックすると標準出力の内容が見れる。