开始之前
我以Laravel为例,但我实际上用手工制作的MVC做了一个小项目,问题仍然存在,所以这与框架无关。
上下文
我使用php artisan serve
,这相当于php -S localhost:8000 -t public
来启动我的 Web 应用程序。我不使用Apache(可能是一个提示?
客户端(人类)通过其网络浏览器请求/user
页面。下面是响应此终结点的控制器的外观:
路线.php
<?php
Route::resource('user', 'UserController');
?>
用户控制器.php
<?php
namspace AppHttpController;
use IlluminateHttpRequest;
use AppUser;
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 端点负责提供数据。所以这是变化:
接口.php
<?php
Route::group(['prefix' => 'v1'], function() {
Route::resource('user', 'UserApiController');
});
?>
UserApiController.php
<?php
namespace AppHttpController;
use IlluminateHttpRequest;
use AppUser;
class UserApiController {
public function index() {
return response()->json(User::all(), 200);
}
}
?>
用户控制器.php
<?php
namespace AppHttpController;
use IlluminateHttpRequest;
use AppUser;
class UserController {
public function index() {
return view('user.index')->with('users', User::all());
}
}
?>
重现问题
为此,如果我走错了路,请纠正我,我的终结点/用户应该从/api/v1/user 请求数据,然后将数据提供给视图并返回 Http 响应。所以这是我在UserController.php
上修改的内容:
用户控制器.php
<?php
namespace AppHttpController;
use IlluminateHttpRequest;
use AppUser;
use GuzzleHttpClient;
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 处理请求的方式有关。我localhost:8000
通过设置 Apache 配置httpd.conf
将我的项目植根在同一位置,并且它正在工作,我可以跨我的路由发出请求。
如果任何善良的灵魂可以在这里粘贴有关我在 PHP Web 服务器上的请求正在发生的事情的技术细节......