목차
小结" >小结
扩展" >扩展
PHP 프레임워크 Swoole Swoole HTTP 애플리케이션 소개

Swoole HTTP 애플리케이션 소개

Jan 13, 2021 am 10:07 AM
http swoole

Swoole HTTP 애플리케이션 소개

推荐(免费):Swoole

概述

我们都知道HTTP是一种协议,允许WEB服务器和浏览器通过互联网进行发送和接受数据。

想对HTTP进行详细的了解,可以找下其他文章,这篇文章不多做介绍。

我们在网上能看到的界面,图片,动画,音频,视频等,都有依赖这个协议的。

在做WEB系统的时候,都使用过IIS,Apache,Nginx吧,我们利用Swoole也可以简单的实现一个WEB服务器。

主要使用了HTTP的两个大对象:Request请求对象,Response响应对象。

请求,包括GET,POST,COOKIE,Header等。

响应,包括状态,响应体,扩展,发送文件等。

不多说,先分享两个程序:

  • 一,实现一个基础的Demo:“你好,Swoole。”

  • 二,实现一个简单的路由控制

本地版本:  

  • PHP 7.2.6

  • 旋风4.3.1

代码

一,Demo:“你好,Swoole。”   

示例效果:    

     

备注:IP地址是我的虚拟机。   

示例代码:   

<?php

class Server
{
 private $serv;

 public function __construct() {
        $this->serv = new swoole_http_server("0.0.0.0", 9502);
        $this->serv->set([
 'worker_num' => 2, //开启2个worker进程
 'max_request' => 4, //每个worker进程 max_request设置为4次
 'daemonize' => false, //守护进程(true/false)
 ]);

        $this->serv->on('Start', [$this, 'onStart']);
        $this->serv->on('WorkerStart', [$this, 'onWorkStart']);
        $this->serv->on('ManagerStart', [$this, 'onManagerStart']);
        $this->serv->on("Request", [$this, 'onRequest']);

        $this->serv->start();
 }

 public function onStart($serv) {
        echo "#### onStart ####".PHP_EOL;
        echo "SWOOLE ".SWOOLE_VERSION . " 服务已启动".PHP_EOL;
        echo "master_pid: {$serv->master_pid}".PHP_EOL;
        echo "manager_pid: {$serv->manager_pid}".PHP_EOL;
        echo "########".PHP_EOL.PHP_EOL;
 }

 public function onManagerStart($serv) {
        echo "#### onManagerStart ####".PHP_EOL.PHP_EOL;
 }

 public function onWorkStart($serv, $worker_id) {
        echo "#### onWorkStart ####".PHP_EOL.PHP_EOL;
 }

 public function onRequest($request, $response) {
        $response->header("Content-Type", "text/html; charset=utf-8");
        $html = "<h1>你好 Swoole.</h1>";
        $response->end($html);
 }
}

$server = new Server();
로그인 후 복사

二,路由控制     

示例效果:    

目录结构:

├─ swoole_http  -- 代码根目录
│ ├─ server.php
│ ├─ controller
│ ├── Index.php
│ ├── Login.php
로그인 후 복사

示例代码:     

server.php     

<?php

class Server
{
 private $serv;

 public function __construct() {
        $this->serv = new swoole_http_server("0.0.0.0", 9501);
        $this->serv->set([
 'worker_num' => 2, //开启2个worker进程
 'max_request' => 4, //每个worker进程 max_request设置为4次
 'document_root' => '',
 'enable_static_handler' => true,
 'daemonize' => false, //守护进程(true/false)
 ]);

        $this->serv->on('Start', [$this, 'onStart']);
        $this->serv->on('WorkerStart', [$this, 'onWorkStart']);
        $this->serv->on('ManagerStart', [$this, 'onManagerStart']);
        $this->serv->on("Request", [$this, 'onRequest']);

        $this->serv->start();
 }

 public function onStart($serv) {
        echo "#### onStart ####".PHP_EOL;
        swoole_set_process_name('swoole_process_server_master');

        echo "SWOOLE ".SWOOLE_VERSION . " 服务已启动".PHP_EOL;
        echo "master_pid: {$serv->master_pid}".PHP_EOL;
        echo "manager_pid: {$serv->manager_pid}".PHP_EOL;
        echo "########".PHP_EOL.PHP_EOL;
 }

 public function onManagerStart($serv) {
        echo "#### onManagerStart ####".PHP_EOL.PHP_EOL;
        swoole_set_process_name('swoole_process_server_manager');
 }

 public function onWorkStart($serv, $worker_id) {
        echo "#### onWorkStart ####".PHP_EOL.PHP_EOL;
        swoole_set_process_name('swoole_process_server_worker');

        spl_autoload_register(function ($className) {
            $classPath = __DIR__ . "/controller/" . $className . ".php";
 if (is_file($classPath)) {
 require "{$classPath}";
 return;
 }
 });
 }

