【发布时间】:2018-01-24 23:20:47
【问题描述】:
开始之前
我以Laravel为例,但实际上我用手工MVC做了一个小项目,问题仍然存在,所以这与框架无关。
上下文
我使用php artisan serve,相当于php -S localhost:8000 -t public 来启动我的网络应用程序。我不使用 Apache(可能是一个提示?)。
客户端(人类)通过他的网络浏览器请求页面/user。以下是响应此端点的控制器的外观:
routes.php
<?php
Route::resource('user', 'UserController');
?>
UserController.php
<?php
namspace App\Http\Controller;
use Illuminate\Http\Request;
use App\User;
class UserController {
public function index( Request $request ) {
$users = User::all();
if( $request->wantsJson() ) {
return response()->json($users, 200);
}
else {
return view('user.index')->with('users', $users);
}
}
}
?>
这段代码没有错,一切正常。
我想建立一个“存储”机制,只有我的 api 端点负责提供数据。所以这里是变化:
api.php
<?php
Route::group(['prefix' => 'v1'], function() {
Route::resource('user', 'UserApiController');
});
?>
UserApiController.php
<?php
namespace App\Http\Controller;
use Illuminate\Http\Request;
use App\User;
class UserApiController {
public function index() {
return response()->json(User::all(), 200);
}
}
?>
UserController.php
<?php
namespace App\Http\Controller;
use Illuminate\Http\Request;
use App\User;
class UserController {
public function index() {
return view('user.index')->with('users', User::all());
}
}
?>
重现问题
为此,如果我走错了路,请纠正我,我的端点 /user 应该从 /api/v1/user 请求数据,然后将数据提供给视图并返回 Http 响应。所以这是我在UserController.php 上修改的内容:
UserController.php
<?php
namespace App\Http\Controller;
use Illuminate\Http\Request;
use App\User;
use GuzzleHttp\Client;
class UserController {
public function index() {
$client = new Client;
$response = $client->get(url('/api/v1/user'));
return view('user.index')->with('users', User::all());
}
}
?>
对我来说,端点会收到来自客户端(人)的请求,然后向api端点发送第二个请求,获取json数据,解析它(使用$data = $response->getBody()->getContents();GuzzleHttp方法),然后提供给视图(使用return view('user.index')->with('users', $data);。
问题
服务器实际上是无限循环,我不明白这个过程中失败的原因。请注意,从另一台服务器调用 api(例如 https://ipapi.co/json 完全可以正常工作)。
有人可以给我提示一下导致这种冻结的原因吗?
【问题讨论】:
-
对我来说似乎合乎逻辑。你调用端点,它调用同一个端点,它调用端点等等,永远
-
这与 PHP Web 服务器处理并发请求的方式有关吗?例如,如果我使用 Apache,这会产生同样的效果吗?