一直以来,PHP 由于标准应用方式是配合 php-fpm 或 apache mod 使用,而被认为不适合作服务化后端。可是随着 Workerman 和 Swoole 这些常驻进程模块的出现,PHP 其实早就已经合格。php
下面我就介绍如何用 PHP 来搭建一个高性能的服务化后端框架,而且实现一个客户端调用例子。git
如今 PHP 圈子里最流行的框架是 Laravel, Lumen 是它的精简版,保留了 Container(依赖注入), artisan(命令行生成数据表)等优势。github
服务端我使用的框架叫 Luke,Github 地址在这里。Luke 是 Lumen 的非官方分支,在 Lumen 上层作了一层封装,剥离了用于 http 的路由,同时引入 Workerman。算法
如今在你的工做目录执行下面命令生成项目代码apache
composer create-project luke/luke=dev-luke rpcserver cd rpcserver
这时在 servers 目录下有 http.php 和 jsonrpc.php 两个文件,分别对应 http 服务 和 jsonrpc 服务。如今咱们进入 rpcserver/app/Http/Controllers,编辑文件 ExampleController.php,增长下面代码json
public function show($name) { return "Hello $name, this is Luke."; }
这样咱们服务端就已经搭建好了,如今回到 rpcserver 目录,执行下面命令开启服务后端
php servers/jsonrpc.php start
这时 console 会输出架构
Workerman[servers/jsonrpc.php] start in DEBUG mode ----------------------- WORKERMAN ----------------------------- Workerman version:3.5.4 PHP version:7.2.1 ------------------------ WORKERS ------------------------------- user worker listen processes status simon none jsonNL://0.0.0.0:8000 1 [OK] ----------------------------------------------------------------
表示服务正在正常运行。并发
本例子只给 Workerman 一个任务进程,更多设置和守护进程方式能够查看 Workerman文档app
如今咱们回到项目根目录,另开一个 console,输入下面命令新建客户端目录,引入模块
mkdir client cd client composer require luke/client
这时 vendor/luke/client 目录下已经有了两个文件 config.php 和 test.php,他们分别是配置和客户端的例子。咱们无论他们,在项目目录下新建 test.php 文件,输入下面的代码并保存
<?php require 'vendor/autoload.php'; use Luke\Client; $config = [ 'default' => [ 'hosts' => ['127.0.0.1:8000'] ] ]; Client::config($config); $client = Client::instance("Example"); $ret = $client->show('开发者'); var_dump($ret);
如今执行
php test.php
若是看到输出
array(1) { 'result' => string(30) "Hello 开发者, this is Luke." }
那么恭喜你!你的 rpc 服务端和客户端已经搭建好了。如今将它应用到正式项目中吧。
做为 PHP 的常驻方案,两个都很是优秀,而 Swoole 在社区的活跃度比 Workerman 高。但由于二者性能不分伯仲,并且 Workerman 是用纯 PHP 开发,代码更为可控,所以 Luke 选择了 Workerman。然而二者在调用方式很是接近,只要对代码稍加修改就能改为使用 Swoole。
Workerman 的并发性能能够参考这里
在生产环境使用服务化架构,通讯部分除了协议外,还要注意加密。这部分 Luke 如今尚未提供,用户能够用简单的加密算法本身实现。
当服务变多后,还须要添加自动发现的功能,这点在 Luke Client 的项目主页提供了一些思路。