【五】PHP的词法/语法规则

前言

PHP的词法/语法规则和上一节的内容差不多,只是规则更复杂,语法特性更多。但是原理都是一模一样的,都会有个语法解析器和词法解析器。组合语句更多,语法更复杂。

PHP语言的词法解析

Zend/zend_language_scanner.l

这个就是PHP的词法分析规则,里面东西特别多,一眼看过去容易懵逼,但是里面的核心功能是将文本解析为token流,如有解析失败,异常报错。

<ST_IN_SCRIPTING,ST_VAR_OFFSET>{ANY_CHAR} {
    if (YYCURSOR > YYLIMIT) {
        return 0;
    }

    zend_error(E_COMPILE_WARNING,"Unexpected character in input:  '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
    goto restart;
}
      YY_("syntax error, unexpected %s");
      YY_("syntax error, unexpected %s, expecting %s");
      YY_("syntax error, unexpected %s, expecting %s or %s");
      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");

等等很多。

PHP语言的语法解析

Zend/zend_language_parse.y

语法分析和上一节的内容是格式是一模一样的,也是只是复杂很多

PHP配置的词法解析

在PHP中还有对于配置解析

test.php

<?php
define ('BIRD','Dodo bird');
$ini_array = parse_ini_file("test.ini");
print_r($ini_array);

test.ini

[PHP]
display_errors = Off
error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE
log_errors = On
error_log = /var/log/php/php.log
date.timezone = Asia/Shanghai
post_max_size = 32M
upload_max_filesize = 20M

[Session]
session.serialize_handler=igbinary

[opcache]
opcache.enable= $1
opcache.save_comments=1
opcache.memory_consumption=2048
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
opcode.caching=1
opcache.force_restart_timeout=3600
opcache.optimization_level=0xffffffff
opcache.optimization=1
opcache.use_cwd=0
opcache.revalidate_path=0
opcache.enable_file_override=0

这段逻辑就是对test.ini进行解析并生成PHP的数组,这个也是对php.ini配置进行解析的逻辑

输出内容

$ php test/test.php
Array
(
    [display_errors] =>
    [error_reporting] => 24567
    [log_errors] => 1
    [error_log] => /var/log/php/php.log
    [date.timezone] => Asia/Shanghai
    [post_max_size] => 32M
    [upload_max_filesize] => 20M
    [session.serialize_handler] => igbinary
    [opcache.enable] => $1
    [opcache.save_comments] => 1
    [opcache.memory_consumption] => 2048
    [opcache.interned_strings_buffer] => 8
    [opcache.max_accelerated_files] => 4000
    [opcache.revalidate_freq] => 60
    [opcache.fast_shutdown] => 1
    [opcache.enable_cli] => 1
    [opcode.caching] => 1
    [opcache.force_restart_timeout] => 3600
    [opcache.optimization_level] => 0xffffffff
    [opcache.optimization] => 1
    [opcache.use_cwd] => 0
    [opcache.revalidate_path] => 0
    [opcache.enable_file_override] => 0
)

PHP配置的语法解析

Zend/zend_ini_parse.y

语法分析和上一节的内容是格式是一模一样的,也是只是复杂很多

结论

  • PHP的核心功能是将PHP文本翻译为C语言并进行执行得到结果。
  • PHP的有两个词法/语法解析器,一个是处理PHP语言,另一个是处理PHP配置。
  • PHP的核心还是一个语言翻译器。
  • PHP的好处是减低业务实现难度,易于实现和好改动。
  • PHP的缺点(以编译解释角度),在FPM模式下每个pool进程只加载了PHP的解释器和配置,每次处理FastCGI请求都需要加载文本->解释指令->运行指令->响应动作(虽然有apc等),效率差,且一个pool只能同一时刻处理一个FastCGI请求,即同步阻塞式,而非事件驱动,这种效率也差。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容