如何实现高并发图片上传 本帖最后由 zsqsc 于 2012-01-02 17:26:44 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 windows 服务器性能本来就差 1:服务器配置 4核+4G内存2:系统环境 windows2003 + apache3:带宽4M 机器配置可以了,除非上面跑了一堆乱七八糟的玩意。宽带4m...那就是ADSL?如果是的话就不适合用来测试并发了。单发都勉强剩下一个问题 windows+apache 把一张3M的图缩放切割成四张图需要11秒.代码发上来嘛...大伙可以给你看看 特别是hst0012010显然是有经验的。嘿嘿 上传大文件的确是挺占带宽的,图片处理也的确挺耗资源(CPU/内存)的。不过,以楼主的系统配置看,“3个人同时上传基本就不能用了”似乎有点不可思议。我暂时提不出什么具体的意见,只有一个务虚的建议:这种耗时、耗资源的操作,在大量并发的时候会对系统产生致命的压力,所以应该考虑限制并发连接数。通过测试得到一个适当的并发数限额,当超过这个限度的时候,给客户端一个友好的提示,让他稍后重试,以免无节制的并发请求一起拥进来把系统拖垮。————————————————————————————————基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :) <?php class Image{ // 创建图像 public function TransToImgSrc( $data, $type ) { switch ( $type ) { case 'jpg': case 'jpeg': case 'pjpeg': return imagecreatefromjpeg( $data ); case 'png': return imagecreatefrompng( $data ); case 'gif': return imagecreatefromgif( $data ); default: return false; } } // 等比压缩 public function resizeRatio($im, $maxwidth, $maxheight, $path_name ,$tmp_file ) { $pic_width = imagesx($im); $pic_height = imagesy($im); if(($maxwidth && $pic_width > $maxwidth)||($maxheight && $pic_height > $maxheight)) { if($maxwidth && $pic_width>$maxwidth) { $widthratio = $maxwidth/$pic_width; $resizewidth_tag = true; } if($maxheight && $pic_height>$maxheight) { $heightratio = $maxheight/$pic_height; $resizeheight_tag = true; } if($resizewidth_tag && $resizeheight_tag) { if($widthratio<$heightratio) $ratio = $widthratio; else $ratio = $heightratio; } if($resizewidth_tag && !$resizeheight_tag) $ratio = $widthratio; if($resizeheight_tag && !$resizewidth_tag) $ratio = $heightratio; $newwidth = floor($pic_width * $ratio); $newheight = floor($pic_height * $ratio); if(function_exists("imagecopyresampled")) { $newim = imagecreatetruecolor($newwidth,$newheight); imagecopyresampled($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height); } else { $newim = imagecreate($newwidth,$newheight); imagecopyresized($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height); } imagejpeg($newim,$path_name); imagedestroy($newim); } else { copy($tmp_file,$path_name); } return true; } } $st = time(); ini_set("memory_limit","-1"); $imgType = "jpg"; $imgName = "test.jpg"; $imgFile = "1.jpg";//图片地址: 'http://www.ms8mr.com/forum/space/upload/2010/07/22/-18157358435971.jpg'; $imgUp = new Image(); $imgObj = $imgUp->TransToImgSrc( $imgFile, $imgType); if(!$imgObj) { echo $imgObj; exit(); } $data = $imgUp->resizeRatio($imgObj, 500, 500, '2'.$imgName,$imgFile); if(!$data) { echo $data; exit(); } $data = $imgUp->resizeRatio($imgObj, 60, 80, '3'.$imgName,$imgFile); if(!$data) { echo $data; exit(); } $data = $imgUp->resizeRatio($imgObj, 550, 19200, '4'.$imgName,$imgFile); if(!$data) { echo $data; exit(); } $data = $imgUp->resizeRatio($imgObj, 1920, 19200, '5'.$imgName,$imgFile); if(!$data) { echo $data; exit(); } unset($imgUp); $et = time(); echo $et-$st; exit(); ?> WIN 下就老老实实的用IIS吧 windows2003+IIS+PHP ?还是我要把图片切割换成c#的 IIS下照样跑PHP的。别听别人说什么APACHE就是神器 win下的IIS单机器比APACHE好用,多台机器没机会会用所以不知道了。 就算换成1920 ,执行时也很占内存大概300M,CPU直接到50% echo 一下time()看看这11秒在各个语句的耗时,获取图片的尺寸其实getimagesize来搞定,同时可以获取图片的类型!list($pic_width,$pic_height,$type)=getimagesize($filename); 我普通机型配置如下:主频:2.6内存:2G集显4M带宽Windows XP + Apache2.2 用时最高2-3秒Fedora15 + Apache2.2 用时0-3秒图片像素2592*1936 1.82M “实际内存占用比文件大小大很多”这个我知道,可是我的CPU为什么也那么高,你的CPU不高 这么来看是不是跟apache 配置有关系 ,你测试时帮我看下CPU和内存的使用情况 在我的古董机子上处理你说的那个图片 3秒...双核 处理时有一个占用100% ubuntu 按你的代码和图片,执行后输出 3 ,应该是秒吧?2test.jpg 327x500 25227b3test.jpg 52x80 2021b4test.jpg 550x838 57210b5test.jpg 1920x2928 404851b观察不到内存使用有明显变化 请问运行环境是什么?这个跟apache 或者 php 配置哪些有关系? 我在linux+nginx 下执行是要快很多,但是cpu也很高,不知道是不是跟配置有关系 XP + apache2.2 + php5.3 请帮我分析下,这是不是跟apache 或者 php 配置有关系,不知道为什么我的cpu和内存都很高 我有点蒙了,这样的效率能承受访问吗?也就是说使用gd2处理一张图片要费掉50M内存和N多CPU,这就是PHP给我们的方案吗?能商用吗??? 目前在windows下测试来看是这样,当然还不确定跟配置有关系没 测试速度快的都用 Apache2.2 了呀,我还是 Apache2.0 我的意思是说,像 开心网啊,人人网啊,UCenter HOME 这些程序都是这么做的吗?他们的访问量可不小哦。他们的解决方案难道也是这个?? 你命令行直接执行imagemagick的convert命令看看如何。 使用命令转换一张图片来看,内存用掉120M,cpu直接到达70% 我用你的代码和数据,运行平均需要3秒钟。这是我的配置:Cent OS 6PHP 5.3.3Apache 2.2Intel i52G建议你统计一下在不同平台跑的数据。我的经验是在windows下使用php,其性能都不如linux下来得好。 那肯定不会在前端处理这个,况且钱不是问题的时候这些cpu之类的也就变得没那么刺眼了。 内存占用高似乎是必须的,图片处理嘛,就是这样的。CPU 高未必是坏事,至少说明你的机器在“干有用的事情”,如果系统一直卡在 IO wait 上那才是真正悲催的。#44 楼的建议不错,似乎是商用图片服务的必由之路。前台界面部分只负责上传,后续的图片处理通过后台任务来排队执行,可以避免瞬时高并发压垮系统。而如果“待处理的任务”实在多到“队列任务持续堆积”的程度,也只能考虑硬件扩容了。————————————————————————————————基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :) 请问 是否使用了fast-cgi,或者能不能看下你的apache和php5.3的配置为什么我自己在XP上执行要17秒 请问 是否使用了fast-cgi,或者能不能看下你的apache和php5.3的配置为什么我自己在XP上执行要17秒 还没有得到解决,希望大家再各地意见;另外上面两位,windows下执行只要3秒的,能不能讲一下你们的配置或者发一下你的phpinfo 求大神给我看看这个正则,在工具中测试匹配出了结果,但是却打印不出来!在线急等 QQ聊天记录的分页是如何做的? PHP生成动态WAP页面 一个用js操作html标签的问题。高手进来。一般人不会。 PHP上传导入excel格式的csv的问题 遍历mysql_fetch_array() 数据库字段统计 php4.2+apache2+mysql+win2k为啥必须用post 和get才能得到传递的变量 php部分常见问题 json数组问题,在线等 一个函数使用echo输出内容,怎样将该函数输出的内容赋值个变量? 上传50M文件max_execution_time 设置多大好?
1:服务器配置 4核+4G内存2:系统环境 windows2003 + apache3:带宽4M
宽带4m...那就是ADSL?如果是的话就不适合用来测试并发了。单发都勉强剩下一个问题 windows+apache 把一张3M的图缩放切割成四张图需要11秒.代码发上来嘛...大伙可以给你看看 特别是hst0012010显然是有经验的。嘿嘿
————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
<?php
class Image{
// 创建图像
public function TransToImgSrc( $data, $type )
{
switch ( $type )
{
case 'jpg':
case 'jpeg':
case 'pjpeg':
return imagecreatefromjpeg( $data );
case 'png':
return imagecreatefrompng( $data );
case 'gif':
return imagecreatefromgif( $data );
default:
return false;
}
}
// 等比压缩
public function resizeRatio($im, $maxwidth, $maxheight, $path_name ,$tmp_file )
{
$pic_width = imagesx($im);
$pic_height = imagesy($im);
if(($maxwidth && $pic_width > $maxwidth)||($maxheight && $pic_height > $maxheight))
{
if($maxwidth && $pic_width>$maxwidth)
{
$widthratio = $maxwidth/$pic_width;
$resizewidth_tag = true;
}
if($maxheight && $pic_height>$maxheight)
{
$heightratio = $maxheight/$pic_height;
$resizeheight_tag = true;
}
if($resizewidth_tag && $resizeheight_tag)
{
if($widthratio<$heightratio)
$ratio = $widthratio;
else
$ratio = $heightratio;
}
if($resizewidth_tag && !$resizeheight_tag) $ratio = $widthratio;
if($resizeheight_tag && !$resizewidth_tag) $ratio = $heightratio;
$newwidth = floor($pic_width * $ratio);
$newheight = floor($pic_height * $ratio);
if(function_exists("imagecopyresampled"))
{
$newim = imagecreatetruecolor($newwidth,$newheight);
imagecopyresampled($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
}
else
{
$newim = imagecreate($newwidth,$newheight);
imagecopyresized($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
}
imagejpeg($newim,$path_name);
imagedestroy($newim);
}
else
{
copy($tmp_file,$path_name);
}
return true;
}
}
$st = time();
ini_set("memory_limit","-1");
$imgType = "jpg";
$imgName = "test.jpg";
$imgFile = "1.jpg";//图片地址: 'http://www.ms8mr.com/forum/space/upload/2010/07/22/-18157358435971.jpg';
$imgUp = new Image();
$imgObj = $imgUp->TransToImgSrc( $imgFile, $imgType);
if(!$imgObj) { echo $imgObj; exit(); }
$data = $imgUp->resizeRatio($imgObj, 500, 500, '2'.$imgName,$imgFile);
if(!$data) { echo $data; exit(); }
$data = $imgUp->resizeRatio($imgObj, 60, 80, '3'.$imgName,$imgFile);
if(!$data) { echo $data; exit(); }
$data = $imgUp->resizeRatio($imgObj, 550, 19200, '4'.$imgName,$imgFile);
if(!$data) { echo $data; exit(); }
$data = $imgUp->resizeRatio($imgObj, 1920, 19200, '5'.$imgName,$imgFile);
if(!$data) { echo $data; exit(); }
unset($imgUp);
$et = time();
echo $et-$st;
exit();
?>
windows2003+IIS+PHP ?还是我要把图片切割换成c#的
主频:2.6
内存:2G
集显
4M带宽
Windows XP + Apache2.2 用时最高2-3秒
Fedora15 + Apache2.2 用时0-3秒
图片像素2592*1936 1.82M
“实际内存占用比文件大小大很多”这个我知道,可是我的CPU为什么也那么高,你的CPU不高
这么来看是不是跟apache 配置有关系 ,你测试时帮我看下CPU和内存的使用情况
输出 3 ,应该是秒吧?2test.jpg 327x500 25227b
3test.jpg 52x80 2021b
4test.jpg 550x838 57210b
5test.jpg 1920x2928 404851b观察不到内存使用有明显变化
请问运行环境是什么?这个跟apache 或者 php 配置哪些有关系?
我在linux+nginx 下执行是要快很多,但是cpu也很高,不知道是不是跟配置有关系
请帮我分析下,这是不是跟apache 或者 php 配置有关系,不知道为什么我的cpu和内存都很高
目前在windows下测试来看是这样,当然还不确定跟配置有关系没
我的意思是说,像 开心网啊,人人网啊,UCenter HOME 这些程序都是这么做的吗?他们的访问量可不小哦。他们的解决方案难道也是这个??
使用命令转换一张图片来看,内存用掉120M,cpu直接到达70%
Cent OS 6
PHP 5.3.3
Apache 2.2
Intel i5
2G建议你统计一下在不同平台跑的数据。我的经验是在windows下使用php,其性能都不如linux下来得好。
————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
请问 是否使用了fast-cgi,或者能不能看下你的apache和php5.3的配置为什么我自己在XP上执行要17秒