2017-10-11 3 views
0

私は現在、カールを使用して、ユーザーがページにアクセスするたびに約3000のイメージのファイルサイズを確認するスクリプトを持っています。これは、コンテンツが変更されるたびに発生するためです。PHPは何回もカールするよりも速く、リモートイメージファイルのサイズを約3000回確認しますか?

7442バイトのサイズと一致すると、イメージのパスが変更されます(変更されていない場合は、ソースが維持されます)。

イメージのURLは、$ variable、mysql、およびリモートxmlファイルとローカルxmlファイルの両方に保存されます。しかし、イメージ自身は常に遠隔に保管されています。

$image = 'http://remoteserver.com/user22.jpg'; 
//Check if all thumbs are ok real and available 
$ch = curl_init($image); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_HEADER, TRUE); 
curl_setopt($ch, CURLOPT_NOBODY, TRUE); 

$data = curl_exec($ch); 
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); 
curl_close($ch); 
if($size == 7442){ 
    echo '<img src="https://www.newdomain.com/tmp.jpg" height="190.11"/></a>'; 
} else { 
    echo '<img src="' . $image . '" alt="' . $user . '" /></a>'; 
} 

有効にすると、読み込みに約40秒かかります。コメントアウトすると3秒かかります。しかし、ユーザーがウェブページにアクセスするたびに実行されます。または、mysqlにデータを追加してmysqlのアドレスを変更する前にカールを実行すると、その情報をmysqlにロードして、すべてのイメージを表示しないようになります。

私は、このチェック、両方のサーバーの応答時間、PHPの設定などによって、たくさんあることを知っています。しかし、私は本当にこの画像ファイルのチェックが必要で、40秒の読み込み時間ユーザーがページにアクセスするたびに

どのようなご提案ですか?

+3

ウェブリクエストの一部ではなく、バックグラウンドプロセスとして実行してください。 –

+1

イメージURLリロードのコレクションを格納するためにmemcacheなどを使用できます。スケジュールされたバックグラウンドサービス(PHPスクリプト)は定期的に実行され、ファイルサイズを確認し、再ルーティングされたURLをmemcacheに追加することができます。 memcacheを検索し、見つかった場合はキーを返し、そうでない場合は元のURLを返す関数のイメージURLを取得します。 – jcorry

+0

Mark Ba​​kerとJcorryありがとうございました。オリジナルのURLは実際にはmysqlに格納されますが、URLのみ、サイズ情報はありません。それはmemcacheの必要性を排除するだろうか? –

答えて

0

他の人がコメントで示唆しているように、私はファイルサイズをチェックし、ページリクエストとは別にmysqlを更新するバックグラウンドプロセスを作成します。これは、複数のユーザーが同じ画像を要求した場合にはるかに効率的です。

しかし、実際にページの読み込みを行う必要がある場合は、ブラウザからチェックするのがユーザーエクスペリエンス向上のための別のオプションです。保存されたイメージパスをページにロードし、JSを使用してファイルサイズを要求し、必要に応じてイメージパスを変更します。例えば。

var images = document.getElementsByTagName('img'); 
for(var i = 0; i < images.length; i++) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("HEAD", images[i].src, true); 
    xhr.onreadystatechange = function() { 
     if (this.readyState == this.DONE) { 
      if (parseInt(xhr.getResponseHeader("Content-Length"))) === 7442) { 
       images[i].src = 'https://www...'; // New path 
      } 
     } 
    }; 
    xhr.send(); 
} 

(未テストが、あなたのアイデアを得る。another SO answerから適応。)

それがすべて完了だときに、あなたが必要な場合、MySQLを更新するには、Webアプリケーションに1 AJAX POSTを行うことができます。また、イメージをホストするサーバーに多数の同時要求を出そうと試みるので、パフォーマンスに影響を与える可能性があることにも注意してください。

+0

マットありがとう、私はJavascript/Ajaxで試してみましょう。なぜならカールするとすべてがストールしているように見えます。それは最良の選択肢かもしれません。何かa.s.a.p. –

関連する問題