Laravel 集成 Swoole 教程
83

作为php开发工程师,不能仅仅局限于传统的nginx+fpm的模式,学习swoole是一个必要的过程,可以对自身的技术栈做一个提升,学习过程中可以理解swoole为php带来了哪些改变,为何越来越多的人拥抱swoole,那么这篇教程就简单的讲解一下如何在laravel中引入swoole。

1.可以关注一下本人

网站https://laravelchen.com/
githubhttps://github.com/LaravelChen
swoole教程https://laravelchen.com/series/24

2.准备工作

1.安装Laravel

laravel new laravel-swoole

本人使用valet进行开发,可以使用

laravel-swoole.test

进行访问

3.引入swoole

具体的swoole安装请移步官网进行下载,编译,安装,这里不多阐述了。

1.在项目更目录创建一个server文件夹,然后在该文件夹中创建http_server.php文件,具体的文件内容如下

 <?php
$http = new swoole_http_server('127.0.0.1', 9501);

$http->set([
    'worker_num' => 8,
    'max_request' => 5000,
//    'document_root' => '/Users/apple/Code/Teacher_Project/swoole_live/resources/live/',
//    'enable_static_handler' => true,
]);

//工作进程启动
$http->on('WorkerStart', function ($serv, $worker_id) {
    //加载index文件的内容
    require __DIR__ . '/../vendor/autoload.php';
    require_once __DIR__ . '/../bootstrap/app.php';
});

//监听http请求
$http->on('request', function ($request, $response) {

    //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) {
            $_SERVER[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;
        }
    }

    //文件请求
    if (isset($request->files)) {
        foreach ($request->files as $k => $v) {
            $_FILES[$k] = $v;
        }
    }

    //cookies请求
    if (isset($request->cookie)) {
        foreach ($request->cookie as $k => $v) {
            $_COOKIE[$k] = $v;
        }
    }

    ob_start();//启用缓存区

    //加载laravel请求核心模块
    $kernel = app()->make(Illuminate\Contracts\Http\Kernel::class);
    $laravelResponse = $kernel->handle(
        $request = Illuminate\Http\Request::capture()
    );
    $laravelResponse->send();
    $kernel->terminate($request, $laravelResponse);

    $res = ob_get_contents();//获取缓存区的内容
    ob_end_clean();//清除缓存区

    //输出缓存区域的内容
    $response->end($res);
});

$http->start();

在路由文件加入路由:

Route::get('/test1', 'UsersController@test');
Route::get('/test2','UsersController@test2');

在控制器添加方法:

    /**
     * 测试1
     * @param Request $request
     * @return string
     */
    public function test(Request $request)
    {
        return view('test');#在你的视图文件夹创建test.blade.php
    }

    /**
     * 测试2
     * @param Request $request
     * @return string
     */
    public function test2(Request $request)
    {
        return 'Hello World2:' . $request->get('name');
    }

4.启动swoole

在终端下输入:

php server/http_server.php

访问浏览器:

http://127.0.0.1:9501/test1
http://127.0.0.1:9501/test2?name=Jelly

对应的结果如下:
访问test1路由

访问test2路由

LaravelChen

本帖由系统于 6个月前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 18

@LaravelChen 请问一下 集成 Swoole后 网站访问速度会更快吗?

6个月前
LaravelChen

@回思恋莹 那是肯定的,毋庸置疑。。。。你可以自己试试做个压测看看,性能提升很大

6个月前
LaravelChen

@回思恋莹 其实这个写法还不正规,应该写成类的形式,比较好,你可以自己改造一下,也简单的,我这边只是一个引子,感兴趣的可以继续往下学习,不过我这边推荐一个EasySwoole框架,不错的哦,另外推荐一个基于EasySwoole封装的满足api开发的框架https://github.com/LaravelChen/swoole_api_framework,我用这个实现了聊天的效果,很不多,具体的项目可以看https://github.com/LaravelChen/swoole_chat_framework

6个月前

@LaravelChen 感谢 我来研究下

6个月前
Littlesqx

这样算不算滥用全局变量,几个超全局变量都没有回收

6个月前
LaravelChen

@Littlesqx 对的,并没有做回收处理,只是一个引子,不做任何生产处理。

6个月前

dingo-api如何进行集成

5个月前

singwa的课程?

5个月前
Abyss1st

:+1:

4个月前

这个代码功能还差不少呢。 不支持静态资源,不支持cookie session redirect , tp5.1.20 已经完美支持swoole http server了

4个月前

:+1:

3个月前

swoole官网上面有推荐 laravel的swoole包,那个功能特别全

3个月前

@839891627 laravels?那个还不够完美,比如将laravel-admin跑到laravels上的时候laravel-admin自带的导出数据到csv和退出功能无法正常使用

3个月前
晨读秀

file

3个月前
JasonG

@泽 那个教程有学过吗?怎么样?

2个月前
blankqwq

file

        $_SERVER=[];
        if ($request->header)
            foreach ($request->header as $k=>$v){
                $_SERVER[strtoupper($k)]=$v;
            }
        if ($request->server)
            foreach ($request->server as $k=>$v){
                $_SERVER[strtoupper($k)]=$v;
            }
        $_GET=[];
        if ($request->get)
            foreach ($request->get as $k=>$v){
                $_GET[$k]=$v;
            }
        $_POST=[];
        if ($request->post)
            foreach ($request->post as $k=>$v){
                $_POST[$k]=$v;
            }

        //文件请求
        $_FILES=[];
        if (isset($request->files)) {
            foreach ($request->files as $k => $v) {
                $_FILES[$k] = $v;
            }
        }

        //cookies请求
        $_COOKIE=[];
        if (isset($request->cookie)) {
            foreach ($request->cookie as $k => $v) {
                $_COOKIE[$k] = $v;
            }
        }

大佬如何解决这种警报哇
Notice: Undefined index: argv in /home/vagrant/chart/vendor/symfony/console/Input/ArgvInput.php on line 55 Warning: array_shift() expects parameter 1 to be array, null given in /home/vagrant/chart/vendor/symfony/console/Input/ArgvInput.php on line 59 Warning: Invalid argument supplied for foreach() in /home/vagrant/chart/vendor/symfony/console/Input/ArgvInput.php on line 282

3周前
blankqwq

设定了一个$_SERVER['argv']=['1']之后就没用问题了,想请教一下这个argv有什么用咩

3周前

@侧面 laravel-admin和laravel不是同一回事吧

3天前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!