赞
踩
5G 时代,万端互联,技术的变化,从分布式到微服务,PHPer 出现了很多质疑的声音,到底还能走多久,Laravel、Node、Docker 技术的大爆炸,对 PHPer 提出了新的破局的新方向。
万端互联,唯 PHPer 可担此重任,破局重生。
在本场 Chat 中,会讲到如下内容:
开源 PHP 社区解散以后,被语言圈里世界上最好的语言,出现了很多质疑的声音,粉碎质疑最好的发声就是用好的、客观的来叙述,php7 、composer 、swoole 的结合,我相信 PHP 是未来 5G 时代的最佳选择。
就是一个用 C 语言实现包含大量组件模块的软件框架。是一个强大的 UI 框架,拥有开源、简单、高效、易部署的诸多优点。
PHP 动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),然后 ZEND 虚拟机顺次执行这些指令完成操作。PHP 本身是用 C 实现的,因此最终调用的也是 C 的函数,实际上,我们可以把 PHP 看做一个 C 开发的软件。
在网络协议的知识体系里,分层是一个很重要,但是常常被忽略的一个概念。上图是协议中的分层模型,忽略网关的红线。
PHP 从下倒上是一个 4 层体系:
博主梦话:印象里在 win 上开发的时候,有个 ext 文件夹,里面装载着各种类库,就是 Extensions 层。
互联网上的 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$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 带来了新的方向。新的编程更方式由传统的桌子发展到一堆木板的自由搭配和组装。
对于 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 时代的互联网和以前完全不同的一点,也是最重要的一点,WiFi 在线,已经不在乎端的形式,PC、App、小程序 , AI 音箱(天猫精灵、小爱),体现的更加智能。
上图的树形结构,可在 server 层统一部署,目录和 Api。可同时提供 pc、wap、App、小程序多段服务。多端生态共享,数据统一计算。这样架构的系统的优点更能体现共享价值、数据精准计算后更好的为用户服务,5G 时代是“端的时代”,是更多链接互联网的端,从形态上来说不限于之前的互联网媒介,更有像公交站牌,智能家居,而 php 语言的特点将成为最合适的编程语言。
阅读全文: http://gitbook.cn/gitchat/activity/5e2156671b52a6160c3f078b
您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。