php - จัดการคำขอหลายรายการใน Guzzle ระหว่างสองโครงการ Laravel ในเวลาเดียวกัน

ฉันกำลังทำงานในสองโครงการ โครงการ Laravel 8 และโครงการ Laravel Lumen 8 ซึ่งทั้งสองโครงการใช้ Guzzle เพื่อสร้างคำขอ HTTP พวกเขากำลังทำงานบนโดเมนต่อไปนี้:


< ul>
  • Laravel 8 http://localhost:8000

  • Laravel Lumen 8 http://localhost:8001< /li>

    และฉันใช้ MAMP Pro (Apache และ MySQL)


    โปรเจ็กต์ Laravel 8 ของฉันสร้างคำขอ HTTP ไปยังโปรเจ็กต์ Lumen ของฉัน ซึ่งส่งคำขอ HTTP กลับไปยังโปรเจ็กต์ Laravel 8 ของฉัน ปัญหาที่ฉันพบคือคำขอแรกจากโปรเจ็กต์ Laravel ของฉันหมดเวลาเสมอ จากนั้นคำขอจึงเริ่มต้นจากโปรเจ็กต์ Lumen


    นี่ไม่ใช่สิ่งที่ฉันต้องการ ฉันต้องการคำขอแรกเพื่อเริ่มคำขอในโครงการ Lumen ของฉันทันที และให้คำขอตอบกลับไปยังคำขอแรก


    ฉันพลาดอะไรไป โครงสร้างคำขอ HTTP ของฉันอนุญาตให้สิ่งนี้เกิดขึ้นหรือไม่ ฉันได้ลองใช้เซสชันใน db เพราะฉันคิดว่าอาจเป็นการบล็อกเซสชันหรือจัดคิวคำขอ:


    คำขอของโครงการ Laravel 8 (อันดับแรก)< /p>

    /**
    * Route the microservice
    *
    * @param \\Illuminate\\Http\\Request $request
    * @return \\Illuminate\\Http\\Response
    */
    public function microservice(Request $request, $service)
    {
    Log::debug("HUB Microservice");

    // TODO: this is always timing out regardless of what timeout I set
    // seems to only start the Lumen request when this finishes but I need
    // the response from the Lumen\'s request to be here
    $response = Http::timeout(20)->get(\'http://localhost:8001/api/reports\');

    // the response from the microservice on the Lumen project
    return response()->json($response->json(), $response->status());
    }

    คำขอของโครงการ Laravel Lumen 8 (อย่างที่สอง ต้องส่งคืน ตอบกลับไปที่อันแรก)


    <?php

    namespace App\\Http\\Middleware;

    use Closure;
    use GuzzleHttp\\Client;

    class BeforeMiddleware
    {

    /**
    * Handle an incoming request.
    *
    * @param \\Illuminate\\Http\\Request $request
    * @param \\Closure $next
    * @return mixed
    */
    public function handle($request, Closure $next, $ability)
    {
    $client = new Client([
    \'base_uri\' => \'http://localhost:8000\',
    \'timeout\' => 60
    ]);

    // TODO: this request only ever starts when my Laravel (first) request
    // times out, is it domain related?
    $res = $client->request(\'POST\', \'/api/hub/login\', [
    \'form_params\' => [
    \'key\' => \'value\'
    ]
    ]);

    // Post-Middleware Action
    return $next($request);
    }
    }

    ฉันพลาดอะไรไป


    Answer

    วิธีแก้ไข:

    ฉันใช้ Laragon (nginx) เพื่อการพัฒนาในท้องถิ่น


    ฉันแก้ไขโดยเพิ่ม Upstream จาก 2 เป็น 5

    \ n

    สามารถเพิ่มได้ในไฟล์นี้: C:\\laragon\\usr\\laragon.ini


    laragon.ini


    Answer

    วิธีแก้ปัญหา:

    เป็นเพราะการกำหนดค่าเซิร์ฟเวอร์ของคุณ บน windows php-cgi ไม่สามารถจัดการการเชื่อมต่อหลายรายการพร้อมกันได้ ดังนั้นก่อนที่จะเริ่มสคริปต์ที่สอง php-cgi.exe จะรอจนกว่าสคริปต์แรกจะสิ้นสุด


    คุณสามารถใช้ build-in php server (php -S) ซึ่ง ให้คุณจัดการกับการเชื่อมต่อกับ 8000 และ 8001 แยกกัน


    Source