从另一个 Laravel 项目调用 Laravel API 时出现 Laravel 问题

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

我正在处理两个 Laravel 项目,Project OneProject Two,在我的本地主机上运行。 项目一项目二进行API调用。两个项目都使用单独的 MySQL 数据库,其中 Project Two 配置为使用 config/database.php 中名为 mysql_oth 的非默认连接。但是,当项目一项目二进行API调用时,项目二尝试使用默认的(项目一)mysql数据库连接而不是mysql_oth。通过 Postman 直接向 Project Two 发出请求时不会出现此问题;在这种情况下,使用正确的 mysql_oth 连接。

这是我迄今为止已验证的内容:

  1. Project Two 中正确配置了 mysql_oth 连接 config/database.php.
  2. 直接调用 Project Two 的 API 端点 Postman正确利用mysql_oth连接。
  3. 仅当 Project OneProject Two 进行 API 调用时,才会出现此问题;不知何故,它导致 Project Two 恢复为默认(Project one's)mysql 连接。我
  4. 我已经使用 artisan 清除了 Laravel 的配置、路由和缓存 两个项目中的命令。

项目一代码:

$request->authenticate();

    

$request->session()->regenerate();
    
    $response = Http::post('http://localhost:82/laravel/project_2/api/appLogin', [
        'email' => $request->email,
        'password' => $request->password,
    ])->throw();
    

    if ($response->successful()) {
        $token = $response->json('token');
        
        $request->session()->put('apptoken', $token); // Save token in session
        return redirect()->intended(RouteServiceProvider::HOME);
    } else {
        
        Auth::guard('web')->logout();

        $request->session()->invalidate();
        $request->session()->regenerateToken();
        
        return redirect(url('login'))->withErrors(['email' => 'The provided credentials are incorrect -- .']);
    }

项目两个代码:

public function login(Request $request)
    {
        $credentials = $request->validate([
            'email' => 'required|email',
            'password' => 'required',
        ]);

        Log::info('API call sent', [
            'method' => request()->method(),
            'url' => request()->url(),
            'data' => request()->all(),
        ]);
        if (Auth::attempt($credentials)) {
            // Authentication successful
            $token = auth()->user()->createToken('authToken')->plainTextToken;
            return response()->json(['token' => $token], 200);
        } else {
            // Authentication failed
            return response()->json(['message' => 'Invalid credentials'], 401);
        }
    }

环境设置:

项目一

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=project_one,

项目二

DB_CONNECTION=mysql_oth
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=project_two

问题:

  1. Project One 调用时,为什么 Project Two 会切换到 default(Project one's) 数据库连接,如何防止这种情况发生?
  2. 是否存在我可能忽略的 Laravel 特定配置或运行时方面,这可能会导致此行为?

任何指导或见解将不胜感激。谢谢!

php laravel
1个回答
0
投票

如果您正在使用排队作业, 确保这些作业不会在队列级别混合。

如果两个站点都在同一台服务器上运行, 使用相同的默认配置, 您可能会无意中将它们排队到同一个队列(Redis:默认) 允许两个应用程序中的 PHP 工作进程处理这些请求。 这可能很难诊断,因为:

  • 间歇性发生
  • 职位代码正确(对于每个代码库)
  • 错误似乎没有意义 定义行为是多个应用程序的数据和代码不断不匹配:数据片段由错误的代码执行

如何将它们分开(取决于您如何配置队列)有点棘手。

如果您使用 Horizon,它可能会进一步混淆问题,因为它正在自动化一切(并且无意中掩盖了问题的根源。

通过以下方式区分多个应用程序:

  • 托管在不同的服务器上(IMO 太过分了)
  • 隔离应用程序(如果使用 Forge,这很简单)
  • 隔离作业队列(其中任何一个都应该让您清理干净)
    • 应用#1:使用“数据库”
    • 应用#2:使用“beanstalk”、“sqs”、...
    • 如果使用 Redis:REDIS_DB={0,1,2,3,4,5..15)
      • 或 REDIS_PREFIX,或 HORIZON_PREFIX,... 为任何应用程序部署代码或更改 .env 文件后:
  • 避免旧配置徘徊:php artisan config:clear(然后是 config:cache)
  • 清除旧的排队作业、失败的作业和可能正在等待运行但已配置错误的批处理
    • php artisan 队列:清除(然后队列:flush、prune-batches、prune-failed
    • 重新启动队列工作人员:php artisan 队列:重新启动
  • 如果您使用 Horizon 来管理队列和工作线程,请使用 Horizon 命令

希望这些见解有所帮助。 我通过在尽可能多的障碍物上踢我的小腿来学习我能找到(或找不到)的

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