2012-02-20 11 views
1

元の問題は、業界標準のJavaベースのWebアプリケーション・アプリケーションをWebSphere App Server上で年間約1億回訪問して実行することです。問題は、これらのアプリケーションサーバーを再起動した後で、メインサーブレットが公開される前にメインサーブレットがコンパイルされるように、いくつかのキーページをヒットする必要があります。それ以外の場合は、最初のクラッシュでクラッシュする傾向があります。fsockopenを使用してキーJSPページをプリコンパイルする

いくつかのクラスタでは、35以上の市場ごとに1回、ヒットする必要がある約6ページ.... 200 ish url's!

私が取り組んでいるスクリプトは、これらすべてのURLをまとめて、最後にすべて200個のURLのリストを配列にしています...今、それらをヒットする方法は?

私たちはこれ以前にCGIを使用していましたが、その主な問題は同期的なことでした... loooooong時間を取ることです。今、私は非同期の方法でJQueryから呼び出すことができる単一のURLにヒットするシンプルなurl.phpを作成しようとしています。私は当初はすべての200をヒットしたくはないでしょう、おそらく5のバッチで500%のスピードの増加を意味する必要があります:)

だからurl.phpに。私は過去に多くのPHPを使用していないので、ソケットは私には少し新しいです。 URLは、単にsomeserver.somedomain.comですが、ウリは端にタップであれば、それが失敗した場合に素晴らしい作品

function checkUrl($url,$port) { 
set_time_limit(20); 
ob_start(); 
header("Content-Type: text/plain"); 
$u = $url; 
$p = $port; 

$post = "HEAD/HTTP/1.1\r\n"; 
$post .= "Host: $u\r\n"; 
$post .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2\r\n"; 
$post .= "Keep-Alive: 200\r\n"; 
$post .= "Connection: keep-alive\r\n\r\n"; 

$sock = fsockopen($u, $p, $errno, $errstr, 10); 
if (!$sock) { 
    echo "$errstr ($errno)<br />\n"; 
} else { 
    fwrite($sock, $post, strlen($post)); 
    while (!feof($sock)){ 
     echo fgets($sock); 
    } 
    ob_end_flush(); 
    } 
} 

(例えばsomeserver.somedomain.com/:私はこれまで一緒に石畳していることはこれですgb/en)

私が理解しているように、これまでのコードで行ったことは、ソケット接続を開いていることです...しかし、どうすればパスを別々に解析できますか?

最終的にこれから必要な出力はHTTPステータスコード(200,404,301など)ですが、正しくコンパイルするためには完全なページを最初に取得することが重要です。

+0

は思わコードの今うまく働いているとさえ私はいくつかの他のロジックを区切ってできるようになります...しかし、今私が持っていることは、このある: 機能checkUrl($ホスト、$のURL、$ポート){ \t $ FP = fsockopenの($ host、$ port、$ errno、$ errstr、10); \t if(!$ fp){ \t echo "$ errstr($ errno)
\ n"; \t} else { \t $ out = "GET $ url HTTP/1.1 \ r \ n"; \t $ out。= "ホスト:$ホスト\ r \ n"; \t $ out。= "接続:閉じる\ r \ n \ r \ n"; \t fwrite($ fp、$ out); \t while(!feof($ fp)){ \t echo fgets($ fp、128); \t} \t FCLOSE($ FP)。より複雑なリンクの一部でさえも素晴らしい作品 \t}} – Seer

+0

。全体をエコーすることで、完全なコンテンツと応答ヘッダーが得られることがわかります。その点では完璧です。今、私は、誰もが気軽その例を追加したい場合ので、実際のステータスコードを返すようにしたい。.. :) – Seer

答えて

1

多分私は何かが不足していますが、curl extensionがありますか?この組み合わせでjQueryを取得する必要はなく、簡単にPHPから非同期クエリを直接実行できます。また、バッチサイズを簡単に制御し、必要に応じて遅延や無駄をなくすこともできます。また、なぜJSPページをヒットするためにrawソケットを使用する必要があるのか​​よく分かりません。うまくいけば、あなたの人生は楽になります!ここで

は、私は確信しているphp.netからのコードに基づいて、私は簡単なテストスクリプトです:SOのみ、私はより良いチャンクを見つけ提出:) 後の良好な関連質問を示しよう

<?php 
// create both cURL resources 
$ch1 = curl_init(); 
$ch2 = curl_init(); 

// set URL and other appropriate options 
curl_setopt($ch1, CURLOPT_URL, "http://news.php.net/php.general/255000"); 
curl_setopt($ch1, CURLOPT_HEADER, 0); 
curl_setopt($ch2, CURLOPT_URL, "http://news.php.net/php.general/255001"); 
curl_setopt($ch2, CURLOPT_HEADER, 0); 

//create the multiple cURL handle 
$mh = curl_multi_init(); 

//add the two handles 
curl_multi_add_handle($mh,$ch1); 
curl_multi_add_handle($mh,$ch2); 

$active = null; 
//execute the handles 
do { 
    $mrc = curl_multi_exec($mh, $active); 
} while ($mrc == CURLM_CALL_MULTI_PERFORM); 

while ($active && $mrc == CURLM_OK) { 
    if (curl_multi_select($mh) != -1) { 
     do { 
      $mrc = curl_multi_exec($mh, $active); 
     } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
    } 
} 

//close the handles 
curl_multi_remove_handle($mh, $ch1); 
curl_multi_remove_handle($mh, $ch2); 
curl_multi_close($mh); 
?> 
+0

実際、CURLがあまりにも最良の選択肢と私の次のプロジェクトのために非常に有用であることが終わった:) – Seer

+0

あなたはそれが好きうれしいです。一般的に、 'fsockopen'や' file_get_contents'などは、実装するのが一番早く、開発の迅速さというPHPの評判に貢献します。ストリームコンテクストとラッパーで微調整することはできますが、これらのオプションは、カールを直接使用するだけのやや痛い代替方法です。あなたの次のプロジェクトでハッピーハンティング! – quickshiftin

関連する問題