いくつかの背景情報
ダウンロードしたいファイルは外部サーバーに1週間保存され、新しいXMLファイル(10〜50 mbの大きさ)が1時間ごとに異なる名前で作成されます。大きなファイルを、Webサイトがロードされるたびに、おそらく毎回0.5 MBずつ、バックグラウンドでチャンクごとにサーバーにダウンロードし、次に他の誰かがWebサイトをロードするときにダウンロードを再開したいと思います。これには、更新を維持するために1時間あたり少なくとも100ページのロードが必要になるため、可能であれば毎回ファイルを少し増やしてください。simpleXML、XMLreader、SAX解析を研究しましたが、どのような方法でも、ファイルを直接解析するには時間がかかりすぎるようです。そのため、上記のようにダウンロードするという別の方法が必要です。
30MBの大きなXMLファイルをダウンロードすると、XMLreaderを使用して3秒(25万回の反復)でローカルに解析できますが、外部サーバーから同じことを実行して50k回の反復に制限すると、15秒でその小さなファイルを読み取ることができます。一部なので、そのサーバーから直接解析することはできないようです。
可能な解決策
cURLを使用するのが最善だと思います。しかし、繰り返しになりますが、おそらくfopen()、fsockopen()、copy()、またはfile_get_contents()がその方法です。これを実現するために使用する関数に関するアドバイス、または50MBの外部XMLファイルをmySQLデータベースに解析する方法に関するさまざまなソリューションを探しています。
1時間ごとのCronジョブが最善の解決策だと思いますが、それがWebホスティング会社によってどれほどうまくサポートされるかはわかりません。また、そのようなことを行う方法もわかりません。しかし、それが最善の解決策であり、大多数がそう考えている場合、私もその分野で研究を行う必要があります。
バックグラウンドで実行されているjavaアプレット/javascriptがより良い解決策である場合は、そこでの関数/メソッド/ライブラリに関しても正しい方向を示してください。
概要
- バックグラウンドでファイルの一部をダウンロードし、Webサイトが読み込まれるたびに、完了するまでダウンロードを再開するための最良の解決策は何ですか?
- 上記の解決策を試してみるのがモロニックだとしたら、同じことを達成するためにどの言語/ソフトウェアを使用しますか(1時間ごとに大きなファイルをダウンロードします)?
すべての回答を事前に感謝し、長い話/質問をお詫びします。
編集:私はこのソリューションを使用して、phpスクリプトをスケジュールするcronジョブでファイルを取得することになりました。フォルダーで既に持っているファイルをチェックし、過去4日間にダウンロード可能なファイルのリストを生成してから、次のXMLファイルを順番にダウンロードします。
<?php
$date = new DateTime();
$current_time = $date->getTimestamp();
$four_days_ago = $current_time-345600;
echo 'Downloading: '."\n";
for ($i=$four_days_ago; $i<=$current_time; ) {
$date->setTimestamp($i);
if($date->format('H') !== '00') {
$temp_filename = $date->format('Y_m_d_H') ."_full.xml";
if(!glob($temp_filename)) {
$temp_url = 'http://www.external-site-example.com/'.$date->format('Y/m/d/H') .".xml";
echo $temp_filename.' --- '.$temp_url.'<br>'."\n";
break; // with a break here, this loop will only return the next file you should download
}
}
$i += 3600;
}
set_time_limit(300);
$Start = getTime();
$objInputStream = fopen($temp_url, "rb");
$objTempStream = fopen($temp_filename, "w+b");
stream_copy_to_stream($objInputStream, $objTempStream, (1024*200000));
$End = getTime();
echo '<br>It took '.number_format(($End - $Start),2).' secs to download "'.$temp_filename.'".';
function getTime() {
$a = explode (' ',microtime());
return(double) $a[0] + $a[1];
}
?>
edit2:私が尋ねたことを実行する方法があることをお知らせしたかったのですが、私の場合はそれだけでは機能しません。私が必要とするデータの量を考えると、Webサイトが正しく機能するには、1時間に400人以上の訪問者が必要になります。ただし、データ量が少ない場合は、いくつかのオプションがあります。http://www.google.no/search?q=poormanscron