swoole_http_server [编辑本页]

swoole_http_server继承自swoole_server,是一个完整的http服务器实现。swoole_http_server支持同步和异步2种模式。

http/websocket服务器都是继承自swoole_server,所以swoole_server提供的API,如task/finish/tick等都可以使用

无论是同步模式还是异步模式,swoole_http_server都可以维持大量TCP客户端连接。同步/异步仅仅体现在对请求的处理方式上。

示例:

$http = new swoole_http_server("127.0.0.1", 9501);
$http->on('request', function ($request, $response) {
    $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>");
});
$http->start();

同步模式

这种模式等同于nginx+php-fpm/apache,它需要设置大量worker进程来完成并发请求处理。Worker进程内可以使用同步阻塞IO,编程方式与普通PHP Web程序完全一致。

与php-fpm/apache不同的是,客户端连接并不会独占进程,服务器依然可以应对大量并发连接。

异步模式

这种模式下整个服务器是异步非阻塞的,服务器可以应对大规模的并发连接和并发请求。但编程方式需要完全使用异步API,如MySQL、redis、http_client、file_get_contents、sleep等阻塞IO操作必须切换为异步的方式,如异步swoole_client,swoole_event_add,swoole_timer,swoole_get_mysqli_sock等API。


  • dormscript

    <?php $http = new swoole_http_server("0.0.0.0", 4333); $http->on('request', "mycallback"); $http->start(); function mycallback($request, $response) { $response->end("hello world\n"); }

    我设置的一个工作进程,通过ps看到如下: sh-3.2# ps -ef | grep swoole 0 26320 4085 0 11:41下午 ttys000 0:00.06 /usr/local/php/bin/php test_swoole.php 0 26321 26320 0 11:41下午 ttys000 0:00.00 /usr/local/php/bin/php test_swoole.php 0 26322 26321 0 11:41下午 ttys000 0:00.00 /usr/local/php/bin/php test_swoole.php 0 26323 26321 0 11:41下午 ttys000 0:00.00 /usr/local/php/bin/php test_swoole.php 0 26324 26321 0 11:41下午 ttys000 0:00.00 /usr/local/php/bin/php test_swoole.php 0 26325 26321 0 11:41下午 ttys000 0:00.00 /usr/local/php/bin/php test_swoole.php

    设置的无效吗?

  • dormscript

    $http->set(array( 'worker_num' => 1, //工作进程数量 )); 加上这个,ps结果: sh-3.2# ps -ef | grep swoole 0 26337 4085 0 11:51下午 ttys000 0:00.05 /usr/local/php/bin/php test_swoole.php 0 26338 26337 0 11:51下午 ttys000 0:00.00 /usr/local/php/bin/php test_swoole.php 0 26339 26338 0 11:51下午 ttys000 0:00.00 /usr/local/php/bin/php test_swoole.php

    怎么设置才能是单进程?

  • test

    做websocket 测试的时候,chrome 总是返回: failed: Error during WebSocket handshake: Incorrect 'Sec-WebSocket-Accept' header value

    看http请求的头,貌似也没问题啊。

    request: Accept-Encoding:gzip, deflate, sdch Accept-Language:zh-CN,zh;q=0.8 Cache-Control:no-cache Connection:Upgrade Host:t.sodevel.com:9502 Origin:http://127.0.0.1 Pragma:no-cache Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits Sec-WebSocket-Key:966ozb8v9ApXJDPDKoc5Gg== Sec-WebSocket-Version:13 Upgrade:websocket User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36

    response: Connection:Upgrade Sec-WebSocket-Accept:iEfsIxHxC+R0tMgeHB3qYIN/ScQ= Sec-WebSocket-Version:13 Server:swoole-websocket Upgrade:websocket

  • test

    看错误提示,像是token校验不通过,不过服务器端的 open 事件返回: handshake success object(swoole_http_wsresponse)#5 (1) { ["fd"]=> int(14) }

  • 记住一座城

    websocket有错:WebSocket connection to 'ws://127.0.0.1:9501/' failed: Error during WebSocket handshake: Invalid status line

  • 猪肉荣涅槃

    在写一个HTTP请求 POST内容为json 并转换为mysql 数据存储的应用,请问 swoole_http_server事件回调里面如何调用 swoole_server->task ?

  • 猪肉荣涅槃

    尝试了,目前用$GLOBALS['']解决, 但不是那么优雅

  • 谢min

    global $serv; $serv->task($data);

  • 陈伟川V

    应该是没有这个设置,是同步/异步指的是程序内 I/O 的处理方式。比如 MySQL 都是同步读写就是同步模式,如果都是异步读写就是异步模式。
    这些处理都得开发者自己去把控,二者的程序模式和编写差异很大,不是理解为一个开关去把控的。 只要用到了同步的I/O处理,就算是同步模式。但实际上也可以部分I/O丢去异步处理吧。

  • 向东

    通过浏览器访问没问题,使用ab测试时,会报:[2015-10-30 01:53:52 $3212.0] WARN swManager_check_exit_status: worker#0 abnormal exit, status=0, signal=11

  • 向东

    升级到1.7.20就没问题了

  • 十七亮

    我也遇到这个问题了,找到原因了吗?

  • 小六HI

    php server.php ,如何后台运行呢,如果关闭黑窗口任务不是结束了吗?

  • 怡文圣美(赵杰)

    问: 如果worker中存放长连接的pdo, 试图用worker实现连接池, 使用同步模式, 但我看到这句话 "与php-fpm/apache不同的是,客户端连接并不会独占进程,服务器依然可以应对大量并发连接。" 高并发下, 同一时间会有多个连接同时访问同一个pdo对象吗?