Nginx + PHP-FPM 模式下的业务 API 接口,探究并发与并行?

412 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 4 月更文挑战」的第 28 天,点击查看活动详情

在Nginx + PHP-FPM模式下,业务API接口的并发性和并行性是两个相关但不同的概念。

并发性(Concurrency)指的是系统能够同时处理多个请求或任务的能力。在Nginx + PHP-FPM模式下,Nginx作为反向代理服务器可以同时接收和处理多个请求,并将这些请求转发给后端的PHP-FPM进程池。PHP-FPM进程池则可以同时处理多个请求,每个请求在一个独立的PHP-FPM进程中执行。这样可以充分利用服务器资源,提高系统的并发性能。

并行性(Parallelism)则指的是系统能够同时执行多个操作的能力。在PHP中,由于PHP是单线程的,一个PHP-FPM进程在执行一个请求时只能按照顺序逐行执行代码。但是,当PHP代码中遇到需要等待I/O操作(如数据库查询、文件读写等)的时候,PHP-FPM进程可以将当前请求挂起,继续处理其他请求。这样就可以实现在等待I/O的同时处理其他请求,从而提高系统的并行性。

总结起来,在Nginx + PHP-FPM模式下:

  • 并发性:Nginx和PHP-FPM可以同时处理多个请求,充分利用服务器资源,提高系统的并发处理能力。
  • 并行性:PHP-FPM进程在等待I/O操作时可以处理其他请求,实现在等待期间的并行处理。

需要注意的是,并发性和并行性的实际效果还受限于服务器硬件、PHP-FPM进程池配置、代码质量等因素。合理的服务器配置和代码优化可以进一步提升系统的并发性和并行性能。

当涉及到实例时,以下是一个简单的示例来说明Nginx + PHP-FPM模式下的并发和并行处理。

假设我们有一个简单的业务API接口,用于获取用户信息。接口的代码如下(PHP):

<?php
// 获取用户信息的函数
function getUserInfo($userId) {
    // 模拟查询数据库操作
    usleep(1000000); // 延迟1秒,模拟耗时操作
    $userInfo = "User ID: " . $userId . ", Name: John Doe";
    return $userInfo;
}

// 获取用户信息的API接口
function getUserApi($userId) {
    $userInfo = getUserInfo($userId);
    echo $userInfo;
}

// 从请求中获取用户ID
$userId = $_GET['user_id'];

// 调用API接口
getUserApi($userId);
?>

在Nginx配置中,可以将所有以 /api 开头的请求转发给PHP-FPM进行处理。以下是Nginx的配置示例(假设PHP-FPM监听的地址为 127.0.0.1:9000):

server {
    listen 80;
    server_name example.com;
    root /path/to/your/web/root;

    location /api {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

现在,我们可以使用并发测试工具(如Apache Bench)来模拟并发请求。假设我们使用以下命令模拟同时发起100个请求:


ab -n 100 -c 100 http://example.com/api?user_id=123

在这个示例中,100个请求会同时发送到Nginx服务器,并由Nginx转发给PHP-FPM处理。由于PHP-FPM进程池的配置通常会有多个进程(例如,可以设置10个进程),这些请求可以在多个PHP-FPM进程中并发处理。

在执行测试后,你会看到Nginx和PHP-FPM能够同时处理多个请求,并发性能得到提升。此外,由于我们在PHP代码中使用了 usleep(1000000) 来模拟耗时操作,当其中一个请求在等待时,PHP-FPM进程可以继续处理其他请求,实现了并行处理。

通过这个示例,可以看到Nginx和PHP-FPM的协同工作方式,以及如何利用并发和并行性能提高系统的处理能力。请记住,在实际生产环境中,需要根据服务器硬件和负载情况来调整Nginx和PHP-FPM的配置,以达到最佳的性能和可扩展性。