24

私の会社は最近、当社のWebサイトの画像処理で問題が発生し始めました。

DVDカバー、スナップショットなどの画像を表示するいくつかのWebサイト(アダルトエンターテインメント)があります。約10万本の映画があり、映画ごとに平均30本のスナップショットとカバーがあります。ほとんどすべての画像には、非会員向けのぼかしとオーバーレイを備えた追加バージョンがあります。これにより、ムービーごとに約50枚の画像、または合計500万枚のベース画像が作成されます。各画像は、ページ上のどこに配置されているか(サムネイル、オリジナル、小さいプレビュー、それほど小さくないプレビュー、トップリストの小さい画像など)に応じて、いくつかのバージョンで利用できます。私は数えることを気にした。

サーバーを使用してオンザフライで画像を生成することを思いついたのは、すべての異なるページに対してすべての異なる画像を生成するのが非常に不器用になったためです(基本的に同じタスクで異なるページが異なる画像サイズを必要とする場合もあるため) 。

画像をオンザフライで縮小できる画像処理サーバーを知っている人はいますか?元の画像を提供するだけで、ウェブ担当者は必要なサイズをリクエストできますか?

要件:

  • 非常に高いパフォーマンス(1日あたり数千人のユーザー)
  • オンザフライのぼかしとオーバーレイの作成
  • オンザフライのサイズ変更(アスペクト比を維持する場合としない場合)
  • 何百万もの画像を処理できます
  • JPG、GIF、PNG、BMPを読み取り、それらの間で変換できる必要があります

セキュリティはそれほど重要ではありません。つまり、ぼやけていない画像はURL操作によってすでに到達可能であり、より多くのセキュリティがあればよいのですが、それは必須ではなく、率直に言って私は気にかけるのをやめました(同僚の頭に入るのに失敗した後、なぜ(私たちの小さな再販業者のために)ページ) http://example.com/view_image.php?filename=/data/images/01020304.jpgを使用して画像を表示することはお勧めできません)。

これを行うためにPHPスクリプトを試しましたが、この多くのユーザーにとってパフォーマンスが遅すぎました。

あなたが持っているどんな提案にも前もって感謝します。

4

8 に答える 8

29

画像のサイズ変更を処理して最終結果を提供するために、専用のWebサーバーをセットアップすることをお勧めします。規模ははるかに小さいですが、私は似たようなことをしました。基本的に、キャッシュをチェックするプロセスが不要になります。

それはこのように動作します:

  • 次のようにファイル名に必要なサイズを追加する画像をリクエストしますhttp://imageserver/someimage.150x120.jpg
  • 画像が存在する場合、他の処理なしで返されます(これが要点であり、キャッシュチェックは暗黙的です)
  • 画像が存在しない場合は、.htaccessで見つからない404を処理し、必要なサイズの画像を生成するスクリプトにリクエストを再ルーティングします
  • スクリプトで許可されるサイズのリストを指定して、サーバーをシャットダウンするために可能なすべてのサイズを要求するスクリプトなどの攻撃を回避します
  • 不要なトラフィックを最小限に抑えるために、これをCookieなしのドメインに保持します

編集:この場合のPHPスクリプトは最小限に抑えられているため、PHP自体がプロセスをそれほど遅くするとは思いません。画像スケーリングはCで記述された組み込みライブラリによって行われます。何を使用する必要もあります。このようなライブラリ(GDやlibmagickなど)は避けられません。私のシステムでは、少なくともキャッシュをチェックするオーバーヘッドを完全にスキップするため、PHPの相互作用がさらに減少します。これは既存のサーバーに実装できるので、予算に適したソリューションだと思います。

于 2010-02-14T11:00:56.193 に答える
7

に基づく

これを行うためにPHPスクリプトを試しましたが、この多くのユーザーにとってパフォーマンスが遅すぎました。

結果をキャッシュしていなかったと仮定します。結果の画像を1〜2日キャッシュすることをお勧めします(つまり、サムネイルが既に生成されているかどうかをスクリプトで確認し、生成されている場合は、その場で生成されていない場合はそれを使用します)。

メイン/スタートページのヒット数はランダムビデオXよりもはるかに多いと思うので、これによりパフォーマンスが劇的に向上します。したがって、メインページを表示するときに、キャッシュされるときに画像を作成する必要はありません。ユーザーYがMovieXを表示すると、その1ページを生成するだけなので、遅延にそれほど気付くことはありません。

