2014-10-09 99 views
1

我需要找到一種方法來檢測網站(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

你可以在curl_exec後面使用'curl_error($ curl)'來查看是否發生錯誤。 – Asenar 2014-10-10 00:03:30

+0

@Asenar我已經將日誌記錄到代碼中,並且我正在等待該網站停止運行。你有沒有看到任何網站沒有響應,curl_exec返回false? – kenpeter 2014-10-10 00:19:31

回答

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),那麼遠端也許可以活考慮。

+0

我爲我的問題重寫了 – kenpeter 2014-10-10 01:12:49

+0

沒有。你現在完全不同的問題 – 2014-10-10 01:27:03

+0

對不起,我甚至都不明白我在問什麼。 – kenpeter 2014-10-10 01:39:59

1

是的,如果一段時間的網站犯規響應(在CURLOPT_CONNECTIONTIMEOUT集),它會觸發一個錯誤,並且curl_exec()將返回false,事實上,它可以在任何其他錯誤返回false要麼,所以你的代碼不會actualy告訴我們,如果該網站是否關閉。

+0

我重新回答了我的問題。 – kenpeter 2014-10-10 01:11:31