2012-02-20 36 views
1

所以最初的问题是我们在WebSphere App Servers上运行一个“行业标准”基于java的web应用程序应用程序,每年访问量约为1亿次。问题出现在重新启动这些appservers之后,我们需要点击几个关键页面,以便在我们让公众看到它们之前,主要的servlet被编译,否则它们往往会在最初的粉碎中崩溃。使用fsockopen预编译关键jsp页面

在某些集群,它共有6页需要被击中,每进行一次35+市场.... 200 ISH网址!

因此,我正在处理的脚本已经完成了所有这些URL的拼凑工作,并且在所有这些URL的结尾处都列出了200个url的数组...现在如何击中它们?

我们使用CGI这个早些时候,它的主要问题是就是是同步的......采取loooooong时间。现在我正在尝试创建一个简单的url.php,它将打开一个单独的URL,然后我可以通过异步方式从JQuery调用该URL。我不想全部命中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但如果是一个开放的拍了拍最终失败了伟大的工程(如someserver.somedomain.com/ GB/EN)

据我了解,凡是我的代码迄今所做的是开放套接字连接...但我怎么才能得到它单独解析路径?

我最终需要的唯一输出是HTTP状态代码(200,404,301等),但重要的是它首先获取整个页面才能正确编译。

+0

似乎像这样只显示后好相关问题提交:) 我发现了一个更好的块代码现在工作很好,甚至可以让我分开一些其他的逻辑......但现在我所拥有的是: 函数checkUrl($ host,$ url,$ port){ \t $ fp = fsockopen ($ host,$ port,$ errno,$ errstr,10); \t if(!$ fp){“errstr($ errno)
\ n”;回显“$ errstr($ errno)
”; \t}否则{ \t $出= “GET $网址HTTP/1.1 \ r \ n” 个; \t $ out。=“主机:$主机\ r \ n”; \t $ out。=“连接:关闭\ r \ n \ r \ n”; \t fwrite($ fp,$ out); (!)feof($ fp)){ \t echo fgets($ fp,128); \t} \t fclose($ fp); \t} } – Seer 2012-02-20 10:03:46

+0

即使对于一些更复杂的链接,它也可以很好地工作。通过回应整个事情,我可以看到我获得了完整的内容以及响应标题,因此它在这方面非常完美。现在我只想返回实际的状态码,所以如果有人想添加这个例子,感觉自由.. :) – Seer 2012-02-20 10:04:00

回答

1

也许我失去了一些东西,但你有没有curl extension可用?无需在混合中使用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); 
?> 
+0

事实上,CURL最终成为最好的选择,对我的下一个项目也非常有用:) – Seer 2012-03-02 15:17:45

+0

很高兴你喜欢它。一般而言,'fsockopen'&'file_get_contents'等将始终是最快实施并有助于PHP快速开发的声誉。尽管可以使用流上下文和包装器来调整它们,但这些选项对于直接使用curl来说是一种有点痛苦的选择。在你的下一个项目上快乐狩猎 – quickshiftin 2012-03-02 20:07:12