Http\Server

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

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

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

示例:

use Swoole\Http\Server;

$http = new 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,如MySQLredishttp_clientfile_get_contentssleep等阻塞IO操作必须切换为异步的方式,如异步ClientEventTimerAPI


  • 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

    怎么设置才能是单进程?

  • 猪肉荣涅槃

    在写一个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丢去异步处理吧。

  • 小六HI

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

  • 怡文圣美(赵杰)

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

  • Bill

    http/websocket服务器都是继承自swoole_server,所以swoole_server提供的API,如task/finish/tick等都可以使用 问题:如何在代码中获取 swoole_server对象呢,http_server回调函数(request,response)的参数中没有server参数,我想调用tick,请问怎么处理?

  • 傲雪孤魂

    $http->on('request', function ($request, $response) use ($http) {
        // do something
    }
    

  • No bug

    1