たねやつの木

Photos and Programming

Raspberry PiでWEBアプリケーションを作る (4 - PHPの導入)

f:id:ibuquicallig:20180109175221j:plain

今回の記事ではPHPのインストールと動作確認、ちょっとしたコーディングを行います。

PHPでサーバー側の処理を記述して、ApacheでWEBページを配信という形になります。

前の記事

PHPをインストールする

インストールする前に...

Apache2がRaspberry Pi上にインストールされている必要があります。

事前にインストールされていないと、PHPのインストール時にモジュールの配備・有効化を 自動的にやってくれない(気がします)。

インストール

以下のコマンドでインストール。Raspberry PiなんかでLinuxを使い始めて思うことは、Windowsよりも こういったものの導入が簡単かなーと思います。逆に設定ファイルどこ行った!?とかなることが往々にしてあるますが。。。

# apt-get update
# apt-get install php

2018年現段階でインストールされるPHPは7系。特に拘りも無いので最新のを使いましょう。 インストール後にwhich phpなどでパスが通っているかも確認しましょう。

コレでRaspberry PiがPHPという言語を理解できるようになりました! 現実でもコレぐらいラクに覚えられたら...orz(笑)

ちょっとコーディングしてみる

PHP(プログラミング)の基本

変数などの基本的なPHPのお約束についてはQiitaなどを参考にしていただければわかりやすいかと思います。

phpinfo()

サーバーの情報を表示するためのページを作成しましょう。主にデバッグや環境の確認に使用されます。

Apacheのドキュメントルート(デフォルトは/var/www/html/)にて、ファイルを作成します。

いままでtest.htmlなどのファイルを作成していた場所と同じです。

とりあえず今回のファイル名(アクセスするページのURLにもなります)はserver_info.phpにしておきます。 拡張子は今までの.htmlではなく.phpになっている点に注意してください!

テキストエディタを開いて以下の内容を記述してください。

<?php phpinfo(); ?>

保存してから、http://[RaspiのIPアドレス]/server_info.phpにアクセスしてみてください。 以下のような画面になると思います。

f:id:ibuquicallig:20180117055311p:plain

このようなヘッダーイメージの下にSystemやらBuild Dateやらの情報が表示されます。

このページにアクセスしたときにPHP標準のphpinfo()というファンクションが実行されて、 サーバー(Raspi)とクライアント(アクセスしているPCやブラウザ等)の情報を拾い上げてHTML形式で出力してくれます。

OSのバージョンなどを表示するなかなか強力な情報なので他人のアクセスできる環境下ではこのページを表示できるようにしないべきです。 なので表示できることが確認できたらrm server_info.phpで削除しましょう。

ブラウザによって表示する内容を変更する

PHPの持っている変数を使って、アクセスしたブラウザによって表示する内容を変更するページを作成します。

$_SERVERという連想配列の変数に 現在稼働しているサーバーの情報やアクセスしたブラウザ(クライアント)の情報が格納されています。

先程のinfo()で表示される内容にもこの変数の中の値が表示されていました。

googleのトップページでも、PHPでは無いと思いますがユーザーエージェントから判断してPC用のページか スマホ用のページを表示するかを決めているようです。

一度$_SERVERの値をすべて表示してみましょう。ファイル名をphp_test.phpとして以下の内容で作成してください。

<?php
var_dump($_SERVER);

本当は<?php ?>と最後にクエスチョンとブラケットでくくる必要がありますが、PHPの処理のみの場合省略できます。

HTMLと一緒に書く場合はしっかりとタグを閉じてあげないとエラーとなります。

var_dump()は、引数に指定した変数の内容を見やすくHTML形式で出力してくれるfunctionです。 多重な配列もいい感じに表示してくれるので変数の内容がどうなっているかを確認するデバッグ作業に役立ちます。

http://192.168.xxx.xxx/php_test.phpにアクセスしてみるとズラズラと何か表示されていると思います。

ページ上で右クリックしてソースの表示をクリックしてみてください。

その中のHTTP_USER_ARGENTという入れ物にページにアクセスしたクライアントの情報が入っています。

例えばNEXUS 7のSleipnirでアクセスした場合

Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.111 Safari/537.36"

