操作機構とPHPの基本原則

コンセプトとデザイン性PHP

  • PHPは、C言語によって完全に下にある、両方の解釈と弱い型を有する、動的なWebスクリプト言語の開発に適するように設計されています。
    • 側縁説明、ラインの実行によって行が実行されている解釈プログラム。
    • すなわち、弱く型付けされた変数の型は、暗黙的または明示的な変換を決定する基礎構造zvalをPHPであり、動作中に発生する可能性があり、開始と判定されないが、この機構の柔軟性は、Web開発に非常に便利です効率的。
  • マルチプロセスモデル:PHPは、マルチプロセス・モデルであるため、異なる要求間の非干渉、そのような要求は、サービス全体への影響をハングアップしないことを保証するために、当然のことながら、時代の発展に伴い、PHPはまた、既にマルチスレッドモデルをサポートしています。

  • エンジン(Zendの)+内部結合低下のモード成分(EXT)。

  • 中間層(SAPI)単離されたウェブサーバとPHP。

  • 構文は、シンプルで柔軟な、あまりにも多くない仕様です。

4のPHPシステム

PHPコアアーキテクチャは、以下に示すように:

図から分かるように、PHPは、下部から4層システムです。

  • Zendのエンジン:一体的に純粋なCで実装のZend、PHPは、コア部分であり、それは(語彙、及びコンパイル過程を解析する一連の)コード変換をPHPし、命令コードを実行するプロセスは、基本的なデータを得るための処理方法を対応する実装外部のコールに対応するAPIメソッドを提供するために、メモリの割り当てと管理(例えば、ハッシュテーブル、オブジェクト指向のような)構造は、すべてのコアは、すべての周辺機能は、Zendの実装の周りにあります。

  • 拡張機能:標準ライブラリを拡張することにより実現されるのZendエンジンの周りに、拡張子は、モジュラーな方法によって(例えば、アレイシリーズなど)の組み込み関数の我々の共通のさまざまな基本的な様々なサービスを提供し、ユーザーが自分のニーズに応じて達成することができます機能拡張を実現するための拡張、パフォーマンスの最適化の目的(PHPが使用中の中間層として貼り付け、典型的なアプリケーションを解析するリッチテキストは拡張機能です)。

  • サピ:SAPIはPHPは、データや周辺機器とやり取りできるように、それはPHP SAPIの成功により、設計の非常にエレガントでPHPの成功で、フック関数の一連のサーバーアプリケーションプログラミングインターフェイスの略で、サーバ側のアプリケーション・プログラミング・インターフェースである、サピ自身と上位アプリケーションの隔離のデカップリング、PHPはもはやどのように互換性のあるさまざまなアプリケーションのために考慮することはできませんし、アプリケーション自体も独自の特性のために異なるアプローチを実現することができます。

  • 上位アプリケーション:これは、我々は通常、そのようなので、上のスクリプトとして実行すると、コマンドラインで、WebアプリケーションのWebサーバを実装することなどの異なるモードSAPI方法で、さまざまなアプリケーションを取得し、PHPアプリケーションを作成するものです。

PHPが車の場合、車自体はPHPフレームワークである、Zendのは、車のエンジン(エンジン)で、内線車の車輪のさまざまなコンポーネント以下、サピが高速道路として見ることができ、車は道路の異なる種類の上で実行することができますPHPプログラムの実行に車が道路上で実行されている間。したがって、我々は必要:エンジンの優れた性能+ +右後輪右のトラックを。

    如前所述,Sapi通过通过一系列的接口,使得外部应用可以和PHP交换数据并可以根据不同应用特点实现特定的处理方法,我们常见的一些sapi有:
  • apache2handler:これは、mod_phpのモード処理実行時間を使用して、WebサーバとしてApacheで、それは現在最も広く使用されているものです。
  • CGI:これはウェブサーバと、昨年のFastCGIの+ PHPで有名なのFastCGIプロトコルであり、別の直接的な相互作用は、より多くのアプリケーションを取得するPHP、また非同期のWebサーバのみがサポートされている方法です。
  • CLI:コマンドラインモードのアプリケーションの呼び出し

PHPの実行プロセス&オペコード

我们先来看看PHP代码的执行所经过的流程。

从图上可以看到,PHP实现了一个典型的动态语言执行过程:拿到一段代码后,经过此法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),然后Zend虚拟机顺次执行这些指令完成操作。PHP本身是用C实现的,因此最终调用的也都是C的函数,实际上,我们可以把PHP看做是一个C开发的软件。
  • 単一命令のPHP実行のコアは、そのオペコードを翻訳さ
  • PHPのオペコードは、プログラム実行の基本単位です。二つのパラメータ(OP1、OP2)、関数の戻り値と合成処理によってオペコード。PHPは、最終的にはチェンフンは、オペコード注文処理機能のセットに変換を行っています。

  • いくつかの共通のハンドラ
