【发布时间】:2021-03-10 00:00:57
【问题描述】:
我在这里寻求帮助以了解我的代码是否正确。因为我看不到响应时间有多大改善。我使用 guzzle promise 来降低我的整体表现。
现有代码:
protected function sampleFunction(&$outputArray){
foreach($outputArray as $key => $images){
foreach($images as $index => $image){
$result = NewClass::ClassSampleFunction($image->path, $this->samplePoint); // This is expensive function calls in current code.
}
}
}
使用 guzzle 承诺回调的新代码:
protected function sampleFunction(&$outputArray){
foreach($outputArray as $key => $images){
$promises = array();
foreach($images as $index => $image){
$promises[$index] = $this->promiseFunction($image,$index);
}
$results = \GuzzleHttp\Promise\settle($promises)->wait();
foreach ($results as $resultkey => $value) {
$search_point_image_xy_array = $value['value']->toArray();
// some logic to use result and put in another response array.
}
}
}
protected function promiseFunction($image,$index){
$promise = new Promise(
function () use ($image,$index,&$promise) {
$response = NewClass::ClassSampleFunction($image->path, $this->samplePoint);
$promise->resolve($response);
},
function () {
// do something that will cancel the promise computation (e.g., close
// a socket, cancel a database query, etc...)
}
);
return $promise;
}
这个新代码试图调用 NewClass::ClassSampleFunction($image->path, $this->samplePoint); 这个昂贵的函数调用,使用 guzzle promise 没有外部端点。但在此之后,还预计响应时间会有所减少,但不会发生变化,而有时它会超过旧代码。
提及函数调用NewClass::ClassSampleFunction($image->path, $this->samplePoint); 这次运行假设我有第一个 for 循环 4 范围,第二个每个第一个 for 循环有 10 个,然后总共 40 次调用到这个函数。如果我使用异步调用,那么第一次调用没有它完成第二次调用,反之亦然。这有助于在旧代码中使用等待时间
我做错了什么?有什么帮助或建议吗?
【问题讨论】:
-
您在寻找哪些更改?从外部服务器下载东西仍然需要时间。您可以尝试使用 blackfire.io 进行调试
-
这是本地函数。嵌套在多个本地函数中有外部调用。我无法更改该外部呼叫。想要使用本地函数作为异步调用的承诺。
-
我的期望应该是旧代码需要时间来完成 5 秒。使用 promise 异步调用后,它应该减少到 500 或 600 毫秒,因为没有调用应该等待第一次调用完成。
-
还有哪些呼叫还在等待?除了监视请求开始和完成之间的时间之外,您还尝试检查什么差异?由于这些“昂贵的调用”仍然必须在您的应用程序中随时发生(这意味着:执行需要时间,无论何时发生),我认为您没有正确监控它们
-
提及函数调用
NewClass::ClassSampleFunction($image->path, $this->samplePoint);这次运行假设我有第一个 for 循环 4 范围,第二个每个第一个 for 循环有 10 个,然后总共调用了 40 次此函数。如果我使用 asyc 调用,那么第一次调用没有它完成第二次调用,反之亦然。这有助于在旧代码中使用等待时间。
标签: php promise guzzle6 guzzle