PHP 7默认是否异步处理请求?

问题描述 投票:1回答:2

我在过去的3.5年里一直在编写PHP,我喜欢它。当最近的PHP v / s Nodejs出现问题时,总是引人注目的一件事是Nodejs默认实现了非阻塞(或异步)I / O而PHP却没有。

但是,当我最近尝试在PHP中实现一个简单的异步请求路由器(使用exec()函数)并尝试将我的代码与标准(假设为同步请求处理程序脚本)对比时,我发现了一些奇怪的东西。

在进一步解释之前,我希望您看看下面的代码。

sync.php:应该将所有其他请求置于保持状态之前,直到当前的请求完成处理:

<?php
    $a = $argv[1];
    echo "starting: ".$a;
    $ar = array();
    $sum = 0;
    $ul = 15000;
    for($i = 1; $i < $ul; $i++){
        $ar[$i] = $i;
    }
    for($i = 1; $i < $ul;  $i++){
        for($j = 1; $j < $ul; $j++){
            $sum += $ar[$j];
        }
    }
    echo "\n\nDone: ".$a."\nResult: ".$sum."\n";
?>

我做了两种测试。

首先,我在计算机上运行了四个终端实例并执行:

php sync.php 1  

在所有这些中同时进行。

接下来,我打开了我的XAMPP服务器,通过serveo公开了我的localhost,并同时向这个脚本发出了三个不同设备的三个请求。

结果出乎意料。

无论我发送了多少请求,所有这些请求(似乎)都会并行执行,结果会同时显示在所有终端窗口/浏览器选项卡上(几乎)(考虑到手动产生的1-2秒延迟)在每个终端窗口中运行命令)。

这与PHP实现阻塞I / O(这是我发生的事实)的事实不符。我所期望的是获得总爆发时间

n * 4 seconds

其中n是处理每个请求所花费的时间(在我的笔记本电脑上大约8秒)。

那么,为什么请求被异步处理?是因为for循环是异步执行的函数之一,还是与阻塞I / O模型没有任何关系?

php asynchronous nonblocking
2个回答
3
投票

您误解了有关阻止I / O的讨论内容。

每次从命令行运行PHP脚本时,它都会在一个完全独立的进程中执行,该进程不知道计算机上运行的任何其他PHP脚本。您可以多次执行它,原因与您可以同时运行Web浏览器和文本编辑器完全相同 - 操作系统正在一个或多个处理器核心上安排进程。

在Web服务器示例中,它稍微复杂一些,但同样的原则适用:您对Web服务器发出的每个请求都会创建一个新进程或进程中的新线程,并且PHP脚本在其中运行。

人们讨论阻塞I / O的方式完全不同:当您访问PHP代码中的外部内容时,例如使用HTTP请求获取Web内容。想象一下这个循环,使用虚构的HTTP库:

foreach ( $urls as $url ) {
    $results[] =  $httpClient->fetchUrl($url);
}

如果使用内置的PHP功能编写,这将停止运行并等待远程服务器每次循环响应。因此,对于每个需要一秒钟的10个请求,完成循环将需要10秒。

“非阻塞I / O”意味着实现像fetchUrl这样的函数,以便它们立即返回,即使HTTP响应没有返回。这样,您可以一次运行大量HTTP请求:在示例循环中,您将在1秒后获得所有10个响应。然后,您可以通过某种方式获得结果,例如“承诺”。

可以在PHP中实现它,但是没有默认情况下以用户友好的方式执行它的本机函数。

更复杂的是,系统可以实现此输入:无论何时等待外部事件,您都可以检查是否有新的Web请求进入,并开始处理。这可以有效地模仿多个线程,这就是NodeJS能够通过每个请求的线程处理大量流量的方式。


2
投票

单个PHP进程正在阻塞。例如,您可以使用built-in development server,它将启动单进程Web服务器。根据那里的说明:

Web服务器只运行一个单线程进程,因此如果请求被阻止,PHP应用程序将停止运行。

由于显而易见的原因,如果您有成千上万的人同时访问您的网站,这是有问题的,这是一个简单的解决方案 - 多个PHP流程。这可以通过多种方式设置 - Apache将fire up multiple webserver workers,或者您可以运行PHP-FPM ("FastCGI Process Manager")。

只要他们是坐在那里的自由工作者,他们就会并行处理传入的请求。

© www.soinside.com 2019 - 2024. All rights reserved.