6

多くの人のように、私は画像のサムネイル表示を行う PHP スクリプトを作成しています。スクリプトは WOMM (works on my machine) 認定を取得していますが、ホスト (1&1 Basic) に移動すると、特定のファイルサイズを超える画像を処理できないという問題があります。潜在的なPOST問題ではないことを確認するために、すべての操作をファイルシステムに移動しました。関連するコードは次のとおりです。


function cropAndResizeImage( $imageLocation )
{
  //
  // Just to be certain
  //
  ini_set('display_errors','on');
  error_reporting(E_ALL);
  ini_set('memory_limit','128M'); 
  ini_set('max_execution_time','300');  

  $image_info   = getimagesize($imageLocation);
  $image_width  = $image_info[0];
  $image_height = $image_info[1];
  $image_type   = $image_info[2];

  switch ( $image_type )
  {
    // snip...
    case IMAGETYPE_JPEG:
      $image = imagecreatefromjpeg($imageLocation);
      break;

    default:
      break;
  }

  // snip...
}

私の神秘的なprintlnデバッグ能力を使って、それimagecreatefromjpegが戻ってこないことを確認できました。実際、スクリプトは、到達すると完全に停止します。いくつかの事実:

  • これはファイルサイズに相関しています。1MB 未満の画像は問題ないように見えます (スポット チェック済み) が、3MB 前後の画像はバーフです。ただし、正確なカットオフが何であるかはわかりません。
  • これはサーバーのタイムアウトによるものではありません。wget3MB の画像では 1 秒未満で返されますが、「適切に小さい」画像では大幅に長くなります (大きな画像は処理されないことを示します)。
  • @エラーを抑制するために関数呼び出しの前に付けても効果はありません。これは、スクリプトがエラーをスローしていないという事実とよく一致します。この関数呼び出しで単に黙って終了しているだけです。

推測する必要がある場合は、1&1 のサーバーで入力ファイルのサイズを制限する、私が知らない (またはアクセスできる) GD パラメーターがある可能性があります。構成変数の推測は、それがすぐに barfs し、画像の実際の読み込みや計算を (ヒューリスティックに) 行うようには見えません。

助言がありますか?助けてくれてありがとう。

更新 (礼儀@Darryl のコメント):phpinfo PHP が変数max_execution_timememory_limit変数を正しく更新していることを示すための呼び出し。これは、これらのリソースが割り当てられていることを必ずしも意味するものではなく、単に期待どおりに機能しているように見えることを意味します。

更新 2: The Google からの参考文献に従って、JPEG の最適化 (品質を 3MB から 200KB に下げた) を試みましたが、うまくいきませんでした。画像ファイルサイズの問題ではありません。次に、元の 3888x2592 画像のピクセル数を減らしてみましたが、最初に成功したサイズは 1400x2592 です (1401x と 1402x はどちらも半解析になり、「不正な形式の JPEG」を示すエラーが発生します。ロードされていません)。さらに 1300x2592 に縮小することで、実際に探している 400x300 のサムネイル画像をインスタンス化できます。1400x2592 で、imagecreatetruecolorそのタスクを処理するために使用している呼び出しは、 と同じようにサイレントに失敗しますimagecreatefromjpeg

これがなぜなのか、ちょっとわかりません。1400 * 2592 == 3.5MB 特に意味はありませんが、これは GD + PHP が処理するピクセル数の制限であると想像する必要があります。

4

2 に答える 2

2

PHP Web サイトのメモリ使用量に関するこの注を参照してください。

*"imagecreatefromjpeg() を使用して画像をロードするために必要なメモリは、画像のサイズと画像のビット深度にオーバーヘッドを掛けた関数です。

次の式から計算できます。

バイト数 = 幅 * 高さ * ピクセルあたりのバイト数 * オーバーヘッド ファッジ係数"*

于 2009-03-21T05:41:05.407 に答える
1

1&1 ではスクリプトmemory_limitやを変更できないmax_execution_timeので、おそらくメモリが不足していると思います。phpinfo()制限が何であるかを確認するために実行してみましたか?

于 2009-03-21T05:16:47.523 に答える