Использование php для пинга веб-сайта
Я хочу создать php-скрипт, который будет пинговать домен и указывать время ответа вместе с общим размером запроса.
Это будет использоваться для мониторинга сети веб-сайтов. Я попробовал это с curl
, вот код, который у меня есть до сих пор:
function curlTest2($url) {
clearstatcache();
$return = '';
if(substr($url,0,4)!="http") $url = "http://".$url;
$userAgent =
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
$execute = curl_exec($ch);
// Check if any error occured
if(!curl_errno($ch)) {
$bytes = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
$total_time = curl_getinfo($ch, CURLINFO_TOTAL_TIME);
$return = 'Took ' . $total_time . ' / Bytes: '. $bytes;
} else {
$return = 'Error reaching domain';
}
curl_close($ch);
return $return;
}
И вот один из них, использующий fopen
function fopenTest($link) {
if(substr($link,0,4)!="http"){
$link = "http://".$link;
}
$timestart = microtime();
$churl = @fopen($link,'r');
$timeend = microtime();
$diff = number_format(((substr($timeend,0,9)) + (substr($timeend,-10)) -
(substr($timestart,0,9)) - (substr($timestart,-10))),4);
$diff = $diff*100;
if (!$churl) {
$message="Offline";
}else{
$message="Online. Time : ".$diff."ms ";
}
fclose($churl);
return $message;
}
Есть ли лучший способ пропинговать веб-сайт с помощью php?
7 answers
Вы могли бы использовать xmlrpc (xmlrpc_client ). Не уверен, в чем заключаются преимущества/недостатки curl.
Для этой цели Drupal использует xmlrpc (посмотрите на модуль ping).
Очевидно, что в curl есть много интересных вещей, но помните, что вы всегда можете использовать встроенные инструменты, вызывая их из командной строки следующим образом:
$site = "google.com";
ob_start();
system("ping " . escapeshellarg($site));
print ob_end_flush();
Единственное, что нужно иметь в виду, это не будет такой кроссплатформенной, как curl; хотя расширение curl также не включено по умолчанию..
При выполнении быстрых сценариев для одноразовых задач я просто выполняю() wget:
$response = `wget http://google.com -O -`;
Это просто и заботится о перенаправлениях.
Если вы используете патчи suhosin и curl, у вас могут возникнуть проблемы с перенаправлением http (301, 302...), suhosin этого не допустит.
Я не уверен насчет Curl/Fopen, но этот тест говорит, что file_get_contents имеют лучшую производительность, чем fopen.
Использование curl - это нормально.
Не уверен, буду ли я использовать эту строку агента пользователя. Лучше сделайте свой собственный, если вам это специально не нужно.
Возможно, эта груша Net_ping - это то, что вы ищете. Он больше не поддерживается, но он работает.
Если удаленное открытие включено, file_get_contents()
тоже сделает свое дело.