 public function onRequest($request, $response) {
        $response->header("Server", "SwooleServer");
        $response->header("Content-Type", "text/html; charset=utf-8");
        $server = $request->server;
        $path_info    = $server['path_info'];
        $request_uri  = $server['request_uri'];

 if ($path_info == '/favicon.ico' || $request_uri == '/favicon.ico') {
 return $response->end();
 }

        $controller = 'Index';
        $method     = 'home';


 if ($path_info != '/') {
            $path_info = explode('/',$path_info);
 if (!is_array($path_info)) {
                $response->status(404);
                $response->end('URL不存在');
 }

 if ($path_info[1] == 'favicon.ico') {
 return;
 }

            $count_path_info = count($path_info);
 if ($count_path_info > 4) {
                $response->status(404);
                $response->end('URL不存在');
 }

            $controller = (isset($path_info[1]) && !empty($path_info[1])) ? $path_info[1] : $controller;
            $method = (isset($path_info[2]) && !empty($path_info[2])) ? $path_info[2] : $method;
 }

        $result = "class 不存在";

 if (class_exists($controller)) {
            $class = new $controller();
            $result = "method 不存在";
 if (method_exists($controller, $method)) {
                $result = $class->$method($request);
 }
 }

        $response->end($result);
 }
}

$server = new Server();
로그인 후 복사

Index.php

<?php

class Index
{
 public function home($request)
 {
        $get = isset($request->get) ? $request->get : [];

 //@TODO 业务代码

        $result = "<h1>你好,Swoole。</h1>";
        $result.= "GET参数:".json_encode($get);
 return $result;
 }
}
로그인 후 복사

Login.php

<?php

class Login
{
 public function index($request)
 {
        $post = isset($request->post) ? $request->post : [];

 //@TODO 业务代码

 return "<h1>登录成功。</h1>";
 }
}
로그인 후 복사

小结

一,Swoole可以替代Nginx吗?

暂时不能,通过Swoole越来越强大,以后说不准。

官方建议Swoole与Nginx结合使用。

Http \ Server对Http协议的支持并不完整,建议仅作为应用服务器。并且在前端增加Nginx作为代理。

根据自己的Nginx配置文件,可以自行调整。

例如:可以添加一个配置文件

enable-swoole-php.conf

location ~ [^/]\.php(/|$)
{
    proxy_http_version 1.1;
    proxy_set_header Connection "keep-alive";
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass http://127.0.0.1:9501;
}
로그인 후 복사

我们都习惯于将虚拟域名的配置文件放在vhost文件夹中。

例如,虚拟域名的配置文件为:local.swoole.com.conf,可以选择加载enable-php.conf,也可以选择加载enable-swoole-php.conf。

配置文件供参考:

server
 {
        listen 80;
 #listen [::]:80;
        server_name local.swoole.com ;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/project/swoole;

 #include rewrite/none.conf;
 #error_page   404   /404.html;

 #include enable-php.conf;
        include enable-swoole-php.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
 {
            expires      30d;
 }

        location ~ .*\.(js|css)?$
 {
            expires      12h;
 }

        location ~ /.well-known {
            allow all;
 }

        location ~ /\.
 {
            deny all;
 }

        access_log  /home/wwwlogs/local.swoole.com.log;
 }
로그인 후 복사

当前,我们直接编辑server段的代码也是可以的。

二,修改了controller文件夹中的业务代码,每次都是重启服务才生效吗?

不是,每次重启服务可能会影响到正常用户使用的,正常处理的请求会被强制关闭。

在本地运行路由控制的代码时,试试这个命令:

ps aux | grep swoole_process_server_master | awk '{print $2}' | xargs kill -USR1
로그인 후 복사

给master进程发送一个USR1的信号,当Swoole Server接收到该信号后,就会让所有worker在处理完当前的请求后,进行重启。

如果查看所有的进程,试试这个命令:

ps -ef | grep 'swoole_process_server'| grep -v 'grep'
로그인 후 복사

扩展

  • 可以试着上传文件,做一个小的FTP服务器。

  • 可以学习Swoole开源框架:EasySwoole,Swoft,One。

  • 可以将Swoole整合到当前正在使用的PHP框架中。

更多相关精品文章敬请关注swoole框架栏目!    

위 내용은 Swoole HTTP 애플리케이션 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Laravel에서 Swoole 코루틴을 사용하는 방법 Laravel에서 Swoole 코루틴을 사용하는 방법 Apr 09, 2024 pm 06:48 PM

Laravel에서 Swoole 코루틴을 사용하면 많은 수의 요청을 동시에 처리할 수 있습니다. 장점은 다음과 같습니다. 동시 처리: 여러 요청을 동시에 처리할 수 있습니다. 고성능: Linux epoll 이벤트 메커니즘을 기반으로 요청을 효율적으로 처리합니다. 낮은 리소스 소비: 더 적은 서버 리소스가 필요합니다. 간편한 통합: Laravel 프레임워크와 원활하게 통합되어 사용이 간편합니다.

