PHP - 为什么说5G时代最好的语言

5G 时代,万端互联,技术的变化,从分布式到微服务,PHPer 出现了很多质疑的声音,到底还能走多久,Laravel、Node、Docker 技术的大爆炸,对 PHPer 提出了新的破局的新方向。

万端互联,唯 PHPer 可担此重任,破局重生。

在本场 Chat 中,会讲到如下内容:

  • 深入内部从根本上解释PHP是什么
  • 5G 时代,PHP 能为你做什么
  • 数据结构倒影里的 PHP 语言
  • 万能的数组和优雅的面向对象编程
  • 搭上网络的列车,重新定义世界上最好的语言
  • 万端互联,没你不行

简述

开源 PHP 社区解散以后,被语言圈里世界上最好的语言,出现了很多质疑的声音,粉碎质疑最好的发声就是用好的、客观的来叙述,php7 、composer 、swoole 的结合,我相信 PHP 是未来 5G 时代的最佳选择。

PHP 是什么

就是一个用 C 语言实现包含大量组件模块的软件框架。是一个强大的 UI 框架,拥有开源、简单、高效、易部署的诸多优点。

php1-1.jpg

PHP 动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),然后 ZEND 虚拟机顺次执行这些指令完成操作。PHP 本身是用 C 实现的,因此最终调用的也是 C 的函数,实际上,我们可以把 PHP 看做一个 C 开发的软件。

PHP 的分层体系
tcp1-1.png

在网络协议的知识体系里,分层是一个很重要,但是常常被忽略的一个概念。上图是协议中的分层模型,忽略网关的红线。

PHP 从下倒上是一个 4 层体系:

  1. Zend 引擎:Zend 整体用纯 C 实现,是 PHP 的内核部分,他将 PHP 代码翻译(词法、语法解析等一系列编译过程)为可执行 opcode 的处理并实现相应的处理方法、实现了基本的数据结构(如:hash_table、OO)、内存分配机制及管理、提供了相应的 api 方法供外部调用,是一切的核心,所有的外围功能均围绕 Zend 实现。
  2. Extensions:围绕着 Zend 引擎,extensions 通过组件式的方式提供各种基础服务,我们常见的各种内置函数(array 系列)、标准库等都是通过 extension 来实现 CGI 即通用网关接口,用户也可以根据需要实现自己的 extension 的典型应用)。
  3. Sapi:Sapi 全称 Server Application Programming Interface,也就是服务端应用编程接口,Sapi 通过一系列钩子函数,使得 PHP 可以和外围交互数据,这是 PHP 非常优雅和成功的设计,通过 sapi 成功的将 PHP 本身和上层应用解耦隔离,PHP 可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。
  4. 上层应用:这就是我们平时编写的 PHP 程序,通过不同的 spai 方式得到各种各样的应用模式,如何通过 webserver 实现 web 应用、在命令行下已脚本方式运行等等。

博主梦话:印象里在 win 上开发的时候,有个 ext 文件夹,里面装载着各种类库,就是 Extensions 层。

服务端运行 - CGI/FastCGI

互联网上的 Web 服务都属于 html,静态资源分布,随着互联网的发展,后来出现了像 asp、jsp、php 这种动态语言,动态语言的特点是需要 Web 服务器的解析 Cgi 就是 Web 服务器和动态语言通信的网关。

data11.jpg

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 函数打印变量会得出类型,值、和引用数的三个结构体。

data09.jpg
data10.jpg

说一个语言的时候,不得不说语言的数据结构,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 音箱(天猫精灵、小爱),体现的更加智能。

data12.jpg

上图的树形结构,可在 server 层统一部署,目录和 Api。可同时提供 pc、wap、App、小程序多段服务。多端生态共享,数据统一计算。这样架构的系统的优点更能体现共享价值、数据精准计算后更好的为用户服务,5G 时代是“端的时代”,是更多链接互联网的端,从形态上来说不限于之前的互联网媒介,更有像公交站牌,智能家居,而 php 语言的特点将成为最合适的编程语言。

阅读全文: http://gitbook.cn/gitchat/activity/5e2156671b52a6160c3f078b

您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

FtooAtPSkEJwnW-9xkCLqSTRpBKX

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值