Ana bilgisayar PHP ile çevrimiçi olup olmadığını kontrol edin?

4 Cevap php

Benim Internet bağlantısı ile bazı sorunlar sahip oldum ve ben ana bilgisayar internete bağlı olup olmadığını kontrol etmek için en hızlı, hata daha az ve en güvenilir yolu nedir merak ediyorum.

Ben ne zaman online ve yanlış olmadığı zaman true döndürür is_online() gibi bir şey arıyorum.

4 Cevap

Ben bazı çözümler benchmarked ettik: file_get_contents HEAD isteği ile, gethostbynamel, checkdnsrr ve aşağıdaki çözüm tüm diğerlerinden daha fazla 100 hızlı gibi görünüyor:

function is_online()
{
    return (checkdnsrr('google.com', 'ANY') && checkdnsrr('yahoo.com', 'ANY') && checkdnsrr('microsoft.com', 'ANY'));
}

file_get_contents, örneğin her bir konak başına birden fazla saniye sürerken, her ana başına bir mikrosaniye sürer (çevrimdışı).

Sen yukarı Muhtemelen (örn. Google) bir ana bilgisayara ping göndermek olabilir.

Orada yerleşik bunun için hiçbir PHP gibi görünüyor, bu yüzden komutları kabuk başvurmak gerekiyor. ping * nix dönüş değeri bir cevap aldı olmadığını söyleyebilirim.

Update: ping -c1 -q -w1 Linux üzerinde doğru komut olmalıdır. Bu cevap, aksi takdirde başka bir şey almış olsaydı size çıkış kodu 0 vermek ve zaman aşımına bir saniye sonra olacaktır.

Böyle dolayısıyla, bir şey (uyarı, benim PHP Paslı) hile yapmak gerekir:

function is_online() {
    $retval = 0;
    system("ping -c1 -q -w1", $retval);
    return $retval == 0;
}

Neden HTTP GET (veya daha iyisi HTTP HEAD hız için) popüler web sitelerinde istekleri bir dizi yapmıyoruz? majority voting cevap karar kullanın.

Sen sometimes (PHP bir sistem çağrısı aracılığıyla) çok ping güvenmek değil, tüm web siteleri ICMP (ping) isteklerine yanıt dikkat edebilirsiniz.

Note, bir sonuca varmadan önce yapmak istediğinde ping / http sayısını artırarak can't kötü serbest hata olabilir confidence level cevap ama yardımcı olduğunu Olguların.

Bu sunucu ICMP isteklerine yanıt olacağını varsayar unutmayın. O zaman ben katılıyorum durum buysa, Net_Ping muhtemelen gitmek için yoludur. Çalıştırdığınız hizmetleri ne bağlı belki 7 port veya port 80 - biliyorsun bazı bağlantı noktasına bir bağlantı girişiminde, ayrıca armut, Net_Socket paketini kullanın ki başarısız bir yanıt alırsınız.