laravel / framework

The Laravel Framework.
https://laravel.com
MIT License
32.29k stars 10.94k forks source link

artisan puts curl request in infinite loop #52136

Closed duran004 closed 2 months ago

duran004 commented 2 months ago

Laravel Version

11.15.0

PHP Version

8.2.12

Database Driver & Version

No response

Description

I have 2 controllers, 1 of them creates an api, simply pulls a member with a model and returns as a json response. If I want to connect to the apicontroller with http:get from my admincontroller, artisan somehow takes it in an infinite loop.

ApiController works normally. And it returns json format. If I enter from the browser or send a request from postman it works very well. image

web.php

Route::get('api/users/{id}', [UserController::class, 'get_user_from_id'])->name('api.user.show');

Route::resource('admin/users', AdminUserController::class);

UserController.php

public function get_user_from_id(int $user_id)
    {
        $user = User::find($user_id);
        if (!$user) {
            return response()->json([
                'status' => false,
                'message' => 'Kullanıcı bulunamadı.'
            ], 404);
        }
        return response()->json([
            'status' => true,
            'message' => 'Kullanıcı bilgileri başarıyla getirildi.',
            'data' => $user
        ]);
    }

Admin/UserController.php

   public function show(string $id)
    {
        return Http::get(route('api.user.show', ['id' => $id]));
    }

http://127.0.0.1:8000/api/users/11 When I open the API link with the browser, the response is: image

But if I go to admin/users/11 it goes into an infinite loop and give error. The error

