我需要找到一种方法来检测网站(joseki终点)是否过载。 http://128.250.202.125:7001/joseki/oracle
始终处于启动状态,但是当我提交查询时,有时候它是空闲的。 (即超载,而不是下降)
到目前为止,我的方法是使用curl模拟表单提交。如果curl_exec返回false,我知道网站超载。
主要问题是我不确定网站重载是否会触发'FALSE return'。 我可以使用此method记录curl_exec的回报,但这会导致网站停止运行。
<?php
$is_run = true;
if($is_run) {
$url = "http://128.250.202.125:7001/joseki/oracle";
$the_query = "
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX fn: <http://www.w3.org/2005/xpath-functions#>
PREFIX ouext: <http://oracle.com/semtech/jena-adaptor/ext/user-def-function#>
PREFIX oext: <http://oracle.com/semtech/jena-adaptor/ext/function#>
PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#timeout=100,qid=123>
SELECT ?sc ?c
WHERE
{ ?sc rdfs:subClassOf ?c}
";
// Simulate form submission.
$postdata = http_build_query(array('query' => $the_query));
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$tmp_condi = curl_exec($curl);
// After I submit a simulated form submission, and http://128.250.202.125:7001/joseki/oracle is
// not responding (i.g. idling), does it definitely returns FALSE????
if($tmp_condi === FALSE) {
die('not responding');
}
else {
}
curl_close($curl);
}
解决方案
能够通过添加以下内容来解决它:Setting Curl's Timeout in PHP
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,0);
curl_setopt($ch, CURLOPT_TIMEOUT, 400); //timeout in seconds
答案 0 :(得分:1)
我需要找到一种方法来检测网站是否有响应。 到目前为止,我的方法是使用curl模拟表单提交。
我宁愿做HTTP HEAD请求(see docs)并检查返回码。您不需要返回任何数据,因此无需发送POST请求或获取响应。我还设置了缩短请求的超时时间:
$ch = curl_init();
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD');
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$content = curl_exec($ch);
curl_close($ch);
如果$http_status
是200(OK),那么远程终端也许可以被认为是实时的。
答案 1 :(得分:1)
是的,如果网站在一段时间内没有回复(在CURLOPT_CONNECTIONTIMEOUT
中设置),则会触发错误,curl_exec()
会返回false
,实际上它会返回false
在任何其他错误上,所以你的代码不会实际告诉网站是否关闭。