本帖最后由 zsqsc 于 2012-01-02 17:26:44 编辑

解决方案 »

  1.   

    windows 服务器性能本来就差
      

  2.   


     
    1:服务器配置 4核+4G内存2:系统环境 windows2003 + apache3:带宽4M
      

  3.   

    机器配置可以了,除非上面跑了一堆乱七八糟的玩意。
    宽带4m...那就是ADSL?如果是的话就不适合用来测试并发了。单发都勉强剩下一个问题 windows+apache 把一张3M的图缩放切割成四张图需要11秒.代码发上来嘛...大伙可以给你看看 特别是hst0012010显然是有经验的。嘿嘿
      

  4.   

    上传大文件的确是挺占带宽的,图片处理也的确挺耗资源(CPU/内存)的。不过,以楼主的系统配置看,“3个人同时上传基本就不能用了”似乎有点不可思议。我暂时提不出什么具体的意见,只有一个务虚的建议:这种耗时、耗资源的操作,在大量并发的时候会对系统产生致命的压力,所以应该考虑限制并发连接数。通过测试得到一个适当的并发数限额,当超过这个限度的时候,给客户端一个友好的提示,让他稍后重试,以免无节制的并发请求一起拥进来把系统拖垮。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  5.   


    <?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();


    ?>
      

  6.   

    WIN 下就老老实实的用IIS吧
      

  7.   


    windows2003+IIS+PHP ?还是我要把图片切割换成c#的
      

  8.   

    IIS下照样跑PHP的。别听别人说什么APACHE就是神器
      

  9.   

    win下的IIS单机器比APACHE好用,多台机器没机会会用所以不知道了。
      

  10.   

    就算换成1920 ,执行时也很占内存大概300M,CPU直接到50%
      

  11.   

    echo 一下time()看看这11秒在各个语句的耗时,获取图片的尺寸其实getimagesize来搞定,同时可以获取图片的类型!list($pic_width,$pic_height,$type)=getimagesize($filename);
      

  12.   

    我普通机型配置如下:
    主频:2.6
    内存:2G
    集显
    4M带宽
    Windows XP + Apache2.2 用时最高2-3秒
    Fedora15 + Apache2.2 用时0-3秒
    图片像素2592*1936 1.82M
      

  13.   


    “实际内存占用比文件大小大很多”这个我知道,可是我的CPU为什么也那么高,你的CPU不高
      

  14.   


    这么来看是不是跟apache 配置有关系  ,你测试时帮我看下CPU和内存的使用情况
      

  15.   

    在我的古董机子上处理你说的那个图片 3秒...双核 处理时有一个占用100% ubuntu 
      

  16.   

    按你的代码和图片,执行后
    输出 3 ,应该是秒吧?2test.jpg 327x500 25227b
    3test.jpg 52x80 2021b
    4test.jpg 550x838 57210b
    5test.jpg 1920x2928 404851b观察不到内存使用有明显变化
      

  17.   


    请问运行环境是什么?这个跟apache 或者 php 配置哪些有关系?
      

  18.   


    我在linux+nginx 下执行是要快很多,但是cpu也很高,不知道是不是跟配置有关系
      

  19.   

    XP + apache2.2 + php5.3
      

  20.   


    请帮我分析下,这是不是跟apache 或者 php 配置有关系,不知道为什么我的cpu和内存都很高
      

  21.   

    我有点蒙了,这样的效率能承受访问吗?也就是说使用gd2处理一张图片要费掉50M内存和N多CPU,这就是PHP给我们的方案吗?能商用吗???
      

  22.   


    目前在windows下测试来看是这样,当然还不确定跟配置有关系没
      

  23.   

    测试速度快的都用 Apache2.2 了呀,我还是 Apache2.0  
      

  24.   


    我的意思是说,像 开心网啊,人人网啊,UCenter HOME 这些程序都是这么做的吗?他们的访问量可不小哦。他们的解决方案难道也是这个??
      

  25.   

    你命令行直接执行imagemagick的convert命令看看如何。
      

  26.   


    使用命令转换一张图片来看,内存用掉120M,cpu直接到达70%
      

  27.   

    我用你的代码和数据,运行平均需要3秒钟。这是我的配置:
    Cent OS 6
    PHP 5.3.3
    Apache 2.2
    Intel i5
    2G建议你统计一下在不同平台跑的数据。我的经验是在windows下使用php,其性能都不如linux下来得好。
      

  28.   

    那肯定不会在前端处理这个,况且钱不是问题的时候这些cpu之类的也就变得没那么刺眼了。
      

  29.   

    内存占用高似乎是必须的,图片处理嘛,就是这样的。CPU 高未必是坏事,至少说明你的机器在“干有用的事情”,如果系统一直卡在 IO wait 上那才是真正悲催的。#44 楼的建议不错,似乎是商用图片服务的必由之路。前台界面部分只负责上传,后续的图片处理通过后台任务来排队执行,可以避免瞬时高并发压垮系统。而如果“待处理的任务”实在多到“队列任务持续堆积”的程度,也只能考虑硬件扩容了。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  30.   

    请问 是否使用了fast-cgi,或者能不能看下你的apache和php5.3的配置为什么我自己在XP上执行要17秒
      

  31.   


    请问 是否使用了fast-cgi,或者能不能看下你的apache和php5.3的配置为什么我自己在XP上执行要17秒
      

  32.   

    还没有得到解决,希望大家再各地意见;另外上面两位,windows下执行只要3秒的,能不能讲一下你们的配置或者发一下你的phpinfo