1.应用场景

学习PHP底层实现原理, 提高对PHP的认识,对编程语言的认知, 站在更高维度下审视编程世界,互联网甚至未来.

2.学习/操作

环境

希望能从不同平台上实践和学习

Windows10 64位 专业版

laravel 5.8 / 5.7 

phpstudy v8.0

And 

Mac pro 2019

Docker「LNMP」

PHP 版本后面说明 

And

Linux 

Docker「LNMP」

以及物理机搭建LNMP

1. 文档

https://github/laruence/phpbook。// 鸟哥 - PHP底层实现 - 推荐  -- 20210429 周四 公司

PHP底层内核 - 知乎 -- 推荐学习

php为啥速度快?按说每次访问重新执行能快才怪? - 知乎  推荐阅读

PHP 运行机制与原理  

从php内核角度分析php弱类型

全面解析PHP的糟糕设计(1)

全面解析PHP的糟糕设计(2)

php内核分析-zval

为什么Swoole可以加速php

安全|PHPStress:PHP拒绝服务攻击(含PoC)

PHP Opcache工作原理

如何发挥出PHP7的高性能

千万级并发实现的秘密:内核不是解决方案,而是问题所在!

PHP代码重构思考

专题1:PHP超时处理全面总结(3)

PHP 性能分析与实验——性能的宏观分析

萌新必备技能--PHP框架反序列化入门教程

PHP 安全更新|PHP 7.4.2 与 PHP 7.3.14,以及 PHP 7.2.27 正式发布  

(1)PHP内核 - 玩转php的编译与执行

(2)PHP内核 - 玩转php的编译与执行

php - tcp 粘包/拆包实例

放弃偏见,重新认识 PHP

对PHP变量的实现方式以及内存管理的梳理

从php内核角度分析php弱类型

php底层原理之垃圾回收机制

PHP 迁移 Mcrypt 至 OpenSSL 加密算法详解

【鸟哥】PHP7强悍性能背后,zval的变化!

PHP内核— SAPI接口-php教程-PHP中文网

视频教程

PHP7底层源码级开发实战_哔哩哔哩_bilibili

2. 整理输出

跟自己讲,看完上面的所有文档

2.1 引言 - 服务调用

在单体应用中,所有服务都打包在一个应用里面,我们只需要通过本地方法即可调用其他的服务。

比如,我们有 UserService 和 ProductService 两个服务,如果要在 UserService 中获取某个用户发布的商品,只需要实例化 ProductService,并传入用户参数到到数据库查询并返回结果即可,一切操作都是在本地内存中完成的,不同服务之间的调用并不涉及到任何网络传输,编译器会帮我们完成所有的函数调用、参数解析和代码执行。

以 PHP 为例,底层的执行逻辑如下(如果你对服务不太理解的话,常见的 MVC 模式其实就是一种单体应用架构模式):

2.2 PHP的架构图

2.3 TBd

2.x 编写PHP扩展

Zephir写PHP扩展(一) - 知乎

后续整理

...

3.问题/补充

1. php pcntl扩展的进程【sleep】

➜  php top -l 0 -s 2 -stats pid,ppid,cpu,mem,command,state | grep php

76423  1     0.0  3238M phpstorm         sleeping

66232  10116 0.0  9192K php              sleeping

66228  86718 0.0  9532K php              sleeping

66196  18300 0.0  9616K php              sleeping

66168  902   0.0  18M   php              sleeping

76423  1     5.4  3238M  phpstorm         sleeping

66168  902   0.0  18M    php              sleeping

66228  86718 0.0  9532K  php              sleeping

66196  18300 0.0  9616K  php              sleeping

66232  10116 0.0  9192K  php              sleeping

98592  98582 0.0  504K+  php              sleeping // 以下全是子进程

98591  98582 0.0  508K+  php              sleeping

98590  98582 0.0  504K+  php              sleeping

98589  98582 0.0  508K+  php              sleeping

98588  98582 0.0  504K+  php              sleeping

98587  98582 0.0  508K+  php              sleeping

98586  98582 0.0  504K+  php              sleeping

98585  98582 0.0  508K+  php              sleeping

98584  98582 0.0  504K+  php              sleeping

98583  98582 0.0  508K+  php              sleeping

98582  97030 0.0  7504K+ php              sleeping // 父进程

76423  1     2.9  3238M  phpstorm         sleeping

66232  10116 0.0  9192K  php              sleeping

66168  902   0.0  18M    php              sleeping

66228  86718 0.0  9532K  php              sleeping

66196  18300 0.0  9616K  php              sleeping

98592  98582 0.0  504K   php              sleeping

98591  98582 0.0  508K   php              sleeping

98590  98582 0.0  504K   php              sleeping

98589  98582 0.0  508K   php              sleeping

98588  98582 0.0  504K   php              sleeping

98587  98582 0.0  508K   php              sleeping

98586  98582 0.0  504K   php              sleeping

98585  98582 0.0  508K   php              sleeping

98584  98582 0.0  504K   php              sleeping

98583  98582 0.0  508K   php              sleeping

98582  97030 0.0  7504K  php              sleeping

76423  1     0.0  3238M  phpstorm         sleeping

66232  10116 0.0  9192K  php              sleeping

66196  18300 0.0  9616K  php              sleeping

66168  902   0.0  18M    php              sleeping

66228  86718 0.0  9532K  php              sleeping

76423  1     3.6  3238M  phpstorm         sleeping

66228  86718 0.0  9532K  php              sleeping

66196  18300 0.0  9616K  php              sleeping

66232  10116 0.0  9192K  php              sleeping

66168  902   0.0  18M    php              sleeping

^C

➜  php

demo.php

$childProcesses = array();  // 子进程 ID 的数组

for ($i = 0; $i < 10; $i++) {
    $pid = pcntl_fork();  // 创建子进程

    if ($pid == -1) {
        // 创建子进程失败
        die('无法创建子进程');
    } elseif ($pid == 0) {
        // code logic // 在子进程中执行的代码
        sleep(5);  // 子进程睡眠 5 秒钟
        exit(0);  // 子进程直接退出
    } else {
        // code logic // 在父进程中执行的代码
        $childProcesses[] = $pid;  // 记录子进程 ID
    }
}

// 等待所有子进程结束后才退出
foreach ($childProcesses as $pid) {
    pcntl_waitpid($pid, $status);
}

4.参考

参见文档阅读列表

后续补充

...

更多推荐

PHP - 底层/内核 - 学习/实践