前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP代码的解析过程

PHP代码的解析过程

作者头像
sibenx
发布2019-11-06 11:47:59
1.4K0
发布2019-11-06 11:47:59
举报
文章被收录于专栏:城边编程城边编程

城边编程 phplog

读完需要8分钟

速读仅需4分钟

又有一周没更新了,也没人催更,决定主动更新一篇。

这段时间国家开始推行『区块链』,央行也即将发行数字货币DCEP(Digital Currency Electronic Payment)。这个数字货币对支付宝和微信支付不会有太大的影响,他们两家加起来那点份额对央行来说就是毛毛雨,不过云闪付可能会退位让贤。

这不是重点,重点是国家已经规划在多个领域应用区块链技术。强调要探索“区块链+”在民生领域的应用,积极推动区块链技术在教育、就业、养老、精准脱贫、医疗健康、商品防伪、食品安全、公益、社会救助、政务等领域的应用。对于程序员来说这又是一个挣零花钱的好机会,这是一个最好的时代。

国家十三五规划(2016-2020)给腾讯和阿里都分了任务,腾讯主管智慧医疗、警务、政务。阿里主管云计算、大数据、工业。2020年马上要交卷了,两家企业做的都不错,特别是阿里。马上要十四五规划,看区块链技术花落谁家,我没猜错的话应该会是阿里牵头。所以小程序也是未来5年的一个爆发点。

正文

问:PHP代码更新的时候会不会中断用户正在进行的请求?

答:会,但有办法防止这种情况出现。

PHP属于热更新语言,在不开Opcache缓存的情况下修改代码能实时生效,因为这个灵活的特性也导致PHP在发布代码时容易遇到问题,这点和前端资源的发布很像。前端需要保证多个js和css文件更新后同时生效,但是文件更新肯定会有先后顺序,存在时间差,如何处理时间差带来的风险也是值得深究的话题。主要有如下问题:文件的更新顺序导致用户请求出错。

a.php -> b.php -> c.php

有如上调用流程,在更新b和c文件时,凑巧用户请求刚加载完更新后的b文件,此时如果c文件还在更新中,就会导致顺序出错,变成如下情况。

a.php -> 新 b.php -> c.php

对用户来说这次请求多半会报错。如果当前请求有I/O操作更会造成灾难性的后果。

这里说了"可能"、"如果"、"凑巧"三个概率性的词,在编程时千万不要相信概率,请迷信墨菲定律。

PHP是如何解析执行的?

1. Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)

2. Parsing, 将Tokens转换成简单而有意义的表达式,再通过Bison转换成ZendAPI

3. Compilation, 将表达式编译成Opocdes

4. Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。

文件加载到内存后,无论怎么修改文件都不会影响当次请求。所以只要知道include的PHP文件是什么时候被加载到内存的,问题也迎刃而解。

假设我们有两个php文件,内容如下:

//a.php
<?php
echo 123;
include "b.php";
?>
//b.php
<?php
echo 456;
?>

1. Scanning(Lexing) 词法分析结果

Array
(
    [0] => Array
        (
            [0] => 379
            [1] => <?php
            [2] => 1
        )

    [1] => Array
        (
            [0] => 328
            [1] => echo
            [2] => 1
        )

    [2] => Array
        (
            [0] => 382
            [1] =>  
            [2] => 1
        )

    [3] => Array
        (
            [0] => 317
            [1] => 123
            [2] => 1
        )

    [4] => ;
    [5] => Array
        (
            [0] => 258
            [1] => include
            [2] => 1
        )

    [6] => Array
        (
            [0] => 382
            [1] =>  
            [2] => 1
        )

    [7] => Array
        (
            [0] => 323
            [1] => "b.php"
            [2] => 1
        )

    [8] => ;
)

2. Compilation, 将表达式编译成Opocdes

从Opocdes可以看出此时已经将`b.php`文件加载到了内存,也就是说在PHP代码被转换成Opocdes前已经完成了所有代码的加载。

最后得出结论,如果用户发送的请求在Compilation之前,我们更新代码是会导致服务中断的。

如何解决更新过程中请求中断的问题?

通常会给PHP项目文件夹设置一个软链接。每次更新项目时创建一个新文件夹,然后将PHP项目的全量代码拷贝过去,最后修改软链接指向新文件夹。这样就能保证用户请求不受文件更新的影响。gitlab的CD流程中已经集成该方法。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 城边编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
区块链
云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档