と表示されます。どうやらChrome(Chromium?)らしいです。Windows版SleipnirではSleipnirという情報が付加されるのですが。。。(笑)

この情報利用して処理を分岐させます。grep_match("検索したい文字列", "検索される文字列")というfunctionで$_SERVER["HTTP_USER_AGENT"]正規表現検索します。

このfunctionは検索したい文字列が1回でもヒットすればtrueを返します。ですので、

<?php
if (grep_match("/chrome/i", $_SERVER["HTTP_USER_AGENT"])) {
    //Chromeの場合の処理
    echo "あなたのブラウザはChromeです。";
} else {
    //Chrome以外の場合の処理
}

とすればChrome(Sleipnir)でアクセスした場合のみの処理を実装可能です。

いろいろ弄って最終的にはこのような感じにしました。

<?php
    $user_agent = filter_input(INPUT_SERVER, "HTTP_USER_AGENT");

    if (preg_match("/chrome/i", $user_agent)) {
            $browser = "ChromeかSleipnir";
    } else if (preg_match("/firefox/i", $user_agent)) {
            $browser = "Firefox";
    } else if (preg_match("/safari/i", $user_agent)) {
            $browser = "Safari";
    } else {
            $browser = "不明";
    }
?>

<html>
    <p>あなたのブラウザは、<b><?=$browser?></b>です。<p>
</html>

これでアクセスしてみると、ブラウザに応じて表示される内容が変わります。 Chrome, Firefox, Safari以外のブラウザからアクセスすると不明と表示されます。

上記の内容をSwitch文に書き換えてみるのも練習になるかもしれません!(・∀・)

解説

$user_agent = filter_input(INPUT_SERVER, "HTTP_USER_AGENT");

$user_agentという変数に$_SERVER["HTTP_USER_AGENT"]の値を代入します。 $_SERVERの値を直接参照するのはよろしくない(IDEによっては警告が表示される)ようなので、 フィルター(ゲッター)を通して取得します。

if (preg_match("/chrome/i", $user_agent))

先程紹介した正規表現で検索するfunctionでIF分岐しています。正規表現の内容を指定するときにはデリミタと言うものを 指定する必要があります。つけないとエラーとなり怒られます。chromeの前後についているスラッシュがそれです。

検索したい文字列の最後についているi大文字小文字関係なく検索するための修飾子です。 指定しない場合”chrome”で検索したときに"Chrome"という文字列があってもヒットしなくなります。

<p>あなたのブラウザは、<b><?=$browser?></b>です。<p>

HTMLのコードの中にPHPのコードが埋め込まれています。 <?= ?><?php echo ?>と同じ意味になります。単純に文字数を減らすことができます。 echoは後ろに指定した文字列を出力する機能です。つまり<?php echo $browser ?>ということになります。

それをHTMLの<p>タグの中に忍び込ませることによって表示内容の一部を環境などに応じて動的に変更することができます。

これらのPHPの処理はすべてサーバー側(Raspberry Pi)で行われ、クライアント側(ブラウザ)はただのHTMLファイルを 受け取っているだけです。なのでjavascriptやFlash(最近めっきり聞かなくなりましたね...笑)のようなクライアント側で 有効化/無効化の切り替えられるものと異なり、必ず(サーバー側で)実行されます。WEBページのソースなどを見ても PHPに関する処理は一切表示されません。 (インデントがおかしかったりするなど痕跡が残る場合もあります。)

一方でjavascriptのようにボタンを押したらある処理が走る、といったことを素のPHPではページの更新無しでは実装できないです。

以上で今回は終了です。

最後に

PHPの特徴であるHTML(別言語)の中に処理を埋め込むことができるというのが新鮮でとても面白いです(´ω`) ここに書いた内容を踏まえればあとは割とすんなりと、IRKitと連携して電気をつけるといった処理は 簡単にできると思いますのでお楽しみに。

しかし、肝心要のIRKitは生産終了状態なようです。(笑)

後継機のNature Remoは価格がくそ高いので、なんだかなああという感じです。

eRemote miniという製品が価格もIRKitと同じぐらいで使えそうです。

正式なサポートはありませんが、Nodejsのライブラリでできそうなのですが、実際に試していません。

次の記事

Bootstrapを使ったサイトの作成です。そろそろちゃんとしたページを作り始めましょう!