首頁 > php框架 > Swoole > 介紹 Swoole HTTP的應用

介紹 Swoole HTTP的應用

coldplay.xixi
發布: 2021-01-13 10:07:24
轉載
2129 人瀏覽過

介紹 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地址是我的虚拟机。   

示例代码:   

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

<?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();

登入後複製

二,路由控制     

示例效果:    

目录结构:

1

2

3

4

5

├─ swoole_http  -- 代码根目录

│ ├─ server.php

│ ├─ controller

│ ├── Index.php

│ ├── Login.php

登入後複製

示例代码:     

server.php     

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

<?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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<?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

1

2

3

4

5

6

7

8

9

10

11

12

13

<?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

1

2

3

4

5

6

7

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。

配置文件供参考:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

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文件夹中的业务代码,每次都是重启服务才生效吗?

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

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

1

ps aux | grep swoole_process_server_master | awk '{print $2}' | xargs kill -USR1

登入後複製

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

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

1

ps -ef | grep 'swoole_process_server'| grep -v 'grep'

登入後複製

扩展

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

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

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

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

以上是介紹 Swoole HTTP的應用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
php - swoole 擴充和 swoole 框架有什麼不同?
來自於 1970-01-01 08:00:00
0
0
0
能不能出swoole,hyperf,workerman的相關課程啊
來自於 1970-01-01 08:00:00
0
0
0
nginx 反向代理 swoole的設置
來自於 1970-01-01 08:00:00
0
0
0
swoole連接redis進程hang住。
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板