亚马逊AWSSDKforPHP太慢了

Yef*_*efb 5 php amazon-s3 amazon-web-services

亚马逊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');
}
Run Code Online (Sandbox Code Playgroud)

假设$ images是一组用户图片,这将返回一个名为$ urls的数组,该数组具有(如他的名字所示)具有5分钟凭据的图片的URL.此请求至少需要6秒才能显示35张图像,这没关系.但是....当存储桶中不存在图片时,我想为用户分配默认图像,例如'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';
    }

}
Run Code Online (Sandbox Code Playgroud)

条件有效,但SLOOOOOW.使用条件"$ 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';
    }
}
Run Code Online (Sandbox Code Playgroud)

这个修改过的脚本需要16到18秒.这是一个很大的不同,但它仍然是很多时间:(.

拜托,非常感谢任何帮助.

谢谢.

sea*_*ean 1

为什么不改变检查的方式呢?将图像的位置/存储桶本地存储在数据库中,这样您就不必担心此检查?

通过这种方式,您可以最大限度地减少正在执行的 API 调用数量,在您的情况下,现在为 35 个,但随着时间的推移,这个数量可能会呈指数级增长。而且,您不仅对每个图像执行一次调用,而且大多数情况下对每个图像执行两次调用。这是非常低效的,并且依赖于您的网络连接速度相当快。

就该领域的性能而言,移动位置数据以及图像是否存在于本地是更好的选择。此外,如果您提前存储结果,则该检查应该只需要执行一次(看起来无论如何)。