웹 페이지 리디렉션의 일반적인 애플리케이션 시나리오를 이해하고 HTTP 301 상태 코드를 이해합니다. 웹 페이지 리디렉션의 일반적인 애플리케이션 시나리오를 이해하고 HTTP 301 상태 코드를 이해합니다. Feb 18, 2024 pm 08:41 PM

HTTP 301 상태 코드의 의미 이해: 웹 페이지 리디렉션의 일반적인 응용 시나리오 인터넷의 급속한 발전으로 인해 사람들은 웹 페이지 상호 작용에 대한 요구 사항이 점점 더 높아지고 있습니다. 웹 디자인 분야에서 웹 페이지 리디렉션은 HTTP 301 상태 코드를 통해 구현되는 일반적이고 중요한 기술입니다. 이 기사에서는 HTTP 301 상태 코드의 의미와 웹 페이지 리디렉션의 일반적인 응용 프로그램 시나리오를 살펴봅니다. HTTP301 상태 코드는 영구 리디렉션(PermanentRedirect)을 나타냅니다. 서버가 클라이언트의 정보를 받을 때

스울과 워커맨 중 어느 것이 더 낫나요? 스울과 워커맨 중 어느 것이 더 낫나요? Apr 09, 2024 pm 07:00 PM

Swoole과 Workerman은 모두 고성능 PHP 서버 프레임워크입니다. 비동기 처리, 우수한 성능 및 확장성으로 잘 알려진 Swoole은 많은 수의 동시 요청과 높은 처리량을 처리해야 하는 프로젝트에 적합합니다. Workerman은 사용 편의성과 낮은 동시성 볼륨을 처리하는 프로젝트에 더 적합한 직관적인 API를 통해 비동기식 및 동기식 모드의 유연성을 제공합니다.

Swoole 프레임워크에서 서비스를 다시 시작하는 방법 Swoole 프레임워크에서 서비스를 다시 시작하는 방법 Apr 09, 2024 pm 06:15 PM

Swoole 서비스를 다시 시작하려면 다음 단계를 따르십시오. 서비스 상태를 확인하고 PID를 가져옵니다. 서비스를 중지하려면 "kill -15 PID"를 사용하십시오. 서비스를 시작하는 데 사용한 것과 동일한 명령을 사용하여 서비스를 다시 시작합니다.

swoole_process를 사용하면 사용자가 어떻게 전환할 수 있나요? swoole_process를 사용하면 사용자가 어떻게 전환할 수 있나요? Apr 09, 2024 pm 06:21 PM

Swoole 프로세스를 통해 사용자는 프로세스를 생성하고 프로세스를 시작할 수 있습니다.

Swoole 또는 Java 중 어느 것이 더 나은 성능을 가지고 있습니까? Swoole 또는 Java 중 어느 것이 더 나은 성능을 가지고 있습니까? Apr 09, 2024 pm 07:03 PM

성능 비교: 처리량: Swoole은 코루틴 메커니즘 덕분에 처리량이 더 높습니다. 대기 시간: Swoole의 코루틴 컨텍스트 전환은 오버헤드가 낮고 대기 시간이 더 짧습니다. 메모리 소비: Swoole의 코루틴은 더 적은 메모리를 차지합니다. 사용 용이성: Swoole은 사용하기 쉬운 동시 프로그래밍 API를 제공합니다.

HTTP 200 OK: 성공적인 응답의 의미와 목적을 이해합니다. HTTP 200 OK: 성공적인 응답의 의미와 목적을 이해합니다. Dec 26, 2023 am 10:25 AM

HTTP 상태 코드 200: 성공적인 응답의 의미와 목적 탐색 HTTP 상태 코드는 서버 응답 상태를 나타내는 데 사용되는 숫자 코드입니다. 그 중 상태 코드 200은 요청이 서버에 의해 성공적으로 처리되었음을 나타냅니다. 이 기사에서는 HTTP 상태 코드 200의 구체적인 의미와 사용법을 살펴보겠습니다. 먼저 HTTP 상태 코드의 분류를 이해해 보겠습니다. 상태 코드는 1xx, 2xx, 3xx, 4xx 및 5xx의 다섯 가지 범주로 나뉩니다. 그 중 2xx는 성공적인 응답을 나타냅니다. 그리고 200은 2xx에서 가장 일반적인 상태 코드입니다.

http 요청 415 오류 해결 방법 http 요청 415 오류 해결 방법 Nov 14, 2023 am 10:49 AM

해결 방법: 1. 요청 헤더에서 Content-Type을 확인합니다. 2. 요청 본문에서 데이터 형식을 확인합니다. 3. 적절한 인코딩 형식을 사용합니다. 4. 적절한 요청 방법을 사용합니다. 5. 서버측 지원을 확인합니다.

See all articles