php - จัดการคำขอหลายรายการใน Guzzle ระหว่างสองโครงการ Laravel ในเวลาเดียวกัน
ฉันกำลังทำงานในสองโครงการ โครงการ Laravel 8 และโครงการ Laravel Lumen 8 ซึ่งทั้งสองโครงการใช้ Guzzle เพื่อสร้างคำขอ HTTP พวกเขากำลังทำงานบนโดเมนต่อไปนี้:
< ul>
และฉันใช้ 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
Answer
วิธีแก้ปัญหา:
เป็นเพราะการกำหนดค่าเซิร์ฟเวอร์ของคุณ บน windows php-cgi ไม่สามารถจัดการการเชื่อมต่อหลายรายการพร้อมกันได้ ดังนั้นก่อนที่จะเริ่มสคริปต์ที่สอง php-cgi.exe จะรอจนกว่าสคริปต์แรกจะสิ้นสุด
คุณสามารถใช้ build-in php server (php -S
) ซึ่ง ให้คุณจัดการกับการเชื่อมต่อกับ 8000
และ 8001
แยกกัน
Source