php - 从 Guzzle on_stats 中为对象赋值
问题描述
这里愚蠢而简短的问题,
我一直在试图让端点在我的网站上工作一段时间,其中一个动作会触发一个端点调用。我想收集有关呼叫成功和平均响应时间之类的统计信息,因此我在发出请求之前创建了一个模型,然后在达到请求 on_stats 阶段后尝试分配对象值。问题是,当我尝试从请求内部分配变量时,它无法访问该对象,从而引发Creating default object from empty value
错误。Guzzle 有办法使事情同步,使用 Promise,但在出现各种错误和尝试调试后,我尝试并未能实现它们。有没有办法让我在下面的代码中尝试做的事情?如何从请求本身访问对象并分配值?
$call = new EndpointCall;
$call->endpoint_rel_id = $endpt->id;
// Initiate GuzzleHTTP Client
$client = new Client();
$requestQuery = $endpt->endpoint_url;
$response = $client->request('POST', $requestQuery, [
'allow_redirects' => false,
'json' => $obj,
'headers' => [
'api-secret' => $user->api_sending_secret,
'Accept' => 'application/json',
],
'synchronous' => true,
'http_errors' => false,
'on_stats' => function (TransferStats $stats) {
$call->response_time = $stats->getTransferTime();
if ($stats->hasResponse()) {
$call->response = $stats->getResponse()->getStatusCode();
}
$call->save();
}
]);
解决方案
尝试use($call)
像这样添加到函数声明中:
$call = new EndpointCall;
$call->endpoint_rel_id = $endpt->id;
// Initiate GuzzleHTTP Client
$client = new Client();
$requestQuery = $endpt->endpoint_url;
$response = $client->request('POST', $requestQuery, [
'allow_redirects' => false,
'json' => $obj,
'headers' => [
'api-secret' => $user->api_sending_secret,
'Accept' => 'application/json',
],
'synchronous' => true,
'http_errors' => false,
'on_stats' => function (TransferStats $stats) use($call) {
$call->response_time = $stats->getTransferTime();
if ($stats->hasResponse()) {
$call->response = $stats->getResponse()->getStatusCode();
}
$call->save();
}
]);
变量在函数内部是不可访问的,除非它们被声明为全局变量。以同样的方式,来自子作用域的变量不能从闭包中访问,除非使用 use 关键字明确说明。
推荐阅读
- python - 如何将 python 脚本作为参数传递?
- r - Remove all words in string containing punctuation (R)
- java - 如何在 Swagger 中将 Java8 LocalTime 显示为字符串?
- java - Spring boot 应用程序启动时如何缓存数据
- node.js - 管道不写入新的 writeStream
- vue.js - 如何测试这个组件?
- linux - 在 Flask 中使用 curl 上传文件
- php - 如何在php中获取json数组的值
- python - 在浏览器中打开 HTML 文档,然后在 SAME 窗口而不是新选项卡/窗口中更新
- php - 关闭浏览器后token失效