PHP
 
1    ZEND_ASSIGN_SPEC_CV_CV_HANDLER : 变量分配 ($a=$b)
2    ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER:函数调用
3    ZEND_CONCAT_SPEC_CV_CV_HANDLER:字符串拼接 $a.$b
4    ZEND_ADD_SPEC_CV_CONST_HANDLER: 加法运算 $a+2
5    ZEND_IS_EQUAL_SPEC_CV_CONST:判断相等 $a==1
6    ZEND_IS_IDENTICAL_SPEC_CV_CONST:判断相等 $a===1

ハッシュ表 - コアデータ構造

ハッシュテーブルは、我々は、シンボルテーブルの関数として内部のZendに、また、典型的なアプリケーションであるPHP配列を、知っている、ほとんどすべての一般的な機能を実現するために使用されるPHPでZendのコアデータ構造であり、グローバル変数は基づいていますハッシュテーブルは実現しています。

  • PHP的hash table 具有如下特点:
    • 支持典型的key——> value查询
    • 可以当做数组使用
    • 添加、删除节点是 O(1)复杂度
    • key 支持混合类型:同时存在关联数组和索引数组
    • value 支持混合类型:array("string", 23332)
    • 支持线性遍历:如 foreach

Zend Hash Table 实现了典型的hash表散列结构,同时通过附加一个双向链表,提供了正向、反向遍历数组的功能。其结构如下图:

可以看到, 在hash table中既有 key -> value 形式的散列结构, 也有双向链表模式,使得它能够非常方便的支持快速查找和线性遍历。

  • 散列结构:Zend的散列结构是典型的hash表模型,通过链表的方式来解决冲突。需要注意的是zend的hash table 是一个自增长的数据结构,当hash表数目满了之后,其本身会动态以2倍的方式扩容并重新元素位置。初始大小均为8。另外,在进行key->value快速查找时候,zend本身还做了一些优化,通过空间换时间的方式加快速度。比如在每个元素中都会用一个变量nKeyLength标识key的长度以作快速判定。

  • 双向链表:Zend hash table通过一个链表结构,实现了元素的线性遍历。理论上,做遍历使用单向链表就够了,之所以使用双向链表,主要目的是为了快速删除,避免遍历。Zend hash table是一种复合型的结构,作为数组使用时,即支持常见的关联数组也能够作为顺序索引数字来使用,甚至允许2者的混合。

  • PHP关联数组:关联数组是典型的hash_table应用。一次查询过程经过如下几步(从代码可以看出,这是一个常见的hash查询过程并增加一些快速判定加速查找。):
getKeyHashValue h;
index = n & nTableMask;
Bucket *p = arBucket[index];
while (p) {
if ((p->h == h) & (p->nKeyLength == nKeyLength)) {
RETURN p->data;  
}
p=p->next;
}
RETURN FALTURE;
  • PHP索引数组:索引数组就是我们常见的数组,通过下标访问。例如 $arr[0],Zend HashTable内部进行了归一化处理,对于index类型key同样分配了hash值和nKeyLength(为0)。内部成员变量nNextFreeElement就是当前分配到的最大id,每次push后自动加一。正是这种归一化处理,PHP才能够实现关联和非关联的混合。由于push操作的特殊性,索引key在PHP数组中先后顺序并不是通过下标大小来决定,而是由push的先后决定。例如 $arr[1] = 2; $arr[2] = 3;对于double类型的key,Zend HashTable会将他当做索引key处理

PHP 变量

PHP是一门弱类型语言,本身不严格区分变量的类型。PHP在变量申明的时候不需要指定类型。PHP在程序运行期间可能进行变量类型的隐示转换。和其他强类型语言一样,程序中也可以进行显示的类型转换。PHP变量可以分为简单类型(int、string、bool)、集合类型(array resource object)和常量(const)。以上所有的变量在底层都是同一种结构 zval。

Zval是zend中另一个非常重要的数据结构,用来标识并实现PHP变量,其数据结构如下:

Zval 主要由三部分组成:

  • type:指定了变量所述的类型(整数、字符串、数组等)
  • refcount&is_ref:用来实现引用计数
  • value:核心部分,存储了变量的实际数据

Zvalue是用来保存一个变量的实际数据。因为要存储多种类型,所以zvalue是一个union,也由此实现了弱类型。

PHP变量类型和其实际存储对应关系如下:

IS_LONG   -> lvalue
IS_DOUBLE -> dvalue
IS_ARRAY  -> ht
IS_STRING -> str
IS_RESOURCE -> lvalue

おすすめ

転載: www.cnblogs.com/lz0925/p/11122493.html