2009-08-17 13 views
2

私はそれは意志 それは、MySQLからのDB「2/12分の34/thepicture.jpg」をこのように指定された値になります私は、スクリプトこのPHPコードを改善するにはどうすればよいですか?

で写真のサムネイル画像のパスを得るのを助ける、それ以下のPHPコードを持っていますその後、私は、私は任意の助けて下さい50とページ上も

に開いていますこれを行うのより良い性能の方法があると確信しています。この「2/12分の34/thepicture_thumb1.jpg」

にそれを回しますユーザーはこれを50回実行して50種類の写真を取得します

// the photo has it is pulled from the DB, it has the folders and filename as 1 
$photo_url = '2/34/12/thepicture_thumb1.jpg'; 
//build the full photo filepath 
$file = $site_path. 'images/userphoto/' . $photo_url; 
// make sure file name is not empty and the file exist 
if ($photo_url != '' && file_exists($file)) { 
    //get file info 
    $fil_ext1 = pathinfo($file); 
    $fil_ext = $fil_ext1['extension']; 
    $fil_explode = '.' . $fil_ext; 
    $arr = explode($fil_explode, $photo_url); 
    // add "_thumb" or else "_thumb1" inbetween 
    // the file name and the file extension 2/45/12/photo.jpg becomes 2/45/12/photo_thumb1.jpg 
    $pic1 = $arr[0] . "_thumb" . $fil_explode; 
    //make sure the thumbnail image exist 
    if (file_exists("images/userphoto/" . $pic1)) { 
     //retunr the thumbnail image url 
     $img_name = $pic1; 
    } 
} 

私は、ファイル拡張子を取得するためにpathinfo()をどのように使用しているのか不思議です。この拡張子は常に3桁であるため、この値をより良いパフォーマンスにする方法はありますか?

+0

なぜ3桁の内線番号ですか? "thepicture.jpeg"はどうですか?それはしばしば使われていませんが、それでもまだ... –

+0

ええと私はその後のことについて考えましたが、100,000人以上のユーザーが自分のサイトに投稿した画像を見たことはありませんでした。 – JasonDavis

+2

ファイル名に複数のドットを付けることが有効であることを忘れないでください。 'myLogo.24bit.png'、' myLogo.bw.png'などのファイル名を付けます - このコードは最初のドット( '$ arr [0]')の前にあるファイル名だけを考慮するので、私のファイルは'myLogo.png' – nickf

答えて

6

性能面からのフィードバックを組み込むことを更新しました

あなたは舞台裏でコンパイルされたコードを実行しているため、パフォーマンスが優れて機能します。

もちろん、これらの機能をすべて呼び出す必要はありませんが、良い考えではありません。あなたの場合、pathinfo関数は必要なさまざまなパスを返します。あなたがPHP 5をお持ちでない場合は

$fInfo = pathinfo($file); 
$thumb_name = $fInfo['dirname'] . '/' . $fInfo['filename'] . '_thumb' . $fInfo['extension']; 

:あなたはこの(ノート、「ファイル名」はPHP 5.2以降のみ利用可能です)のようなファイル名を構築することができますときには、元の名前にexplode関数を呼び出します。2は、その後、最も簡単な方法は、その機能を無視してstrrpossubstrを使用することです:

// gets the position of the last dot 
$lastDot = strrpos($file, '.'); 
// first bit gets everything before the dot, 
// second gets everything from the dot onwards 
$thumbName = substr($file, 0, $lastDot) . '_thumb1' . substr($file, $lastDot); 
+0

ありがとう、結局私はデータベースの2つのフィールド、フォルダのパスとイメージの名前を別々に保存し、次に、手のひらの部分を追加して、私は50枚の写真を持つページで最高のパーフォレーションになると思います。 – JasonDavis

-2

$img_name = preg_replace ('/^(.*)(\..*?)$/', '\1_thumb\2', $file);

