質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

92.64%

解決済 PHP の内部構造(Zend Engine)について教えてください。

  • PHP

    9234questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • C

    1386questions

    "C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。"

2016/11/14 17:20 投稿

2016/11/15 09:57 編集

7968 score 34

  • 1

    回答

  • 評価

  • 1108

    view

PHPの変数や関数、クラス等を書籍等を見ながら勉強してる入門者です。

PHPがはじめての言語なので、PHPの内部構造(C言語)は読めません(・ω・`;)

変数や関数など記述したコードがPHPの内部でどのような流れで処理されているのか理解したく、調べております。

PHP7で内部構造が変わっていることは承知しております。

PHP7については情報少ないので、PHP5の内部構造を調べております。

コンパイラやzval構造体、ハッシュテーブルなど一部にフォーカスして説明した記事は結構ありましたが、全体を示す図がなかなか見つからず、2日ぐらいググって下記の図を見つけました。

イメージ説明

引用:Quick tour of PHP from inside

LexerやParser、OPcode、zval、HashTablesなど単体を説明した記事はありましたので、それぞれがどのような役割をしているのかは何となく理解しております。

ただ、上図で言うところの「Zend Virtual Machine」と「Zend Engine Core」の結びつきがわからず一連の処理が理解できておりません。

直接的な回答ではなくても、参考になるサイトや書籍など何でもいいので情報を頂けると嬉しいです。

【質問1】Zval や HashTables などはどの段階で作成されるのですか?

PHP5ならLexerで字句解析をし、Parserで構文解析をして、OPcodeを作成して実行しているかと存じます。

この一連の流れの中で、Zval や HashTables などが作成されると思うのですが、Parserで構文解析したときに作成されるのでしょうか?

それとも別の段階で作成されるのでしょうか。

【質問2】シンボルテーブルはスコープごとに作成されるのですか?

シンボルテーブルを表した下図だとglobalとfunctionとシンボルテーブルが別々です。

イメージ説明

引用:php-secrets-forum7.

シンボルテーブルはスコープごとに作成されるということでしょうか?

【質問2がYesだった場合】属するシンボルテーブル名を確認する方法はありますか?

仮にスコープごとにシンボルテーブルが作られる場合、複数のシンボルテーブルがあるかと存じます。

シンボルテーブルを区別するために名前のようなものが付与されるかと存じます。

そのシンボルテーブルの名前を確認する方法はありますでしょうか?

xdebug_debug_zval() だとzvalの中身はわかりますが、属しているシンボルテーブルの名前は表示されません。

シンボルテーブルの名前をダンプする方法があれば、教えてください。

【質問3】function stack とはなんですか?

シンボルテーブルを表した図にはfunction stackとあります。 これは何を表してるのでしょうか?

ご存知の方いれば、何卒ご教示くださいm(__)m

 参考・閲読

下記には目を通しましたが、難して理解できていないところも多々あります^^;

 蛇足

質問の中にある書いてある通り、全体図を探すのに結構な時間を費やしました。 php, zval, zend, lexer, parser, vm, opcode, hashtable, symboltable あたりのワードでひたすらググってましたが英語や中国語のヒットします。
日本語しか読めないので、進化したGoogle翻訳をフル活用して調べてましたが、なかなか全体図を説明・記載したものを探せませんでした。
最終的にグーグルの画像検索で見つけました。
私のようにググり力が乏しい方はいないかもしれませんが、同じように困ってる方がいれば画像検索も試してみてください。
以上、蛇足です。

情報の追加・修正の依頼をする(7)

2016/11/14 20:56

正直に言いますと、プログラムは書けるけどここまで裏でどう動いているのかわかる人がはたしているのだろうか

2016/11/14 21:41

クリップしました。で、図の出所を明記してくださいませんか (挙げておられるリンク先のどれかにあるのかもしれませんが)。

2016/11/14 22:29

出所が分かり難く申し訳ございません。図の下に引用元のリンクを追記しました。

2016/11/15 09:52

タグにC言語を追加した方が良いと思います。「Zend Engine」はPHPのオブジェクト指向を実装したC言語のフレームワークです。PHPを扱っている多くの人はその中身を知らないと思います。C言語を扱っている人のほうが知っているかも??

2016/11/15 09:58

ご助言ありがとうございます。早速C言語のタグを追加しました。

2016/11/15 16:00

他のユーザから「意図的に内容が抹消された質問」という指摘を受けました
解決後に編集機能を用いて質問内容を改変し関係のない内容にしたり、内容を削除する行為は禁止しています。
投稿していただいた質問は、後に他の誰かが困ったときに助けになる情報資産になると考えるからです。
「質問を編集する」ボタンから編集を行い、他のユーザにも質問内容が見えるように修正してください。

2016/11/15 16:26 編集

こちらの質問は「質問2がYesだった場合」と「画像引用元」と「蛇足」の追記しか行っていないかと存じます。ちなみにオペコードに関する質問は別にしております。この質問に対して内容の改変と削除はないかと存じますが、こちらの不手際で削除などあった場合は、大変申し訳ございません。

表示エリアを広げる

閉じる

気になる質問をクリップする

クリップした質問に回答があった場合に通知・メールを受け取ることができます。

クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

良い質問の評価を上げる

以下のような質問は評価を上げましょう。

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

質問の評価を上げたことを取り消します

この機能は開放されていません

評価を下げる条件を満たしてません

評価を下げる理由を選択してください

上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

質問の評価を下げる機能の利用条件

この機能を利用するためには、以下の事項を行う必要があります。

質問の評価を下げたことを取り消します

回答(全1件)

ベストアンサー

回答の評価を上げる

以下のような回答は評価を上げましょう。

  • 正しい回答
  • わかりやすい回答
  • ためになる回答

評価が高い回答ほどページの上位に表示されます。

5

この機能は開放されていません

評価を下げる条件を満たしてません

こんにちは。

【質問1】Zval や HashTables などはどの段階で作成されるのですか?

変数値や即値に対応するzvalやHashTableがいつ生成されるかということであれば、PHPプログラムコンパイル時に静的に確定できる値はopcode生成フェーズで、PHPプログラム実行時に動的に作られる値はopcode実行フェーズで生成されます。

上の図の「Zend VM Executor」が実行フェーズを担当する機能です。

【質問2】シンボルテーブルはスコープごとに作成されるのですか?

はい。

この図で表現しているのは、グローバルスコープと関数スコープとで異なるシンボルテーブル(=変数テーブル)を利用しているよね、という内容になるかと思います。

<?php
function do_something($s)
{
  $s = 'was';
  return $s;
}

$a = 'this is';
$b = do_something($a);

上記プログラムにおいて、関数スコープでは$sにアクセスできるけれども$aにはアクセスできない、グローバルスコープでは$sにアクセスできないけれども$aにはアクセスできる、というのは普段のコーディングで体験していることだと思います。

【質問2がYesだった場合】属するシンボルテーブル名を確認する方法はありますか?

PHPの標準関数では不可能なように思います。

自分でextensionを書くなり、気になる箇所にデバッグコードを仕込んでPHPをビルドし直すなり、などすれば可能だと思います。

【質問3】function stack とはなんですか?

スタックというのは後入れ先出し(LIFO)のデータ構造です。

関数の呼び出しはスタック構造で管理されていて、関数内で関数を呼び出すと順にスタックに積まれていきます。

PHPがはじめての言語なので、PHPの内部構造(C言語)は読めません(・ω・`;)

