読みもの一覧に戻る

何で動くの?PHPの歴史と実行環境について!

ライター: たなかひかる

2016年07月20日

Php

おはこんばんちは。

【ゆる技(わざ)】第二回ですね!

第一回はこちらから。

いい加減暑い日が続いていて夏のような感覚にはなっておりますが

東京はまだ梅雨らしです。

暑い日は部屋に籠ってお勉強が良いかなと思うエンジニアたなかです。

さて、今回は「PHPの実行環境」がメインのお話です。


PHPは他のプログラム言語と挙動が違うって本当?


「PHPはプログラム言語に非ず」と言われてしまう程度には違います。

そもそも「プログラム言語の定義とはなんだ」みたいな話もありますが

今ではWEB系のプログラム言語として立派な地位を持った言語のひとつです。

他の言語と一線を隔した語られ方をしてしまうのには

その成り立ちが特殊だからだと思います。

詳しいことは php.netに載っている「PHPの歴史」のページを参照していただく事が良いかと思います。

かつては簡単に扱える「ホームページで使える便利ツール群」だったわけですね。

この世に誕生した時点では到底「プログラム言語」としての振る舞いをしていなかったわけです。



今ではプログラムとして認知されているPHP


いくつかのバージョンアップを経て

現在はプログラム言語としての地位を確立しています。

オブジェクト指向プログラムとしての側面と

元々あったWEB技術との高い親和性の側面があるWEBで人気の言語として

今日でも多くのプロダクトで使われています。

歴史的経緯により高いパフォーマンスが出せる実行環境がかなり限定的なため

未だに「モジュールのひとつ」という論調も根強く残っているのも事実です。

そんな特殊なPHPの実行方法、実行環境について少しお話をしていきましょう。


結局Apacheのモジュールなんでしょ?


PHPには大きくわけて二つの実行方法が用意されています。

  • コマンドラインから実行する
  • Apacheのモジュールとして実行する
  • WEBシステムでPHPを使う時はほとんどの場合、後者の「Apacheのモジュールとして実行」を選択します。

    Apacheのモジュールとして動かす場合には、Apacheのプロセスの中でPHPが実行されることになるので

    プロセスの乱立を防いだりプログラムが起動するのを待たなくて良いなどの利点がありますし

    公式にも「ApacheモジュールとしてPHPを実行する場合」という項目があるほどです。

    最近ではnginxと組み合わせてFastCGI Process Managerによる実行方法を使うなどの選択肢も出てきました。


    コンパイルをしない?PHPが実行される時に起きている事


    よく「コンパイルが必要ない」という言われ方をしますが

    正確には「事前にコンパイルをしなくても実行出来る」が正しい認識で

    実行時に「インタプリタ」と言われるものがコンパイルをしつつ実行しています。

    これは他のインタプリタ言語である「Perl」や「Python」も同様で、実行時にコンパイルを行っています。

    「コンパイル」は「構文解析」と「実行バイナリ生成」を行いますが

    インタプリタ言語では生成した実行バイナリをファイル吐き出ししないことがほとんどです。

    そのため「事前コンパイルをしない」が「そもそもコンパイルをしていない」と思われがちですが

    きちんとコンパイルはしています。

    当然構文解析やバイナリ生成にはそれなりに負荷を伴いますが

    それらの負荷を軽減するために、「アクセラレーター」と言われる実行バイナリをキャッシュする機構が使われたりします。

    普段「よしなに」やってもらっている部分も深く追っていくと

    理解が深まると共に別の選択肢が見えて来たりするので面白いですね。


    書いて覚えることもあれば読んで知ることもある


    プログラミングを覚えていく上で

    私自身も後輩に「ひたすら書け」と言いますが

    今回書いた内容のように「歴史的経緯」があったり「環境依存」があったりすると

    環境を用意して検証していくよりも読んだ方が早いこともあります。

    (もちろん書いた方が力になるとは思いますが・・・)


    そんなわけで次回のゆる技は

    「手軽に実行環境を手に入れる!VagrantとdockerでLAMP環境を作る」です。

    お楽しみに!