編集:BBコードは\で姿を消しました。

+2

に変わりましたが、これは2行のコードを1つにまとめて、正規表現を単純なものとして使用するのは良い考えではありません。 – Josiah

+0

...プラスあなたはドットがありません – nickf

+1

今多くの問題があります;)真剣に、正規表現は不要で、この問題には複雑すぎます。 – DisgruntledGoat

0

なぜこの機能のパフォーマンスについて懸念していますか? (「メイン」ファイル名が生成されたときに)一度だけコールし、結果を格納すると仮定すると、ランタイムはDBやファイルシステムのアクセスに比べて本質的にゼロになるはずです。サムネイルパスを再計算するたびに呼び出す場合は、無駄ですが、ランタイムに大きな影響を及ぼすことはありません。

これで、見た目が良くなり、メンテナンス性が向上したければ、それは価値ある目標です。

+0

はい、これは非常に非効率的なコードであっても、おそらく彼のシステムでは大きなボトルネックにはならないでしょうが、*より効率的なコードを書いたければ何も問題はありません! !* – nickf

+0

@nickfより良いコードを書くのに間違ったことは何もありませんが、大きな図では、* this *コードの効率を改善することは、全体的な品質と効率を大幅に変えることはまずありません。システム全体のコード一般的な口語慣習を借りる:あなたのデッキの椅子がきれいに整えられることは間違いありませんが、タイタニックのデッキチェアを並べ替えることは役に立たないだけでなく、逆効果です。 – Imagist

+0

@nickf(続き)このコードが判りにくい混乱であることを考えれば、そのパフォーマンスは比較上の小さな懸念事項です(プロファイリングに別途記載がない限り)。 – Imagist

7

このコードにはパフォーマンスの問題がありますか、早すぎるものを最適化していますか?パフォーマンスが十分に悪くてユーザビリティの問題にならない限り、プロファイラはこのコードが責任を負うことを示していますが、このコードではさらに大きな問題があります。

「このPHPコードを改善するにはどうすればよいですか? 空白を追加します。

2

このコードのための最良の最適化は、それは読みやすさだ高めることである。

// make sure file name is not empty and the file exist 
if ($photo_url != '' && file_exists($file)) { 

    // Get information about the file path 
    $path_info = pathinfo($file); 

    // determine the thumbnail name 
    // add "_thumb" or else "_thumb1" inbetween 
    // the file name and the file extension 2/45/12/photo.jpg 
    // becomes 2/45/12/photo_thumb.jpg 
    $pic1 = "{$path_info['dirname']}/{$path_info['basename']}_thumb.{$fil_ext}"; 

    // if this calculated thumbnail file exists, use it in place of 
    // the image name 
    if (file_exists("images/userphoto/" . $pic1)) { 
     $img_name = $pic1; 
    } 
} 

私は改行を使用して機能のコンポーネントを解体し、決定するプロセスを簡素化するためにpathinfo()から返された情報を使用していましたサムネイル名あなたは組み込みのPHP呼び出している場合、@DisgruntledGoat

+0

pathinfo関数は 'dirname'と' basename'から得た変数を返します。また、私が知る限り、_thumb1を追加していません。 – DisgruntledGoat

+0

拡張読みやすさは最適化ではありません。フィードバックのための@DisgruntledGoatへ – slypete

+0

おかげで、あなたの権利と私は答えに応じて @slypeteを変更した - 私は同意できない、実際には限りコストなどのメンテナンスが最も重要な要因の一つであり、短い時間で強化さ読みやすさの結果が必要となります管理者がコードを理解できるようにする。 – Josiah

0

この問題を解決する最も簡単な方法は、手の前に、すべてのユーザープロファイルの写真をサムネイルとあなたがリサイズ保持しませんので、周りにそれを維持することです。

+0

サムネイルのサイズがいくつか保存されている場合、この関数は必要なサイズを取得します – JasonDavis