laravel artisan обслуживал серверы, запрашивая маршрут на api.php в рамках того же проекта? - PullRequest
0 голосов
/ 10 января 2019

Моя api.php внутри Routes папка выглядит так:

<?php

use Illuminate\Http\Request;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::post('login', 'Api\User\LoginController@login');

и web.php выглядит следующим образом:

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/system/login', 'System\LoginController@index');

Это код index метода System\LoginController.php:

class LoginController extends Controller
{
    use Requestable;

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        $response = $this->post('api/login',$request->all());
        $responseArray = json_decode($response->getBody(), true);
        session()->put('access_token',$responseArray['data']['token']);
        return redirect()->to('/system/dashboard');

        //
    }

Итак, в основном, я использую API в одном и том же проекте. Папка проекта находится внутри htdocs из xampp. Поэтому, когда я включаю и использую сервер Apache, API передает данные очень хорошо. Однако, если я использую * Команда 1017 * для обслуживания проекта, каждый раз, когда я пытаюсь получить данные из API, Сервер не выдает никакой ошибки, а просто выискивает и вообще не возвращает данные даже после долгого времени. Я предполагаю, что проблема в том, как сервер ведет себя с artisan serve. Некоторое тело, пожалуйста, помогите мне выбраться из этой проблемы?

1 Ответ

0 голосов
/ 10 января 2019

Если вы посмотрите внимательно, вот как это работает.

Когда вы нажимаете /system/login (веб-запрос) в вашем браузере, он запускает php, который ищет правильный маршрут, который оказывается System\LoginController@index. Затем он запускает индексную функцию в LoginController.

Теперь, когда он находит следующую строку в прогоне (запрос API)

$response = $this->post('api/login',$request->all());

Таким образом, в этой строке тот же экземпляр php (обслуживал веб-запрос) пытается вызвать себя ! и веб-запрос все еще не завершен. Также имейте в виду синхронную природу PHP, он не будет перемещаться на следующую строку, пока текущая строка не вернется.

Если вы заметите здесь встроенный сервер PHP является однопоточным процессом

Веб-сервер запускает только один однопоточный процесс, поэтому приложения PHP останавливаются, если запрос заблокирован.

Он может обрабатывать запросы только по одному за раз. Так что запрос API просто ожидает (в очереди) обработки, поскольку веб-запрос еще не выполнен, а веб-запрос ожидает ответа на только что сделанный вызов API Это тупик - причина, по которой все зависает. В случае с производственными серверами, такими как сервер Apache, этого не происходит, поскольку Apache может порождать несколько процессов / потоков по мере необходимости и делегировать их отдельному экземпляру php для обработки. .

...