2012-05-24 13 views
6

मैं PHP ssh2 लाइब्रेरी का उपयोग कर रहा हूँ, और बस कर रही:पीएचपी ssh2_connect() को लागू करें एक समय समाप्ति

$ssh = ssh2_connect($hostname, $port); 

समस्या यह है कि मैं एक समय समाप्ति है, यानी सेट करना चाहते हैं 5 सेकंड के बाद जुड़ने की कोशिश कर बंद। जहां तक ​​मैं ssh2 लाइब्रेरी बता सकता हूं, मूल रूप से कनेक्ट होने पर टाइमआउट का समर्थन नहीं करता है। मैं टाइमआउट रैपर कैसे कार्यान्वित कर सकता हूं?

+0

क्या आपने कभी यह पता लगाया है कि यह कैसे करें? – solefald

उत्तर

0

libssh2 लाइब्रेरी कनेक्ट() स्वयं नहीं करता है इसलिए इसे इसके लिए टाइमआउट प्रदान नहीं करना पड़ता है। libssh2 हालांकि कार्यों के लिए टाइमआउट प्रदान करता है प्रदान करता है ...

2

मैं थोड़ी देर के लिए एक ही समस्या के साथ संघर्ष कर रहा हूं। तथ्य यह है कि ssh2 के साथ "मृत" या उत्तरदायी सर्वर से कनेक्ट करने का प्रयास आपके सर्वर को तब तक रोक देगा जब तक कि लक्ष्य सर्वर की अधिकतम कनेक्शन समय सीमा न हो।

 

पहले से पता लगाने के लिए अगर आपके उदाहरण आप मुसीबत जब श्श्श-इंग में यह पिंग करने (देखें अगर यह उत्तरदायी है) है पैदा करने के लिए जा रहा है आसान तरीका है।

function getPing($addr) 
{ 
    //First try a direct ping 
    $exec = exec("ping -c 3 -s 64 -t 64 ".$addr); 
    $array = explode("/", end(explode("=", $exec))); 
    if(isset($pingVal[1])) 
    { 
     //There was a succesful ping response. 
     $pingVal = ceil($array[1]); 
    } 
    else 
    { 
     //A ping could not be sent, maybe the server is blocking them, we'll try a generic request. 
     $pingVal = callTarget($addr); 
    } 


    echo intval($pingVal)."ms"; 
    if($pingVal > ["threshold"]) 
    { 
     return false; 
    } 
    return true; 
} 

function callTarget($target) 
{ 
    $before = microtime(); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $target); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 
    if (curl_exec($ch)) 
    { 
     curl_close($ch); 
     return (microtime()-$before)*1000; 
    } 
    else 
    { 
     curl_close($ch); 
     return 9999; 
    } 
} 

इस विधि अगर आपको अपने सर्वर की स्थिति पर एक तेजी से प्रतिक्रिया प्राप्त करने के लिए तो तुम्हें पता है, तो आप के बारे में अपने समय में ssh-इंग बर्बाद करने के लिए कर रहे हैं अनुमति देता है।

+0

मुझे सरल पिंग विचार वास्तव में उपयोगी पाया गया, मेरे कस्टम अपवादों को फेंकने से पहले 30 सेकंड टाइमआउट बचाता है। धन्यवाद! – Jimbo

1

मुझे पता है कि यह एक पुराना धागा है, लेकिन समस्या अभी भी वहां है। तो, इसके लिए यहां समाधान है।

ssh2_connect()socket_connect() का उपयोग करता है। socket_connect php आरं विन्यास पैरामीटर default_socket_timeout जो 60 सेकंड (http://php.net/manual/en/filesystem.configuration.php#ini.default-socket-timeout)

तो, करने के लिए सेट किया जाता है पर निर्भर करता है हमारे समस्या को हल करने का सबसे आसान तरीका है एक मूल्य हम चाहते हैं कि रनटाइम पर आरं सेटिंग बदलने के लिए, और से वापस आईएनआई फ़ाइल में मान सेट करने के लिए, इसलिए हम अपने सॉफ़्टवेयर के अन्य हिस्सों को प्रभावित करने से बचते हैं। नीचे दिए गए उदाहरण में, नए मान 2 सेकंड पर सेट हैं।

$originalConnectionTimeout = ini_get('default_socket_timeout'); 
    ini_set('default_socket_timeout', 2); 

    $connection = ssh2_connect('1.1.1.1'); 

    ini_set('default_socket_timeout', $originalConnectionTimeout); 

आप कैसे php के लिए SSH2 libssh2 के स्रोत कोड (https://github.com/libssh2/libssh2) को पढ़ कर काम करता है के बारे में अधिक जानकारी प्राप्त कर सकते।