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

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

Zend/zend_language_scanner.l
这个就是PHP的词法分析规则,里面东西特别多,一眼看过去容易懵逼,但是里面的核心功能是将文本解析为token流,如有解析失败,异常报错。
{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的词法/语法规则】在PHP中还有对于配置解析
test.php

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请求,即同步阻塞式,而非事件驱动,这种效率也差。

    推荐阅读