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秒.这是一个很大的不同,但它仍然是很多时间:(.
拜托,非常感谢任何帮助.
谢谢.
为什么不改变检查的方式呢?将图像的位置/存储桶本地存储在数据库中,这样您就不必担心此检查?
通过这种方式,您可以最大限度地减少正在执行的 API 调用数量,在您的情况下,现在为 35 个,但随着时间的推移,这个数量可能会呈指数级增长。而且,您不仅对每个图像执行一次调用,而且大多数情况下对每个图像执行两次调用。这是非常低效的,并且依赖于您的网络连接速度相当快。
就该领域的性能而言,移动位置数据以及图像是否存在于本地是更好的选择。此外,如果您提前存储结果,则该检查应该只需要执行一次(看起来无论如何)。
| 归档时间: |
|
| 查看次数: |
1534 次 |
| 最近记录: |