创建Web服务器

程序代码

http_server.php

$http = new swoole_http_server("0.0.0.0", 9501);

$http->on('request', function ($request, $response) {
    var_dump($request->get, $request->post);
    $response->header("Content-Type", "text/html; charset=utf-8");
    $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>");
});

$http->start();

Http服务器只需要关注请求响应即可,所以只需要监听一个onRequest事件。当有新的Http请求进入就会触发此事件。事件回调函数有2个参数,一个是$request对象,包含了请求的相关信息,如GET/POST请求的数据。

另外一个是response对象,对request的响应可以通过操作response对象来完成。$response->end()方法表示输出一段HTML内容,并结束此请求。

  • 0.0.0.0 表示监听所有IP地址,一台服务器可能同时有多个IP,如127.0.0.1本地回环IP、192.168.1.100局域网IP、210.127.20.2 外网IP,这里也可以单独指定监听一个IP
  • 9501 监听的端口,如果被占用程序会抛出致命错误,中断执行。

启动服务

php http_server.php
  • 可以打开浏览器,访问http://127.0.0.1:9501查看程序的结果。
  • 也可以使用apache ab工具对服务器进行压力测试

  • 趁年轻勤折腾

    Notice: Undefined property: swoole_http_request::$post in...../http_server.php on line 6

  • mofei

    传值的状态下,才会有post的索引。否则会出现Notice: Undefined property。

  • farsay

    一次访问会产生3个请求, 什么原因呢

  • Hessian海生

    3个? 一个可能是favicon.ico,还有一个是什么?你把request打出来看看

  • Bacysoft

    请问如何停止服务呢?

  • Bacysoft

    请问如何在 onRequest 回调中投递任务? 我看页面上提供的源码实例好像只有回调函数的参数中有 Server 对象的才能投递任务到task进程,是吗?

  • swoole开发者2236

    你好,我有一个问题,就是更新代码之后重启的时候,用kill关掉master进程,会不会导致程序在处理request中间的时候退出,导致对request的处理程序执行不完整?

  • 火火

    PHP Fatal error: Class 'swoole_http_server' not found!这是什么问题呢?我查看phpinfo里面已经存在了swoole这个扩展,这个问题怎么解决的呢?

  • zhezhao

    你是不是phpinfo里面有swoole,但是php -m里面没有swoole。这可能是编译安装时候出现的错误,我也没搞定,换了台服务器安装就能用了。你可以多编译安装几次,如果可以的话,可以重启服务器或者重新安装php

  • QQ

    浏览器访问直接报500.

  • Rango-韩天峰

    global $serv; $serv->task 这样来调用。

  • 郝多

    【为何内存消耗那么快?】这个例子,每次请求增加了10KB的内存消耗,12K次后,内存消耗120MB, 然后开始服务器端报错:[2016-05-06 12:30:26 *2760.0] ERROR swPort_onRead_http(:417): recv from connection#22 failed. Error: Software caused connection abort[113]. 我是在cygwin下,swoole 1.8.5beta,php 5.5.9

  • Frank

    配置你的 .../php5/cli/php.ini

  • 阿迷

    可能是你环境的php-fpm 和 php命令所使用的php.ini不是同一个文件 你可以这样 php -c php.ini路径 http_server.php 其中php.ini是你添加了extension=swoole.so的那个文件

  • 杨蒙

    应该是你系统有过的php版本 终端中php -version 和 网页中 phpinfo() 显示的版本不一致造成的

  • wl

    swoole_http_server下end 和 write区别

  • wl

    应该是swoole_http_response类的end 和 write区别

  • 韦元晓

    PHP Notice: Undefined property: swoole_http_request::$get in /root/swoole/server.php on line 6

    Notice: Undefined property: swoole_http_request::$get in /root/swoole/server.php on line 6 NULL PHP Notice: Undefined property: swoole_http_request::$post in /root/swoole/server.php on line 7

    Notice: Undefined property: swoole_http_request::$post in /root/swoole/server.php on line 7

  • 韦元晓

    升级到最新版本解决

  • 肖玉琴

    我也出现这样的提示了。你升级版本就解决了?

  • 肖玉琴

    使用var_dump($request->get,$request->post)会报下面的错: PHP Notice: Undefined property: swoole_http_request::$get in /www/localhost/http_server.php on line 15 PHP Notice: Undefined property: swoole_http_request::$post in /www/localhost/http_server.php on line 15 直接打印var_dump($request),发现只有header,server2个元素,并没有post,get

  • 李明

    php -i|grep php.ini 查看加载的配置文件路径是不是有问题

  • 欧阳光

    会不会是你有两个php.ini文件?另一个是 php-cli.ini

  • 茗香

    你用的是最新版本吗? 那个里面的对应类名已经改为Swoole\Http\Request了,具体你可以是使用get_declared_classes 把已经定义的类打印出来看看。

  • 周宏

    收到请求后 怎么转发给PHP机器呢 post貌似不好用啊

  • 李朋飞

    [2016-09-04 22:02:39 @14113.0] WARNING swPipeUnsock_create: socketpair() failed. Error: Socket type not supported [94] [2016-09-04 22:02:39 @14113.0] WARNING swFactoryProcess_start: swFactoryProcess_manager_start failed. PHP Fatal error: swoole_http_server::start(): start server failed. Error: swFactoryProcess_start: swFactoryProcess_manager_start failed. in /var/www/swoole-study/2016-09-04/server_http.php on line 10

    Fatal error: swoole_http_server::start(): start server failed. Error: swFactoryProcess_start: swFactoryProcess_manager_start failed. in /var/www/swoole-study/2016-09-04/server_http.php on line 10 [2016-09-04 22:02:39 @14113.0] ERROR zm_deactivate_swoole (ERROR 103): Fatal error: swoole_http_server::start(): start server failed. Error: swFactoryProcess_start: swFactoryProcess_manager_start failed. in /var/www/swoole-study/2016-09-04/server_http.php on line 10.

    socketpair 报错,type为2。 手动直接跑socketpair(AF_UNIX, SOCK_STREAM, 0, sockfd) ,没有报错。 求助

    系统为 bash on ubuntu on windows

  • 眷海存枫

    我测试也会有两次的感觉哦

  • cheng_bifeng

    请问如何做路由 比如这个“http://127.0.0.1:9501/test/?get=sdgas”

  • 我是12

    每次请求会发生请求两次的情况

  • 我是12

    找到了,确实是favicon,过滤一下 //请求过滤 if ($request->server['path_info'] == '/favicon.ico' || $request->server['request_uri'] == '/favicon.ico') { return $response->end(); }

  • 彭明东

    new前面加个\

  • waken

    直接在终端运行 curl -d "param=2" http://127.0.0.1:9503?id=1 这样 get post请求参数都有了,就不会出现request错误了

  • 江水

    我也是发现了有三个请求,可是我真实是请求了一次

    Array ( [id] => 123 [qw] => 1212 [cs] => 223 ) PHP Notice: Undefined property: swoole_http_request::$get in /var/www/html/web.php on line 6 PHP Notice: Undefined property: swoole_http_request::$get in /var/www/html/web.php on line 6

  • 江水

    @韩天神,来解释下,这样不能投入生产啊

  • 江水

    三个请求:PHP Notice: Undefined property: swoole_http_request::$get in /var/www/html/web.php on line 6
    PHP Notice: Undefined property: swoole_http_request::$get in /var/www/html/web.php on line 6
    PHP Notice: Undefined property: swoole_http_request::$get in /var/www/html/web.php on line 6

  • oldchiken

    异步Http客户端和HttpServer这两个有什么区别??

  • 如果在phpinfo里面能看见swoole但是php -m 没有看见swoole模块的话,说明你的/etc/php没有指向你安装的php位置,这个时候你执行服务器文件的话就需要输入你安装的php全路径,不能只是php,比如我的是在 /local/php5630/bin/php ws_server.php

  • 蓝天白云

    可以在输出之前就行判断就不会undefined: $request -> get = isset($request -> get) ? $request -> get : []; $request -> post = isset($request -> post) ? $request -> post : []; 如果是4个请求的话,是正确的。 favicon.ico,一个post一个get,这就两个。 一个普通的get和post参数,又是两个。 4个没问题。

  • easyCert客服

    php -m 能看见 sqlite3 standard swoole sysvsem tokenizer xml

    xmlreader

    phpinfo 也能看见,但是一运行那个php文件就出现:PHP Fatal error: Class 'swoole_http_server' not found in

  • mylafe

    浏览器500,可以查看防火墙对应端口号是否开放。添加 iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 9501 -j ACCEPT

  • 入乡随

    swoole相关教程:http://php91.ke.qq.com