Использование fsockopen для прекомпиляции ключевых страниц JSP - PullRequest
1 голос
/ 20 февраля 2012

Таким образом, первоначальная проблема заключается в том, что мы запускаем «веб-стандартное» приложение веб-приложения на Java на серверах приложений WebSphere с около 100 млн посещений в год. Проблема заключается в том, что после перезапуска этих серверов приложений нам нужно перейти на несколько ключевых страниц, чтобы основные сервлеты были скомпилированы до того, как мы выпустим на них публику ... в противном случае они имеют тенденцию аварийно завершать работу при первоначальном столкновении.

В некоторых кластерах требуется около 6 страниц, которые нужно посетить, по одному разу для каждого из 35+ рынков .... 200 URL-адресов ish!

Итак, скрипт, над которым я работаю, проделал всю тяжелую работу, связанную с тем, как собрать все эти URL-адреса, и в конце все это список из 200 URL-адресов в массиве ... теперь, как поразить их?

Мы использовали CGI для этого ранее, и его главная проблема была в том, что он был синхронным ... занимал много времени. Теперь я пытаюсь создать простой url.php, который будет отображать один URL-адрес, который я затем смогу вызвать из JQuery асинхронным способом. Конечно, сначала я не хочу бить все 200, вероятно, партиями по 5 должно быть увеличение скорости на 500%:)

Так что на url.php. Я не очень часто использовал php в прошлом, поэтому сокеты немного новы для меня. До сих пор я собирал это:

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();
    }
}

Что отлично работает, если URL-адрес просто someserver.somedomain.com, но если Uri-файл коснулся в конце, произойдет сбой (например, someserver.somedomain.com/gb/en)

Насколько я понимаю, все, что я до сих пор делал с кодом, - это открываю сокетное соединение ... но как я могу получить его для анализа пути отдельно?

Единственный вывод, который мне нужен от этого в конце, - это код состояния HTTP (200, 404, 301 и т. Д.), Хотя важно, чтобы он сначала извлекал всю страницу целиком для правильной ее компиляции.

1 Ответ

1 голос
/ 20 февраля 2012

Может быть, я что-то упустил, но у вас есть расширение curl ?Нет необходимости использовать jQuery, вы можете легко выполнять асинхронные запросы прямо из PHP.Вы также сможете легко контролировать размер партии, а также добавлять задержки и все, что вам нужно.Кроме того, я не уверен, почему вам нужно использовать необработанный сокет для просмотра страниц JSP, надеюсь, это облегчит вашу жизнь!

Вот мой быстрый тестовый скрипт, основанный на коде с php.net.Я уверен:

<?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);
?>
...