phpこんにちは、たねやつです。今回は前回に続いてapacheでWEBページを作っていきます。ここまでで一区切りとなります。参考この記事でできることPHPを駆使してRSS配信しているサイトの最新記事を一覧で表示する。前の記事PHPについてPHPとは、JavaやPythonと同じようにプログラミング言語であり、一番の特徴はHTML文書内に埋め込み、処理結果を簡単に表示できる点だと思います。Pi内)で実行されます。プログラムを実行した結果をHTML文書にしてブラウザに渡すので、JavaScriptのように入力値に応じて別の場所の内容を変えるというようなユーザーからの入力をページ更新せずに実装することはできません。WordPressやLaravelといったフレームワークが有名ですが、ごく小さな開発なのでそのままのPHPを使用します。Piにインストールするところからです。PHPをインストールするもうおなじみのコマンドになってきましたが、以下のコマンドでphpをインストールします。最新をインストールします。php-xmlはxmlファイルの処理を行うために必要な拡張機能となっています。Raspbianではデフォルトでインストールしてくれないので手動で追加します。phpinfo()を実行するインストールが完了したらコマンドを実行するページを作成していきます。今回はrss.phpというファイル名で進めていきます。PHPを使用する場合はファイル名の拡張子が.htmlではなく.phpとなります。rss.php中身はこんな感じです。phpinfo();?>保存したら、一旦apacheを再起動しておきます。ここまで再起動コマンドなどの説明をしていませんでした。PiのIPアドレス]/rss.phpにアクセスしてみてください。サーバーやPHPの情報が表示されます。正常に表示できていればインストールは成功です👏RSSを取得して、そのまま生データを表示とりあえず、いきなり一覧形式で表示する処理を作るよりも、ステップバイステップで作っていきましょう!まずはRSSを取得、そのまま画面に表示させてみます。"</pre>";?>simplexml_load_file()という関数は、PHP標準のものであり指定したURLのファイルをXML形式の値として取得する、というものです。指定しているRSSははてなブックマークの総合ホットエントリです。取得結果を$rssに格納してvar_dump()で画面に出力します。値を確認したいときにとても便利な関数です。ついでに前後をpreタグで囲んでおくとさらに見やすくなります。"http://b.hatena.ne.jp/hotentry/all"このような値が表示されていれば成功です。RSSではXML形式のファイルを取得できます。このファイルはHTMLファイルと同じような木構造となっていて、親子関係をしっかりと理解することで任意のタグと値をうまく参照することができます。rdf:about="https://abematimes.com/posts/7003122">...</item>...こんな感じの構造になっています。linkとたどっていきます。"<br>";}?>このようにすると取得できる一覧のタイトルを最新順にすべて表示します。""とするとブラウザ渡すHTML文書に追記する、というような感じです。実際にブラウザ側でソースの表示(右クリックから)をしてみると、タイトル0<br>タイトル1<br>タイトル2<br>...という感じになっています。PHPのユーザーエージェントを設定するさて、先ほどのはてなブックマークのURLは問題なく取得できたのですが、同じようにはてなブックマークのIT新着のRSS(http://b.hatena.ne.jp/entrylist/it.rss)を取得しようとするとなぜか取得できません。同じURLをブラウザでアクセスしてみると問題なく表示されます。$rssで始まる行の下に、var_dump($http_response_header);と追加することでHTTPリクエストのヘッダーを見ることができます。Forbiddenが表示されます。いくつかのサイトでは、ユーザーエージェントの設定されていないリクエストは拒否するようになっているようで、PHPではデフォルトではユーザーエージェントは設定されていません。そのため取得することができないのです。ユーザーエージェントとは、HTTPリクエスト元がどのような端末なのか、ブラウザなのかを表す値です。リクエストを受けたサーバーはOSやブラウザの種類などを判断して処理することができます。空でなければ拒否されないようなので、何か値を設定します。php.iniという設定ファイルがあるのでそこからデフォルト値を設定できます。/etc/php/7.0/apache2/php.iniapacheから実行されるPHPの設定はこちらのファイルを使用します。コマンドライン上で実行するPHPの設定は/etc/php/7.0/cli/php.iniの方を設定します。ファイルを開いたら/agentと入力してエンターを押し、該当の場所まで飛びます。http://php.net/user-agentuser_agent="PHP"user_agentという項目がコメントアウトされているので文頭の;を消して有効化します。保存して終了したらapacheを再起動して設定を有効化します。reloadこれで設定完了です。一つコード上で設定する方法もあります。"PHP");と書きます。これでphp.iniで設定されている値を上書きできます。rss.phpの体裁を整えるちゃんとしたHTML文章として体裁を整えておきます。前回のfavorite.phpと同じようにして以下のような内容にします。?>タイトルなどは適宜お好きなように変更してください。末尾にPHP用のタグを用意しています。?>で囲った中にプログラムを書くと実行されます。一覧形式にして表示データを取得してそのまま表示することができたので、これをお気に入りリストのように一覧化していきます。テンプレートとして以下のような感じの一覧を使います。</div></div>この塊を、RSSで取得した値を使いながら動的に一覧を作成します。HTML単体ではこのような動的なサイトは作ることはできませんでした。一覧を埋め込みたい場所にPHPの関数を呼び出すように追記します。class="row"></div>の中です。?>の部分を以下のように変更します。echo("</div></div>");}?>とりあえずecho("")で出力します。文字列内に含まれるダブルクォーテーションはエスケープする必要がありますので、\を前に追加します。しないとStringの終端とみなされて不正確な文字列となってしまいます。まとめるとrss.phpは以下のようなソースとなります。あとはこの形を維持しながらRSSの値を入れていくだけです!RSSの値で動的に一覧を生成するまずは、HTML内でPHPの関数を読んでいる部分からRSSのURLを引数で渡すようにします。?>それに従って関数の方も変更します。}次に、関数の中身も編集していきます。一気に作ってしまいますが以下のような感じにします。echo("</div></div>");}?>$count_mxに指定している数値で一覧に表示する行数を制御できます。foreach処理内で$countをカウントアップしていき、到達したらbreakでループを抜けるようになっています。不完全な一覧を表示しないために、simplexml_load_file($url)でファイルの取得に失敗したときは、後続処理は一切行いません。PHPでは、アロー演算子を使うことでオブジェクト内の変数や関数にアクセスすることができます。JavaScriptでいえば、fruits.appleみたいな感じで使用するドットです。titleとするとRSS配信しているページのタイトルを取得できます。この辺は実際のRSS配信されているXMLファイルをにらめっこしながら判断します。文字列は.で結合することができます。ほかの言語だと+ですね。これで以下のように表示することができます。それっぽくなってきましたね!これでほぼほぼ完成です。一覧を複数表示するRSSの一覧が一つだけでは特に意味がないので増やしてみましょう。処理は関数化しているので関数を呼び出すだけでOKです。?></div>これで複数表示できます。好きなニュースページのRSSを指定してみてください。はてなブックマークの構造と異なるXML構造をしているページでは頑張ってプログラムを書いてみましょう!最終的なコード最後に、今回のソース(rss.php)の全体です。関数には適切なコメントをつけておくのが運用の鉄則です。echo("</div></div>");}?>最後に以上でRSSリストの作成は完了となります。?あまりプログラムを書いたことなかったり、HTMLの内容を動的に生成するという感覚に慣れていないとちょっと変なやり方やな、と感じるかもしれません。個人的にもこの書き方はあまり好きではないです(笑)。<template>からクローンしてうにゃうにゃ、という方がスマートでしょう。なってくるとPHPではなくJavaScript(Vue.jsなど)で作り上げる方が向いていると思います。PHPの方が環境構築が簡単で、HTML内に簡単に文字列を足せるのでこちらを選択しました。Pi上でWEBアプリケーションを作成することができました!!!たかがRSSリストかよ!と思われるかもしれませんが、インターネット上からファイルを取得して、それに応じて動的にページを生成しているだけでも十分アプリケーションです👏👏👏もっと発展すると入力欄の値をデータベースに登録してそれを一覧化する、といった本格的なアプリケーション(TODOリスト)となります。Piの最大の特徴といっても過言でないGPIOから部屋の温度や湿度を取得したり、カメラから写真を撮ったりという部分もやっていこうと思います!次の記事GPIOを利用して、LEDをチカチカさせる通称Lチカをやっていこうと思います。以下のサイトの情報を引用・参考にしました。↑PHPの公式ドキュメントです。ここに載っていない標準の関数は無いので、使い方などはまずはここを参照するといいです。背景を元に戻すAdsはてなブログをはじめよう!ibuquicalligさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。