workerman可以加上amphp的扩展解决http阻塞问题吗

psocket

问题描述

怎么修改源码让workerman的http转为非阻塞呀

1106 4 0
4个回答

six

访问外部http接口用 workerman/http-client ,是非阻塞的

  • psocket 2023-04-08

    就是在创建http服务,我打印了同时访问的时候有阻塞,在swoole中的http服务没有出现阻塞

  • psocket 2023-04-08

    是打印时间戳的时候

  • six 2023-04-08

    workerman是php开发的框架,不会改变php的行为,如果你调用的php函数是阻塞函数,那就是阻塞的,否则就是非阻塞的。
    swoole是一个扩展,可以改变php的行为,比如阻塞调用变成协程非阻塞,不过开启协程要使用上下文,考虑全局变量污染问题,如果使用了第三方库需要对其改造,开发商会有一点难度。

  • psocket 2023-04-09

    没有打印hello的时候workerman可以看出来有阻塞

  • psocket 2023-04-09

    没有任何阻塞函数

  • six 2023-04-09

    你的代码怎么写的?你怎么看出来阻塞的?

  • psocket 2023-04-14

    就是单单的创建一个workerman的http服务和swoole的协程http服务内写同样的时间打印出现时间方面相应有几百微秒的差别

  • six 2023-04-14

    打印是阻塞函数,echo 'hello'; 实际上就是 fwrite(STDOUT, 'hello');,向 fd为2的文件写入数据

  • psocket 2023-04-14

    当一个进程还没执行完的话,那么其他想进入这个进程的话就进不来了吗

  • six 2023-04-14

    进不来。如果有阻塞调用想提高并发,设置$worker->reusePort=true;, 增加进程数就好了。比如进程开到cpu的4倍。
    如果你喜欢swoole的协程,也可以设置swoole为底层驱动

    <?php
    require 'vendor/autoload.php';
    use Workerman\Events\Swoole;
    use Workerman\Worker;
    
    Worker::$eventLoopClass = Swoole::class;
    $worker = new Worker('http://0.0.0.0:9898');
    $worker->onWorkerStart = function () {
        Swoole\Runtime::enableCoroutine(SWOOLE_HOOK_ALL);
    };
    $worker->onMessage = function ($connection, $request) {
        $connection->send('hello');
    };
    Worker::runAll();

    这样workerman也具有swoole的协程能力了。
    使用协程后需要改造第三方库,包括避免全局变量污染、全局变量使用context、避免协程同时公用同一个资源例如数据库。反正就是解决同一个进程并发执行导致的问题。

  • Tianor 2023-04-14

    大佬可以帮我看看不

admin

可以结合yield,PHP的自带的协程,迭代器。不过需要注意上面老哥说的,在携程中要注意上下文变量,因为你一旦使用了迭代器,在当前进程中就不是单线程的阻塞了,而是一个多线程的环境,如果你自己能处理或者第三方的包可以区别上下文就行

  • chaz6chez 2023-04-14

    php用了yield结合event-loop依然是单线程,只不过在上下文顺序上可能和自己所写的顺序不同,导致数据污染

  • chaz6chez 2023-04-14

    swoole/swow区别于php,是在当前php线程上增加了独立的另一个线程,用于处理协程的调度和分配,所以是多线程的情况

真的是你呀

workerman5可以了

artisan

问的应该是http-server吧?
amphp出了一个 amphp/http-server(一个进程处理多个请求,一个请求阻塞则挂起,继续处理其他请求?)

  • 暂无评论
年代过于久远,无法发表回答
🔝