amazon awssdkforphp太慢
你好,
我使用amazon awssdkforphp将我的web应用程序与s3连接起来。但是,进程或向服务发出请求时出现问题,导致此过程太慢。
例如,我有以下代码:

// Iterate an array of user images
foreach($images as $image){
    // Return the Bucket URL for this image
    $urls[] = $s3->get_object_url($bucket, 'users/'.trim($image).'.jpg', '5 minutes');
}

假设$images是一个用户图片数组,这将返回一个名为$urls的数组,该数组具有(正如他的名字所说的)具有5分钟凭证的图片的url。这个请求至少需要6秒,35张图片,没关系。但是…当图片不在bucket中时,我想为用户分配一个默认图片,比如“images/noimage.png”。
代码如下:
// Iterate an array of user images
foreach($images as $image){

    // Check if the object exists in the Bucket
    if($s3->if_object_exists($bucket, 'users/'.trim($image).'.jpg')){
        // Return the Bucket URL for this image
        $urls[] = $s3->get_object_url($bucket, 'users/'.trim($image).'.jpg', '5 minutes');
    } else {

        // Return the default image
        $urls[] = 'http://www.example.com/images/noimage.png';
    }

}

情况正常,但很慢。在条件为“$s3->if_object_exists()”的情况下,该脚本至少需要40秒,包含35个图像!
我修改了脚本,使用curl发出请求:
// Iterate an array of user images
foreach($images as $image){

    // Setup cURL
    $ch = curl_init($s3->get_object_url($bucket, 'users/'.trim($image).'.jpg', '1 minutes') );
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    // Get Just the HTTP response code
    $res = curl_getinfo($ch,CURLINFO_HTTP_CODE);

    if($res == 200){ //the image exists
        $urls[] = $s3->get_object_url($bucket, 'users/'.trim($image).'.jpg', '5 minutes');
    }else{ // The response is 403
        $urls[] = 'http://www.example.com/images/noimage.png';
    }
}

这个修改过的脚本需要16到18秒。这是一个很大的不同,但它仍然是很多时间:(。
求求你,我非常感谢你的帮助。
谢谢您.

最佳答案

为什么不改变你的检查方式呢?将图像的位置/存储桶本地存储在数据库中,这样您就不用担心这个检查了?
这样,您就可以最小化正在进行的api调用的数量,在您的情况下,现在是35个,但随着时间的推移,这可能会成倍增加。而且,您不仅要对每个映像执行一次调用,而且在大多数情况下还要对每个映像执行两次调用。这是非常低效率和依赖于您的网络连接相当快。
移动位置数据,如果图像存在或不存在,在这方面的性能是一个更好的选择。此外,这项检查应该只做一次,看起来无论如何,如果你提前存储结果。

08-27 04:21