2010-11-28 5 views
0

WebサイトをチェックアウトするだけのPHP Webクローラーがあります。数日前に、AJAXを使用してクローラの進行状況をリアルタイムで表示することを決めました。 PHPスクリプトはJSONでファイルに書き込み、AJAXは小さなファイルを読み込みます。AjaxとPHPスクリプトのクレイジーバッファー

PHPスクリプトをチェックしたところ、シンプルなAJAXスクリプトを完成させた後、私のブラウザに表示されるデータが奇妙な方向に上下に飛び跳ねてしまったため、何が起こっているのか不思議でした。

PHPスクリプトは完璧かつ非常に速く実行されましたが、私のAJAXは2秒ごとにゆっくりと値を増やしてからドロップします。数字はPHPで増加するだけで、下がることはありません。しかし、PHPが約1時間前に停止したにもかかわらず、バッファが複数のセッションで作業しているか、更新中のものから読み込んでいるかのように、私のWebページに表示されている数字が上下しています。

バッファやリセットボタンのようにわかりにくいものがありますか?

これは私が見せることができる最大のものです。私はちょうどそれを本当に長い時間前に叩きました。あなたが良いコードを知っているなら、共有してください。私は可能な助けが大好きです。しかし、私は新しくなっていますので、基本的な機能以外のことを説明してください。

AJAX

//open our json file 

ajaxRequest.onreadystatechange = function(){ 
if(ajaxRequest.readyState == 4){ 
    //display json file contents 
document.form.total_emails.value = ajaxRequest.responseText; 
} 
} 
ajaxRequest.open("GET", "test_results.php", true); 
ajaxRequest.send(null); 

PHP

//get addresses and links 
for($x=(int)0; $x<=$limit; $x++){ 
$input = get_link_contents($link_list[0]); 
array_shift($link_list); 
$link_list = ($x%100==0 || $x==5)?filter_urls($link_list,$blacklist):$link_list; 

//add the links to the link list and remove duplicates 
if(count($link_list) <= 1000) { 
    preg_match_all($link_reg, $input, $new_links); 
    $link_list = array_merge($link_list, $new_links); 
    $link_list = array_unique(array_flatten($link_list)); 
} 

//check the addresses against the blacklist before adding to a a file in JSON 
$res = preg_match_all($regex, $input, $matches); 
if ($res) { 
    foreach(array_unique($matches[0]) as $address) { 
    if(!strpos_arr($address,$blacklist)){ 
    $enum++; 
    json_file($results_file,$link_list[0],$enum,$x); 
    write_addresses_to_file($address, $address_file); 
    } 
    } 
} 

unset($input, $res, $efile); 
} 
+2

あなたのコードの適切な部分を投稿できますか? –

+1

明らかではありませんが、暗い示唆です。あなたはAjaxへのアクセスがあなたのPHPスクリプトを実行していないと確信していますか? –

答えて

0

症状が書き込み後にファイルを正しく閉じていないPHPスクリプトを示し、および/またはAJAXルーチンは、JSONデータをフェッチしている競合状態かもしれませんPHPのfopen()と新しいデータの間に書かれています。

可能な解決策は、PHPスクリプトが一時ファイルに書き込んだり、データが書き込まれた後にファイルが適切に閉じられた後に目的のファイル名に名前を変更することです。

はまた、ngrepのとtcpdumpのような4

ツールは、この種の問題をデバッグすることができますのResponse.Statusの== 200と同様にresponse.readyStateの==をチェックすることをお勧めします。

+0

私は状態== 200に設定して少し助けましたが、まだ多くの遅れがあります。 – Chenelle