5G 时代,万端互联,技术的变化,从分布式到微服务,PHPer 出现了很多质疑的声音,到底还能走多久,Laravel、Node、Docker 技术的大爆炸,对 PHPer 提出了新的破局的新方向。
万端互联,唯 PHPer 可担此重任,破局重生。
在本场 Chat 中,会讲到如下内容:
- 深入内部从根本上解释PHP是什么
- 5G 时代,PHP 能为你做什么
- 数据结构倒影里的 PHP 语言
- 万能的数组和优雅的面向对象编程
- 搭上网络的列车,重新定义世界上最好的语言
- 万端互联,没你不行
简述
开源 PHP 社区解散以后,被语言圈里世界上最好的语言,出现了很多质疑的声音,粉碎质疑最好的发声就是用好的、客观的来叙述,php7 、composer 、swoole 的结合,我相信 PHP 是未来 5G 时代的最佳选择。
PHP 是什么
就是一个用 C 语言实现包含大量组件模块的软件框架。是一个强大的 UI 框架,拥有开源、简单、高效、易部署的诸多优点。
PHP 动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),然后 ZEND 虚拟机顺次执行这些指令完成操作。PHP 本身是用 C 实现的,因此最终调用的也是 C 的函数,实际上,我们可以把 PHP 看做一个 C 开发的软件。
PHP 的分层体系
在网络协议的知识体系里,分层是一个很重要,但是常常被忽略的一个概念。上图是协议中的分层模型,忽略网关的红线。
PHP 从下倒上是一个 4 层体系:
- Zend 引擎:Zend 整体用纯 C 实现,是 PHP 的内核部分,他将 PHP 代码翻译(词法、语法解析等一系列编译过程)为可执行 opcode 的处理并实现相应的处理方法、实现了基本的数据结构(如:hash_table、OO)、内存分配机制及管理、提供了相应的 api 方法供外部调用,是一切的核心,所有的外围功能均围绕 Zend 实现。
- Extensions:围绕着 Zend 引擎,extensions 通过组件式的方式提供各种基础服务,我们常见的各种内置函数(array 系列)、标准库等都是通过 extension 来实现 CGI 即通用网关接口,用户也可以根据需要实现自己的 extension 的典型应用)。
- Sapi:Sapi 全称 Server Application Programming Interface,也就是服务端应用编程接口,Sapi 通过一系列钩子函数,使得 PHP 可以和外围交互数据,这是 PHP 非常优雅和成功的设计,通过 sapi 成功的将 PHP 本身和上层应用解耦隔离,PHP 可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。
- 上层应用:这就是我们平时编写的 PHP 程序,通过不同的 spai 方式得到各种各样的应用模式,如何通过 webserver 实现 web 应用、在命令行下已脚本方式运行等等。
博主梦话:印象里在 win 上开发的时候,有个 ext 文件夹,里面装载着各种类库,就是 Extensions 层。
服务端运行 - CGI/FastCGI
互联网上的 Web 服务都属于 html,静态资源分布,随着互联网的发展,后来出现了像 asp、jsp、php 这种动态语言,动态语言的特点是需要 Web 服务器的解析 Cgi 就是 Web 服务器和动态语言通信的网关。
CGI 即通用网关接口(Common Gateway Interface),它是动态语言的产物,是负责 Web 服务与 PHP 通信的接口,CGI 方式在遇到连接请求(用户 请求)先要创建 cgi 的子进程,激活一个 CGI 进程,然后处理请求,处理完后结束这个子进程。这就是 fork-and-execute 模式。所以用 cgi 方式的服务器有多少连接请求就会有多少 cgi 子进程,子进程反复加载是 cgi 性能低下的主要原因。
在这个基础上产生了 FastCGI,FastCGI 像是一个常驻(long-live)型的 CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去 fork 一 次。PHP 使用 PHP-FPM(FastCGI Process Manager),全称 PHP FastCGI 进程管理器进行管理。
从数据结构上看 PHP
<?php$arr = [ 0 => ['name' => 'stark' ,'age' => 30 ], 1 => ['name' => 'irco' ,'age' => 35 ], ];$name = 'stark 张';debug_zval_dump($name);// string(8) "stark 张" refcount(1)?>
提起一个编程语言,如果只是会简单的应用是难以真正的理解,要分析所在的数据结构,用 debugzvaldebug 函数打印变量会得出类型,值、和引用数的三个结构体。
说一个语言的时候,不得不说语言的数据结构,PHP 中对数据操作的函数有很多,它主要依赖于链表和散列表(Hash Table)的结构实现,一般链表和数据都会混合使用,如果单纯地采用链表的话,时间复杂度只能是 O(n)。如果我们将散列表和链表两种数据结构组合使用,可以将这三个操作的时间复杂度都降低到 O(1)。
万能的数组
PHP 的操作便捷的优点集中体现在对数组的操作上,PHP 对数组、链表、栈等诸多数据结构类型都有很大的优点,对排序算法有更好的支持,数组的系统函数可以做很多功能类的组合,以求用最简单的代码实现方式来说明数据的结构和算法。用下面的代码做说明:
<?php class Deque { public $queue = array(); /**(尾部)入队 **/ public function addLast($value) { return array_push($this->queue,$value); } /**(尾部)出队**/ public function removeLast() { return array_pop($this->queue); } /**(头部)入队**/ public function addFirst($value) { return array_unshift($this->queue,$value); } /**(头部)出队**/ public function removeFirst() { return array_shift($this->queue); } /**清空队列**/ public function makeEmpty() { unset($this->queue); } /**获取列头**/ public function getFirst() { return reset($this->queue); } /** 获取列尾 **/ public function getLast() { return end($this->queue); } /** 获取长度 **/ public function getLength() { return count($this->queue); } }
优雅的面向对象编程
再一次老业务升级的偶然过程中接触到 Laravel 框架,Node 技术的大爆炸,引发了大前端的技术革命,而 composer 的成熟,丰富了 php 单一的社群,给 php 带来了新的方向。新的编程更方式由传统的桌子发展到一堆木板的自由搭配和组装。
Composer
对于 php 的开发人员来说,composer 并不陌生,来实现和引入第三方类库,并利用其实现依赖管理和自动升级。
可以这么说,composer 的成功,给 php 语言带来了一剂强心针,丰富和壮大了 php 社区,让第三方库使用的更加快捷、高效。
{ "name": "laravel/laravel", "type": "project", "description": "The Laravel Framework.", "keywords": [ "framework", "laravel" ], "license": "MIT", "require": { "php": "^7.2", "fideloper/proxy": "^4.0", "laravel/framework": "^6.2", "laravel/tinker": "^1.0" }, ......
composer 借助 php 自动加载的特性,更好的实现了管理、加载第三方库的插件的便利。
以 Laravel 为例,它更好的兼容了 Composer ,把数据和关系统一封装在一个实例化的 Collection 对象中。
Collection {#320 ▼ #items: array:5 [▼ 0 => Article {#321 ▼ #table: "art_article" #primaryKey: "art_id" +timestamps: false #field: array:13 [▶] ...... }
搭上网络的列车
初学编程时,对 PHP 的网络能力了解的很少,此类的书籍也不是很多,TCP/UDP/Socket 这些东西都是什么用的呢?其实 PHP 不仅对网络的支持很好,对 redis 和 memcache 的应用支持的也很好,引用类库,就可以放心使用,不只是像 Java 才有这方面的能力,PHP 在使用上也毫无逊色,下面是 Redis、UDP、TCP 的代码说明。
$redis=new Redis;$redis->connect('127.0.0.1',6379);
<?php error_reporting( E_ALL ); set_time_limit( 0 ); ob_implicit_flush(); $socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP ); if ( $socket === false ) { echo "socket_create() failed:reason:" . socket_strerror( socket_last_error() ) . "\n"; } $ok = socket_bind( $socket, '202.85.218.133', 11109 ); if ( $ok === false ) { echo "socket_bind() failed:reason:" . socket_strerror( socket_last_error( $socket ) ); } while ( true ) { $from = ""; $port = 0; socket_recvfrom( $socket, $buf,1024, 0, $from, $port ); echo $buf; usleep( 1000 ); }
<?php //error_reporting( E_ALL ); set_time_limit( 0 ); ob_implicit_flush(); $socket = socket_create( AF_INET, SOCK_STREAM, SOL_TCP ); socket_bind( $socket, '192.168.2.143', 11109 ); socket_listen($socket); $acpt=socket_accept($socket); echo "Acpt!\n"; while ( $acpt ) { $words=fgets(STDIN); socket_write($acpt,$words); $hear=socket_read($acpt,1024); echo $hear; if("bye\r\n"==$hear){ socket_shutdown($acpt); break; } usleep( 1000 ); } socket_close($socket);
后来很多大企业中把服务中的网络协议封装成,系统的 RPC,应用到很多应用中。建筑师在动工一座大厦的时候都要有沙盘,也算是模型,构建它的美学和建筑原理,RPC 也一样,RPC 概念出现的很早,后来在 Bruce Jay Nelson 的论文里,定义了 RPC 的调用标准。后面所有 RPC 框架,都是按照这个标准模式来的。所谓 RPC(Remote Procedure Call)远程过程调用。
操作远程和远程调用的思路是一样的,就像操作本地一样。所以 NFS 协议就是基于 RPC 实现的。当然无论是什么 RPC,底层都是 Socket 编程。
博主梦话:用远程 RPC 也可以实现,用 URL 的形式也可以实现,那么用 RPC 有什么好处呢?RPC 直接走 Socket 接口,加快了服务的传输速度,URL 需要经过数据链路层、网络层、传输层 一步一步走到应用层,在性能上应该有很大的差距。
5G 时代,没你不行
5G 时代的互联网和以前完全不同的一点,也是最重要的一点,WiFi 在线,已经不在乎端的形式,PC、App、小程序 , AI 音箱(天猫精灵、小爱),体现的更加智能。
上图的树形结构,可在 server 层统一部署,目录和 Api。可同时提供 pc、wap、App、小程序多段服务。多端生态共享,数据统一计算。这样架构的系统的优点更能体现共享价值、数据精准计算后更好的为用户服务,5G 时代是“端的时代”,是更多链接互联网的端,从形态上来说不限于之前的互联网媒介,更有像公交站牌,智能家居,而 php 语言的特点将成为最合适的编程语言。
阅读全文: http://gitbook.cn/gitchat/activity/5e2156671b52a6160c3f078b
您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。