「オンザフライサイズ変更」の側面については、帯域幅はあなたにとってどれほど重要ですか?私はあなたが映画で多くを経験していると仮定したいので、リクエストごとに画像の数キロバイトがそれほど害を及ぼすことはありません。その場合は、より大きな画像を使用して幅と高さを設定し、ブラウザにスケーリングを任せることができます。

于 2010-02-10T17:29:35.787 に答える
4

DrupalコミュニティのImageCacheおよびImageExactSizesソリューションがこれを行う可能性があり、ほとんどのソリューションと同様に、OSSはImageMagikのライブラリを使用します

画像スケーリングを行うためのAmazonEC2サービス用のAMI画像がいくつかあります。画像ストレージ、オリジナル、スケールにAmazon S3を使用し、それらをAmazonのCDNサービス(Cloud Front)にフィードすることができました。利用可能なものについては、EC2サイトを確認してください

別のオプションはGoogleです。Googleドキュメントですべてのファイルタイプがサポートされるようになったため、画像をGoogleドキュメントフォルダに読み込んで、そのフォルダを共有してパブリックアクセスできるようになりました。URLはちょっと長いです例えば

http://lh6.ggpht.com/VMLEHAa3kSHEoRr7AchhQ6HEzHVTn1b7Mf-whpxmPlpdrRfPW216UhYdQy3pzIe4f8Q7PKXN79AD4eRqu1obC7I

=sパラメータを追加して画像を拡大縮小します。例:幅200ピクセルの場合

http://lh6.ggpht.com/VMLEHAa3kSHEoRr7AchhQ6HEzHVTn1b7Mf-whpxmPlpdrRfPW216UhYdQy3pzIe4f8Q7PKXN79AD4eRqu1obC7I=s200

Googleは20GBに対して年間5米ドルのみを請求します。ドキュメントなどをアップロードするための完全なAPIがあります

SOに関するその他の回答 サーバー外で画像のサイズを変更する最善の方法

于 2010-02-13T05:03:19.990 に答える
2

最初の問題は、任意の言語で画像のサイズを変更すると、処理に少し時間がかかることです。では、何千ものクライアントをどのようにサポートしますか?画像を1回生成するだけで済むように、キャッシュします。次に誰かがその画像を要求したとき、それがすでに生成されているかどうか、それがちょうどそれを返したかどうかを確認します。複数のアプリサーバーがある場合は、中央のファイルシステムにキャッシュして、キャッシュヒット率を高め、必要なスペースの量を減らす必要があります。

適切にキャッシュするには、画像を表示するさまざまな方法をすべて考慮した予測可能な命名規則を使用する必要があります。つまり、myimage_blurred_320x200.jpgのようなものを使用して、ぼかして300幅と200にサイズ変更したjpegを保存します。高さなど

もう1つのアプローチは、画像サーバーをプロキシサーバーの背後に配置することです。これにより、すべてのキャッシュロジックが自動的に実行され、画像は高速のネイティブWebサーバーによって提供されます。

他の方法で何百万ものサイズ変更された画像を提供することはできません。これがGoogleとBingマップのやり方です。適切なパフォーマンスを提供し、事前に生成された静止画像を返すことができるように、さまざまな事前設定された範囲で世界に必要なすべての画像を事前に生成します。

PHPが遅すぎる場合は、Javaまたは.NETの2Dグラフィックライブラリを使用することを検討してください。これらは非常に豊富で、すべての要件をサポートできます。Graphics APIのフレーバーを取得するには、.NETのメソッドを使用して、指定した新しい幅または高さに画像のサイズを変更します。高さまたは幅を省略すると、正しいアスペクト比を維持しながらサイズが変更されます。注画像は、JPG、GIF、PNG、またはBMPから作成できます。

