Function App作成
HTTPトリガーのFunction App作成
コンテナを作る→新しい関数を作る→他はデフォルトのまま作成。
HttpGET-CRUD-PHP1のような名前の関数タブが作られる。
ブラウザアクセス
開発タブを開くと
https://example.azurewebsites.net/api/HttpGET-CRUD-PHP1?code=abcdefghijklmnopqrstuvwxyz0123456
みたいなかんじのURLが表示されるので、ブラウザでアクセスすると作成したFunctionAppが呼び出される。
デフォルトでは真っ白。
Function Appの中身
構造としてはHttpGET-CRUD-PHP1という名前のディレクトリが作られ、中にfunction.jsonとrun.phpができる。
function.json
function.jsonはどういう条件で起動するかといったメタ設定を記載する
直接変更してもいいけど統合タブから操作した方が無難。
デフォルトではhttpTriggerという項目があり、これが『HTTPリクエストが来たらPHPを実行する』みたいな意味になっている。
run.php
index.phpとかではなく、ここが処理の起点となる。
開発タブから操作できるけど、とても非効率なのでFTPとかGitHubとか使った方がいい。
中身は基本的に普通のPHPだが、echoとか書いてもログに出力され、ブラウザ側には何も出ない。
最初からfile_put_contents(getenv('res'), $inTable)
と書いてあるのだが、getenv('res')は実は単なるファイル名。
しかし、そのファイルに書き込むと何故かブラウザに出力されるという仕様になっている。
最初に全体をob_start();$inTable=ob_get_clean()
とかで囲んでおけばあとは普通に書ける。
設定変更
デフォルトではGETしか受け付けない。
統合→トリガー HTTP(req)→Selected HTTP methods
のPOSTにチェックを入れるとPOSTも受け付けるようになる。
他にDELETE/HEAD/PATCH/PUT/OPTIONS/TRACEもあるけどまあ使わない。
リクエストパラメータがない
$_REQUESTがない
GETしようがPOSTしようが$_REQUEST=[]
になってしまう。
$_POSTがない
POSTパラメータを送っても$_POST=[]
になる。
もっと言うと$_SERVER
にも$_ENV
にも$argv
にも無い。
何処にあるかというと、最初に作成したhttpTriggerから回収できる。
$post = file_get_contents(getenv('req'))
;
なおhoge=1&fuga=2
って送るとそのまま$post='hoge=1&fuga=2'
になるのでparse_str()
しないといけない。
$_GETがない
同じく、URLにいくらパラメータを書いても$_GET=[]
になる。
URLに&hoge=1&fuga=2
と入れると、何故か$_SERVER['REQ_QUERY_HOGE']=1
、$_SERVER['REQ_QUERY_FUGA']=2
とかいう変なところに入ってくる。
あと&foo[]=1&foo[]=2
とか書くと死ぬ。
$_SESSIONがない
session_start()
がfalseになるのでどうにもならない。
もっとも、そもそもそれ以前にFunction Appはセッションを使うようなサービスではないので、素直にApp Serviceでも使っとけって話だ。
まとめ
リクエストパラメータの取り出しがやたらめんどい。
セッションが使えないのは元々そういうサービスではないからいいとしても、GET/POSTが簡単に取り出せないのはどうにかしてほしい。
Function Appとは何か
サーバー不要のコードを使用してイベントを処理
とかよくわかんねーことが書いてあるけど、
まあ正直MySQLで言うトリガーみたいなものだと思っておけばいい。
直接リクエストが来たとかEventHubにアクセスが来たとかデータベースにINSERTがあったとかのタイミングで呼び出され、ちょっとした後処理を書くとかに使える。
定期起動もあるのでcron替わりにも使える。何故か秒単位指定できる。