laravel 更换成swoole方式后client真实IP获取

本文介绍在Laravel框架结合Swoole时如何正确获取客户端的真实IP地址。由于Swoole改变了请求处理的方式,传统的IP获取方法不再适用。文中提供了一种新的实现方案,通过设置受信任的代理来确保获取到正确的IP。

正常laravel框架获取客户端真实IP使用的是:
 

if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}elseif(isset($_SERVER['HTTP_CLIENT_IP'])){
    $ip = $_SERVER['HTTP_CLIENT_IP'];
}else{
    $ip = $_SERVER['REMOTE_ADDR'];
}
$ip_arr = explode(',', $ip);
return $ip_arr[0];

但当框架增加swoole,更改方式后,这种方式就获取不到真实IP了,需要更换成:

use Symfony\Component\HttpFoundation\Request as RequestAlias;

$request->setTrustedProxies($request->getClientIps(), RequestAlias::HEADER_X_FORWARDED_FOR);
$realIp = $request->ip();

就可以啦

整体流程:
1. 增加中间键:

class RealIp
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        $request->setTrustedProxies($request->getClientIps(), RequestAlias::HEADER_X_FORWARDED_FOR);
        $realIp = $request->ip();
        Log::info("client 真实IP1:" . $realIp);
        request()->offsetSet('clientRealIp', $realIp);
        return $next($request);
    }
}

2. 在 Kernel.php 中,增加公共中间键配置:

'api' => [
            Throttle::class,   //按单接口限流
            FilterParamNull::class,
            CommonHeader::class,
            RealIp::class,  //真实IP
        ],

3. 在业务代码中可通过 

$realIp = request()->get('clientRealIp'); 

使用。

Laravel 中使用 Swoole 替代 PHP-FPM 是一种提升应用性能的有效方式,尤其适用于高并发场景。以下是实现该目标的具体步骤和方法: ### 安装 Swoole 扩展 首先,需要在服务器上安装 Swoole 扩展。可以通过 PECL 安装最新版本的 Swoole: ```bash pecl install swoole ``` 安装完后,需要在 `php.ini` 文件中添加以下行以启用 Swoole 扩展: ```ini extension=swoole.so ``` ### 使用 Laravel SwooleLaravel 本身并不直接支持 Swoole,但可以通过第三方包如 `swooletw/laravel-swoole` 来实现。首先,通过 Composer 安装该包: ```bash composer require swooletw/laravel-swoole ``` 安装完后,需要发布包的配置文件: ```bash php artisan vendor:publish --provider="SwooleTW\Http\LaravelServiceProvider" ``` ### 配置 Swoole 发布配置文件后,可以在 `config/swoole_http.php` 中进行 Swoole 的相关配置。例如,可以设置服务器监听的地址和端口、工作进程数等: ```php return [ 'host' => '127.0.0.1', 'port' => 8000, 'num_workers' => 4, 'num_task_workers' => 2, // 其他配置... ]; ``` ### 启动 Swoole 服务器 配置完后,可以通过以下命令启动 Swoole 服务器: ```bash php artisan swoole:http start ``` ### 停止 Swoole 进程 要正确地结束 Swoole 进程,可以使用以下命令: ```bash php artisan swoole:http stop ``` 此命令会平滑地终止所有 Swoole 进程,确保正在进行的请求得到妥善处理[^1]。 ### 测试和验证 启动 Swoole 服务器后,可以通过访问 Laravel 应用的接口来验证是否已经功切换到 Swoole。可以使用 Postman 或 curl 工具发送请求,确保一切正常。 ### 相关问题 1. 如何在 Laravel 中配置 Swoole 的工作进程数? 2. Laravel 使用 Swoole 后,如何进行性能测试和调优? 3. SwooleLaravel 中是否支持所有 PHP 扩展? 4. 如何在生产环境中安全地切换 Laravel 从 PHP-FPM 到 Swoole? 5. Laravel 使用 Swoole 时,如何处理长连接和异步任务?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值