// Creates a re-sized image from the SourceFile provided that retails the same aspect ratio of the SourceImage. 
// -    If either the width or height dimensions is not provided then the resized image will use the 
//      proportion of the provided dimension to calculate the missing one.
// -    If both the width and height are provided then the resized image will have the dimensions provided 
//      with the sides of the excess portions clipped from the center of the image.
public static Image ResizeImage(Image sourceImage, int? newWidth, int? newHeight)
{
    bool doNotScale = newWidth == null || newHeight == null; ;

    if (newWidth == null)
    {
        newWidth = (int)(sourceImage.Width * ((float)newHeight / sourceImage.Height));
    }
    else if (newHeight == null)
    {
        newHeight = (int)(sourceImage.Height * ((float)newWidth) / sourceImage.Width);
    }

    var targetImage = new Bitmap(newWidth.Value, newHeight.Value);

    Rectangle srcRect;
    var desRect = new Rectangle(0, 0, newWidth.Value, newHeight.Value);

    if (doNotScale)
    {
        srcRect = new Rectangle(0, 0, sourceImage.Width, sourceImage.Height);
    }
    else
    {
        if (sourceImage.Height > sourceImage.Width)
        {
            // clip the height
            int delta = sourceImage.Height - sourceImage.Width;
            srcRect = new Rectangle(0, delta / 2, sourceImage.Width, sourceImage.Width);
        }
        else
        {
            // clip the width
            int delta = sourceImage.Width - sourceImage.Height;
            srcRect = new Rectangle(delta / 2, 0, sourceImage.Height, sourceImage.Height);
        }
    }

    using (var g = Graphics.FromImage(targetImage))
    {
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;

        g.DrawImage(sourceImage, desRect, srcRect, GraphicsUnit.Pixel);
    }

    return targetImage;
}
于 2010-02-14T10:50:19.740 に答える
1

この質問がなされたとき、この正確な問題に対処するためにいくつかの会社が生まれました。それはあなたやあなたの会社に限定された問題ではありません。多くの企業は、画像処理のニーズに対してより永続的なソリューションを探す必要がある段階に達しています。

imgixのようなサービスは、オーバーレイのサイズ変更や適用などの画像操作のプロキシおよびCDNとして機能します。URLを操作することで、各画像に異なる変換を適用できます。imgixは、1日あたり数十億のリクエストを処理します。

自分でサービスを立ち上げて、CDNの背後に置くこともできます。imageproxyのようなオープンソースプロジェクトはこれに適しています。これにより、運用チームにメンテナンスの負担がかかります。

(免責事項:私はimgixで働いています。)

于 2015-08-06T17:47:03.070 に答える
1

あなたが探しているものは、Thumbor http://thumbor.readthedocs.org/en/latest/index.htmlに最もよく一致します。これはオープンソースであり、巨大な会社に支えられており(つまり、明日消えることはありません)、トリミング時に画像上で重要なものを検出するなど、多くの優れた機能があります。

低コストとCDNの場合は、CloudfrontおよびAWSストレージ、またはCloudflareのような無料のCDNと同等のソリューションを組み合わせることをお勧めします。これらは最高のパフォーマンスのCDNプロバイダーではないかもしれませんが、少なくとも1台のサーバーよりも優れたパフォーマンスを発揮し、安価なイメージサーバーの負荷を軽減します。さらに、帯域幅のコストを大幅に節約できます。

于 2016-02-16T07:38:23.190 に答える
0

それぞれの異なる画像が単一のURLで一意に識別できる場合は、AKAMAIなどのCDNを使用します。PHPスクリプトに処理を任せ、AKAMAIにロードを処理させます。

この種のビジネスは通常予算の問題がないので、それが私が見る唯一の場所でしょう。

編集:これは、この種のコンテンツを提供するCDNを見つけた場合にのみ機能します。

于 2010-02-14T10:55:49.340 に答える
0

このまったく同じ問題は、このタスク専用の画像サイズ変更サービスによって解決されています。これらは次の機能を提供します。

  1. 構築されたCDNでは-画像の配布について心配する必要はありません
  2. その場で画像のサイズを変更-必要な任意のサイズが利用可能
  3. ストレージは必要ありません-ベースイメージを保存するだけで、すべてのバリアントがサービスによって処理されます
  4. エコシステムライブラリ-JavaScriptを含めるだけで、すべてのデバイスとすべてのブラウザで作業が完了します。

そのようなサービスの1つがGumletです。また、その場で画像のサイズを変更できるnginxプラグインなどのオープンソースの代替手段を試すこともできます。

(私はGumletで働いています。)

于 2017-12-08T21:57:11.067 に答える