2009-08-06 34 views

Trả lời

34
function urlExists($url=NULL) 
{ 
    if($url == NULL) return false; 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 5); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $data = curl_exec($ch); 
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch); 
    if($httpcode>=200 && $httpcode<300){ 
     return true; 
    } else { 
     return false; 
    } 
} 

này được nắm lấy từ this post về cách kiểm tra nếu một địa chỉ URL tồn tại. Bởi vì Twitter nên cung cấp thông báo lỗi trên 300 khi nó đang được bảo trì, hoặc 404, điều này sẽ hoạt động hoàn hảo.

+0

nếu bạn cần SSL thì hãy xem xét bài đăng này https: // stackoverflow.com/questions/4372710/php-curl-https – eballo

19

Dưới đây là một:

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?lngWId=8&txtCodeId=1786

Một:

function ping($host, $port, $timeout) { 
    $tB = microtime(true); 
    $fP = fSockOpen($host, $port, $errno, $errstr, $timeout); 
    if (!$fP) { return "down"; } 
    $tA = microtime(true); 
    return round((($tA - $tB) * 1000), 0)." ms"; 
} 

//Echoing it will display the ping if the host is up, if not it'll say "down". 
echo ping("www.google.com", 80, 10); 
+8

không có giá trị trả lại tốt. tại sao không trả về 0/false/null về lỗi và một số nguyên biểu thị mili giây thành công? –

+2

@Philippe Gerber - Bởi vì tôi không viết nó, nhưng đó là những gợi ý tốt. – karim79

+4

Ping đang làm việc trên giao thức ICMP, không có thứ như 'cổng'. Bạn có thể ping một máy chủ với 0 cổng tcp mở. – deejayy

5

ping khả dụng trên hầu hết mọi hệ điều hành. Vì vậy, bạn có thể thực hiện cuộc gọi hệ thống và tìm nạp kết quả.

8

Sử dụng shell_exec:

<?php 
$output = shell_exec('ping -c1 google.com'); 
echo "<pre>$output</pre>"; 
?> 
+4

Bạn nên sử dụng 'ping -c1 host' hoặc một cái gì đó trên Linux. Plain 'ping host' sẽ không trả lại ở đó. – Michas

+0

tốt hơn: 'if (0! = ($ _result = \' ping -q -c1 google.com>/dev/null 2> &1 ; echo $? \ ')) { echo 'Fail.'; } ' – lucifurious

6

Một lựa chọn khác (nếu bạn cần/muốn ping thay vì gửi một yêu cầu HTTP) là Ping class for PHP. Tôi đã viết nó cho mục đích này, và nó cho phép bạn sử dụng một trong ba phương thức được hỗ trợ để ping một máy chủ (một số máy chủ/môi trường chỉ hỗ trợ một trong ba phương thức).

sử dụng Ví dụ:

require_once('Ping/Ping.php'); 
$host = 'www.example.com'; 
$ping = new Ping($host); 
$latency = $ping->ping(); 
if ($latency) { 
    print 'Latency is ' . $latency . ' ms'; 
} 
else { 
    print 'Host could not be reached.'; 
} 
0

Với chức năng sau bạn chỉ gửi các gói tin ICMP tinh khiết sử dụng socket_create. Tôi nhận được mã sau đây từ a user note ở đó. N.B. Bạn phải chạy như sau gốc.

Mặc dù bạn không thể đặt điều này trong trang web chuẩn, bạn có thể chạy nó dưới dạng công việc cron và điền vào một cơ sở dữ liệu với kết quả.

Vì vậy, nó phù hợp nhất nếu bạn cần theo dõi trang web.

function twitterIsUp() { 
    return ping('twitter.com'); 
} 

function ping ($host, $timeout = 1) { 
    /* ICMP ping packet with a pre-calculated checksum */ 
    $package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost"; 
    $socket = socket_create(AF_INET, SOCK_RAW, 1); 
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0)); 
    socket_connect($socket, $host, null); 

    $ts = microtime(true); 
    socket_send($socket, $package, strLen($package), 0); 
    if (socket_read($socket, 255)) {  
     $result = microtime(true) - $ts; 
    } else { 
     $result = false; 
    } 
    socket_close($socket); 

    return $result; 
} 
0

này là mã php tôi đã sử dụng, trả lời thường là như thế này:

 
    2 packets transmitted, 2 received, 0% packet loss, time 1089ms 

Vì vậy, tôi đã sử dụng mã như thế này:

 

    $ping_how_many = 2; 
    $ping_result = shell_exec('ping -c '.$ping_how_many.' bing.com'); 
    if(!preg_match('/'.$ping_how_many.' received/',$ping_result)){ 
     echo 'Bad ping result'. PHP_EOL; 
     // goto next1; 
    } 


+0

điều này có thể dẫn đến ổ cắm mở 'ping: icmp: Quyền bị từ chối'. Để giải quyết vấn đề này, SELinux phải được cho phép –

Các vấn đề liên quan