とのことですが、現在の興味を深めていきたいのであればC言語レイヤで試行錯誤していかないと効率が悪すぎるように思います。

わからないなりにソースコードに目を通しても良いと思います(重要な情報がコメントとして書かれていたりします)し、もしくはPHPにデバッグコードを埋めて実行してみるだけでも全然違うと思いますよ。

では、頑張って下さい!

2016/11/15 15:05 投稿

2016/11/15 15:22 編集

コメント(1)

2016/11/15 15:37

おお!まさか、参考として拝見していた hnw さんから回答をいただけるとは、めっちゃテンションあがりました٩( 'ω' )و
各質問に対してわかりやすい回答、アドバイスありがとうございます。
PHPの内部構造(C言語)も読めるように精進します。
お陰様で理解が進みました。
お忙しい中、回答ありがとうございましたm(__)m

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

92.64%

関連した質問

  • 解決済

    Felica(Pasori)とPHPの連携

    機器を所持していないと難しいと思いますが、 以下についてご教授いただきたく、何卒よろしくお願い致します。 SONYのFelica機器(Pasori)を使用して、PHPとの連携を取

  • 解決済

    MVCでの登録フォームのエラーチェック

    初めての質問です、よろしくお願い申し上げます。 php初心者ながらMVCにチャレンジしたく、zenzdframeworkで会員登録の仕組みを練習しています。 下記のように記述して

  • 解決済

    ソースコードの意味が理解できない

    ソースコードの意味が理解できません。 メソッド名やソースコードの一部をそのまま検索したのですが、いまいち分かりません。 一か所ではなく複数ヶ所あります。 1の$this->boo

  • 受付中

    AS400(ibm i)上で稼働しているPHPアプリをWindows環境へ移行する際にエラー

    前提・実現したいこと 現在、AS400(V6R1)上で稼働しているPHPのWebアプリケーションをWindows環境に移行したいと考えております。 PHPアプリケーションはze

同じタグがついた質問を見る

  • PHP

    9234questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • C

    1386questions

    "C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。"

閲覧数の多いPHPの質問

関連した質問

teratail × エキスパート

メールアドレスで登録

利用規約、及び 個人情報の取り扱いに関する要項をご確認のうえ同意いただける場合は「同意して登録」ボタンをクリックしてください。

SNSアカウントで登録

  • Facebook
  • Twitter
  • Google
  • Github
  • Hatena

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る