質問: アクセス時のリアルタイムなページ情報が取得できるようなものをPHPで実装できないかと考えています。 例えばブラウザで見ているような、JavaScriptやPHPなどでページが改変された後のHTML要素を取得するという操作が行えたら便利だと思ったので考えたのですが、PHPではどのように実装すれば良いのでしょうか?
回答: > > JavaScriptやPHPなどでページが改変された後のHTML要素 > > > この2つをひとまとまりにしてはいけません.実行されるタイミングが全く違います.以下ではPHPの一般的な動作方式である**php-fpm**の場合の動きについて説明します. (Apacheの場合は**mod_php**というこれとは違う動作モードがとられることが多いですが,全体としてみた流れはそんなに変わりません.FastCGIというプロトコルで別のプロセスに実行を任せるか,Apacheプロセス自分自身でPHPを実行するかの違いです.) 1. Webブラウザ(Chrome,Firefoxなど)がWebサーバに対し,HTTPリクエストを送信する. 2. WebサーバがHTTPリクエストのURLを読み取り,どのファイルに対する要求かを判断する.ここではURLの末尾が「*.php」なものであったとする. 3. Webサーバがphp-fpm(PHP FastCGI Process Manager)に対して,実行すべきPHPコードが書かれたファイルへのパスなどの情報を含むFastCGIリクエストを送信する. 4. FastCGIリクエストを受けた**php-fpmがPHPを実行し,HTTPレスポンスを生成する.** 5. php-fpmがWebサーバに対し,HTTPレスポンスを載せたFastCGIレスポンスを返す. 6. WebサーバがWebブラウザに対し,HTTPレスポンスを返す. 7. **WebブラウザがHTMLに含まれるJavaScriptを実行する**. 1,7はブラウザ側の話で2〜6はサーバ側の話です.つまりPHPとJavaScriptでは実行される場所が全く異なります.例えばWebブラウザ側からはPHPのソースを覗き見ることは絶対にできません.PHPによって生成されたHTMLしか見えません. さて,これを踏まえると「PHPで生成される部分」に関してはごく普通にHTTPリクエストを送るだけで反映されることがわかります. ``` $html = file_get_contents('http://example.com/example.php'); ``` 問題は「JavaScriptで改変される部分」ですよね.これはPHPだけの力ではまともに対応できません.**Selenium WebDriver**という,ChromeやFirefoxといった主要なブラウザの自動操作に対応しているJava製のツールに頼る必要があります.更にこれをPHPから取り扱うためのライブラリも存在しており,それを用いることによって目的を実現できます. * php-webdriver しかしこれに関してググってもそれほど整理された分かりやすい情報があるわけでもなく,断片的な情報しか見つからないケースが多いと思います.そのため,自分でライブラリのソースコードや英語のドキュメントを読める人じゃないとちょっとつらいかもしれません. ...とはいうものの,比較的php-webdriverのソースコードは読みやすい部類だと思います.ここの階層にあるファイルは全部,実装が分離されて「表面上どんな動きをするのか」だけを示した**インターフェース**定義ファイルが羅列されており,この部分が説明書の役割を果たしています.**「このメソッドはどんな引数を受け取って,何を返すのか」**というのがひと目で分かるようになってます.