{
    "message": "cURL error 28: Operation timed out after 30001 milliseconds with 0 bytes received (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for http://127.0.0.1:8000/api/users/11",
    "exception": "Illuminate\\Http\\Client\\ConnectionException",
    "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Http\\Client\\PendingRequest.php",
    "line": 943,
    "trace": [
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Support\\helpers.php",
            "line": 319,
            "function": "Illuminate\\Http\\Client\\{closure}",
            "class": "Illuminate\\Http\\Client\\PendingRequest",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Http\\Client\\PendingRequest.php",
            "line": 905,
            "function": "retry"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Http\\Client\\PendingRequest.php",
            "line": 772,
            "function": "send",
            "class": "Illuminate\\Http\\Client\\PendingRequest",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Http\\Client\\Factory.php",
            "line": 471,
            "function": "get",
            "class": "Illuminate\\Http\\Client\\PendingRequest",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Support\\Facades\\Facade.php",
            "line": 357,
            "function": "__call",
            "class": "Illuminate\\Http\\Client\\Factory",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\app\\Http\\Controllers\\Admin\\UserController.php",
            "line": 51,
            "function": "__callStatic",
            "class": "Illuminate\\Support\\Facades\\Facade",
            "type": "::"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Controller.php",
            "line": 54,
            "function": "show",
            "class": "App\\Http\\Controllers\\Admin\\UserController",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\ControllerDispatcher.php",
            "line": 43,
            "function": "callAction",
            "class": "Illuminate\\Routing\\Controller",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php",
            "line": 260,
            "function": "dispatch",
            "class": "Illuminate\\Routing\\ControllerDispatcher",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php",
            "line": 206,
            "function": "runController",
            "class": "Illuminate\\Routing\\Route",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php",
            "line": 808,
            "function": "run",
            "class": "Illuminate\\Routing\\Route",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 144,
            "function": "Illuminate\\Routing\\{closure}",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\spatie\\laravel-permission\\src\\Middleware\\PermissionMiddleware.php",
            "line": 39,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 183,
            "function": "handle",
            "class": "Spatie\\Permission\\Middleware\\PermissionMiddleware",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Middleware\\SubstituteBindings.php",
            "line": 50,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 183,
            "function": "handle",
            "class": "Illuminate\\Routing\\Middleware\\SubstituteBindings",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken.php",
            "line": 88,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 183,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\View\\Middleware\\ShareErrorsFromSession.php",
            "line": 49,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 183,
            "function": "handle",
            "class": "Illuminate\\View\\Middleware\\ShareErrorsFromSession",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Session\\Middleware\\StartSession.php",
            "line": 121,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Session\\Middleware\\StartSession.php",
            "line": 64,
            "function": "handleStatefulRequest",
            "class": "Illuminate\\Session\\Middleware\\StartSession",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 183,
            "function": "handle",
            "class": "Illuminate\\Session\\Middleware\\StartSession",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse.php",
            "line": 37,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 183,
            "function": "handle",
            "class": "Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Cookie\\Middleware\\EncryptCookies.php",
            "line": 75,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 183,
            "function": "handle",
            "class": "Illuminate\\Cookie\\Middleware\\EncryptCookies",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 119,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php",
            "line": 807,
            "function": "then",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php",
            "line": 786,
            "function": "runRouteWithinStack",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php",
            "line": 750,
            "function": "runRoute",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php",
            "line": 739,
            "function": "dispatchToRoute",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php",
            "line": 200,
            "function": "dispatch",
            "class": "Illuminate\\Routing\\Router",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 144,
            "function": "Illuminate\\Foundation\\Http\\{closure}",
            "class": "Illuminate\\Foundation\\Http\\Kernel",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\livewire\\livewire\\src\\Features\\SupportDisablingBackButtonCache\\DisableBackButtonCacheMiddleware.php",
            "line": 19,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 183,
            "function": "handle",
            "class": "Livewire\\Features\\SupportDisablingBackButtonCache\\DisableBackButtonCacheMiddleware",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\barryvdh\\laravel-debugbar\\src\\Middleware\\InjectDebugbar.php",
            "line": 66,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 183,
            "function": "handle",
            "class": "Barryvdh\\Debugbar\\Middleware\\InjectDebugbar",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php",
            "line": 21,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull.php",
            "line": 31,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 183,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php",
            "line": 21,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TrimStrings.php",
            "line": 51,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 183,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\TrimStrings",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Http\\Middleware\\ValidatePostSize.php",
            "line": 27,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 183,
            "function": "handle",
            "class": "Illuminate\\Http\\Middleware\\ValidatePostSize",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance.php",
            "line": 110,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 183,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Http\\Middleware\\HandleCors.php",
            "line": 49,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 183,
            "function": "handle",
            "class": "Illuminate\\Http\\Middleware\\HandleCors",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Http\\Middleware\\TrustProxies.php",
            "line": 57,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 183,
            "function": "handle",
            "class": "Illuminate\\Http\\Middleware\\TrustProxies",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
            "line": 119,
            "function": "Illuminate\\Pipeline\\{closure}",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php",
            "line": 175,
            "function": "then",
            "class": "Illuminate\\Pipeline\\Pipeline",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php",
            "line": 144,
            "function": "sendRequestThroughRouter",
            "class": "Illuminate\\Foundation\\Http\\Kernel",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\public\\index.php",
            "line": 51,
            "function": "handle",
            "class": "Illuminate\\Foundation\\Http\\Kernel",
            "type": "->"
        },
        {
            "file": "C:\\Users\\dcyilmaz\\Desktop\\news_laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\resources\\server.php",
            "line": 23,
            "function": "require_once"
        }
    ]
}

Steps To Reproduce

Create 2 controllers and try to connect from one to the other with http:get.

m4tr1ck commented 2 months ago

@duran004, did you also test this behavior outside of using php artisan serve, which generally makes use of only one worker?

I could reproduce this behavior. With artisan serve, you only have one PHP worker for a request. With your first request, you are blocking the single worker. This worker will try to access the URL given by the route function, which will return the full URL to the HTTP client, which then starts a new request. This request can not be processed by artisan serve because the single worker is already occupied with your initial request. That means you don't have a bug; it is not an infinite loop. Your HTTP client is only waiting for your service to get a new free worker to handle his request. The error message also gives you this information. "message": "cURL error 28: Operation timed out after 30001 milliseconds with 0 bytes received.

I didn't test whether PHP_CLI_SERVER_WORKERS also influences artisan serve outside sail, but you could try setting it to 2 or more and testing it again. Based on the supervisor config file of sail, it should influence it.

A simpler rebuild of this case can be achieved with the following lines:

 <?php
 Route::get('test', function() {
    return response(Http::get(route('api.user'))->json());
});

Route::get('user', function() {
    return response(json_encode(['name' => 'Max']));
})->name('api.user');

Please test it again with PHP_CLI_SERVER_WORKERS=2. PHP_CLI_SERVER_WORKERS=2 php artisan serve