异步PHP请求

时间:2015-08-12 08:25:54

标签: php multithreading asynchronous pthreads reactphp

所以,我想在PHP中创建一个异步Web服务。为什么?因为我有一个很好的异步前端,但如果我有超过6个活动TCP连接,Chrome将阻止我的请求。我当然读过一些类似的问题:

但这些不能解决我的问题。

我安装了pthreads,意图是我可以在不同的线程中发出多个请求,这样我的PHP就不会阻止其他请求(在我的情况下,我开始例如。一个漫长的过程而且我希望能够轮询进程是否仍然繁忙)。

PHPReact似乎是一个很好的库(非阻塞I / O,异步),但这也无法工作(仍然同步)。

我是否遗漏了某些东西,或者现在这在PHP中仍然无法实现?

class Example{
    private $url;   
    function __construct($url){
        $this->url = $url;
        echo 'pooooof request to ' . $this->url . ' sent <br />';
        $request = new Request($this->url);     
        $request->start();
    }
}

class Request extends Thread{
    private $url;   
    function __construct($url){
        $this->url = $url;
    }

    function run(){
        // execute curl, multi_curl, file_get_contents but every request is sync
    }
}

new Example('https://gtmetrix.com/why-is-my-page-slow.html');
new Example('http://php.net/manual/en/function.file-get-contents.php');
new Example('https://www.google.nl/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=php%20file%20get%20contents'); 

理想的情况是利用回调。

PS。我见过一些提供此功能的服务器(如Node.js),但我更喜欢本机方法。如果不可能,我真的想要切换到Python,Java,Scala或其他支持异步的语言。

1 个答案:

答案 0 :(得分:3)

我无法理解你在做什么......

无论如何,您的请求显示为同步的原因是此构造函数的编写方式:

function __construct($url){
    $this->url = $url;
    echo 'pooooof request to ' . $this->url . ' sent <br />';
    $request = new Request($this->url);     
    $request->start();
}

Request线程将在控制权返回给__construct(新)的调用者之前连接,因为变量超出范围,因此被销毁(连接是销毁的一部分)。< / p>