热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

记录·ThinkPHP5中使用swoole

(备注:这只是swoole和TP5结合的始端,想必二者的深入融合会有更多的坑需要踩!)首先去TP官网下载框架总体概览图:在项

(备注:这只是 swoole 和 TP5 结合的始端,想必二者的深入融合会有更多的坑需要踩!)
 
首先去 TP 官网下载框架
 

总体概览图:
 
记录·ThinkPHP5中使用swoole

在项目根目录下新建 server 文件夹,
http_server.php 内容如下(可以直接拷贝过去使用):

/*** Created by PhpStorm.* User: baidu* Date: 18/2/28* Time: 上午1:39*/
$http = new swoole_http_server("0.0.0.0", 8811);$http->set(['enable_static_handler' => true,'document_root' => "/home/work/swoole/thinkphpcore/public",'worker_num' => 5,'content-type' => 'text/html; charset=utf-8',]
);
$http->on('WorkerStart', function (swoole_server $server, $worker_id) {// 定义应用目录define('APP_PATH', __DIR__ . '/../application/');// 1. 加载基础文件require __DIR__ . '/../thinkphpcore/base.php';// 这里不能使用这种方式加载框架内容,不信你可以打开试试// require __DIR__ . '/../thinkphpcore/start.php';
});
$http->on('request', function($request, $response) use ($http) {//print_r($request->get);$content = ['date:' => date("Ymd H:i:s"),'get:' => $request->get,'post:' => $request->post,'header:' => $request->header,];swoole_async_writefile(__DIR__."/access.log", json_encode($content).PHP_EOL, function($filename) {// todo}, FILE_APPEND);$_SERVER = [];if (isset($request->server)) {foreach ($request->server as $k => $v) {$_SERVER[strtoupper($k)] = $v;}}$_HEADER = [];if (isset($request->header)) {foreach ($request->header as $k => $v) {$_HEADER[strtoupper($k)] = $v;}}$_GET = [];if (isset($request->get)) {foreach ($request->get as $k => $v) {$_GET[$k] = $v;}}$_POST = [];if (isset($request->post)) {foreach ($request->post as $k => $v) {$_POST[$k] = $v;}}// 2. 执行应用ob_start();try {think\App::run()->send();} catch (Exception $e) {echo $e->getMessage();}$res = ob_get_contents();ob_end_clean();$response->end($res);// 这是种简单粗暴的销毁进程、重新加载框架内容的方式// $http->close($request);
});$http->start();

一:开启 URL 普通模式
找到 thinkphp5-thinkphpcore-library-think-Request.php 的 pathinfo() 和 path() 方法
把这两处的 if (is_null) 判断语句注释掉.
因为如果不注释变量 pathinfo 只会存储框架第一次运行保存下来的值.

/*** 获取当前请求URL的pathinfo信息(含URL后缀)* @access public* @return string*/public function pathinfo(){
// if (is_null($this->pathinfo)) {.........
// }return $this->pathinfo;}/*** 获取当前请求URL的pathinfo信息(不含URL后缀)* @access public* @return string*/public function path(){
// if (is_null($this->path)) {.........
// }return $this->path;}

效果访问如下:
记录·ThinkPHP5中使用swoole

二:开启 pathinfo 模式:

/*** 获取当前请求URL的pathinfo信息(含URL后缀)* @access public* @return string*/public function pathinfo(){// 配置 pathinfo if (isset($_SERVER['PATH_INFO']) && $_SERVER['PATH_INFO'] != '/') {return ltrim($_SERVER['PATH_INFO'], '/');}// 配置 普通访问模式
// if (is_null($this->pathinfo)) {.........
// }return $this->pathinfo;}/*** 获取当前请求URL的pathinfo信息(不含URL后缀)* @access public* @return string*/public function path(){
// if (is_null($this->path)) {.........
// }return $this->path;}

访问效果如下:
记录·ThinkPHP5中使用swoole

记录·ThinkPHP5中使用swoole

Index.php 示例代码:

{public function index(Request $request){return 'hello-swoole';}public function check(){print_r($_GET);return time();}public function getClientIp(){$list = swoole_get_local_ip();print_r($list);}
}

 
Swoole 官方是这样介绍的:HttpServer

  • swoole_http_server对Http协议的支持并不完整,建议仅作为应用服务器。并且在前端增加Nginx作为代理
  • swoole-1.7.7增加了内置Http服务器的支持,通过几行代码即可写出一个异步非阻塞多进程的Http服务器。

    $http = new swoole_http_server("127.0.0.1", 9501);
    $http->on('request', function ($request, $response) {
    $response->end("

    Hello Swoole. #".rand(1000, 9999)."

    ");
    });
    $http->start();

通过使用apache bench工具进行压力测试,在Inter Core-I5 4核 + 8G内存的普通PC机器上,swoole_http_server可以达到近11万QPS。远远超过php-fpm,golang自带http服务器,node.js自带http服务器。性能几乎接近与Nginx的静态文件处理。

ab -c 200 -n 200000 -k http://127.0.0.1:9501

转:https://blog.51cto.com/laok8/2314816



推荐阅读
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
  • Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Loope ... [详细]
  • 阿里云 Aliplayer高级功能介绍(八):安全播放
    如何保障视频内容的安全,不被盗链、非法下载和传播,阿里云视频点播已经有一套完善的机 ... [详细]
  • 在React中使用setState时遇到错误,本文将详细分析错误原因并提供解决方案。 ... [详细]
  • 本文探讨了 Canvas 元素在不同尺寸设置下出现变形失真的原因,并详细解释了 HTML 尺寸和 CSS 尺寸的区别及其对视觉效果的影响。 ... [详细]
  • 事件是程序各部分之间的一种通信方式,也是异步编程的一种实现形式。本文将详细介绍EventTarget接口及其相关方法,以及如何使用监听函数处理事件。 ... [详细]
  • 本文介绍了如何使用Python爬取妙笔阁小说网仙侠系列中所有小说的信息,并将其保存为TXT和CSV格式。主要内容包括如何构造请求头以避免被网站封禁,以及如何利用XPath解析HTML并提取所需信息。 ... [详细]
  • 本文详细探讨了使用Python3编写爬虫时如何应对网站的反爬虫机制,通过实例讲解了如何模拟浏览器访问,帮助读者更好地理解和应用相关技术。 ... [详细]
  • 传统上,Java 的 String 类一直使用 char 数组来存储字符数据。然而,在 Java 9 及更高版本中,String 类的内部实现改为使用 byte 数组。本文将探讨这一变化的原因及其带来的好处。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • Nacos 0.3 数据持久化详解与实践
    本文详细介绍了如何将 Nacos 0.3 的数据持久化到 MySQL 数据库,并提供了具体的步骤和注意事项。 ... [详细]
  • python模块之正则
    re模块可以读懂你写的正则表达式根据你写的表达式去执行任务用re去操作正则正则表达式使用一些规则来检测一些字符串是否符合个人要求,从一段字符串中找到符合要求的内容。在 ... [详细]
  • 一、Tomcat安装后本身提供了一个server,端口配置默认是8080,对应目录为:..\Tomcat8.0\webapps二、Tomcat8.0配置多个端口,其实也就是给T ... [详细]
  • 本文详细解析了ASP.NET 2.0中的Callback机制,不仅介绍了基本的使用方法,还深入探讨了其背后的实现原理。通过对比Atlas框架,帮助读者更好地理解和应用这一机制。 ... [详细]
author-avatar
麻廿_965
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有