0

PHP で特定のサーバー (Google など) から時間を取得できる方法があるかどうか疑問に思っています。サーバーに設定されている時刻を取得できるスクリプトを作成したいと考えています。

ありがとう :)

4

2 に答える 2

4

Date:HTTP リクエストによって返されたヘッダーを信頼しても問題ない場合は、PHPでcURLを使用して次のようなことができます。

<?                                                                                                                                  
$date = null;

function header_callback($curl, $header)
{
    global $date;

    if (preg_match('/^Date:/', $header)) {
        $date = trim(substr($header, 5));
        $date = DateTime::createFromFormat('D, d M Y H:i:s e', $date);
    }

    return strlen($header);
}

$curl = curl_init("http://www.google.com/");

curl_setopt($curl, CURLOPT_NOBODY, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADERFUNCTION, 'header_callback');

curl_exec($curl);

curl_close($curl);

if ($date != NULL) {
    echo "Date from HTTP: " . $date->format('r');
}
?>
于 2012-10-01T13:56:21.807 に答える
1

特定のタイム サーバーをクエリする組み込みの PHP 関数はありませんが、それを実行するスクリプトを作成できます。このページにいくつかの例があります: http://www.kloth.net/software/timesrv1.php

前のリンクのこの例では、ポート 37 で TIME プロトコルを使用しています。

<?php
/* Query a time server
   (C) 1999-09-29, Ralf D. Kloth (QRQ.software) <ralf at qrq.de> 
*/

function query_time_server ($timeserver, $socket) {    
  $fp = fsockopen($timeserver,$socket,$err,$errstr,5);
        # parameters: server, socket, error code, error text, timeout
  if ($fp) {
    fputs($fp,"\n");
    $timevalue = fread($fp,49);
    fclose($fp); # close the connection
  }
  else {
    $timevalue = " ";
  }

  $ret = array();
  $ret[] = $timevalue;
  $ret[] = $err;     # error code
  $ret[] = $errstr;  # error text
  return($ret);

} # function query_time_server 

$timeserver = "ntp1.sf-bay.org";
$timercvd = query_time_server($timeserver,37);
if (!$timercvd[1]) { # if no error from query_time_server
  $timevalue = bin2hex ($timercvd[0]);
  $timevalue = abs (HexDec('7fffffff') - HexDec($timevalue) - HexDec('7fffffff')) ;
  $tmestamp = $timevalue - 2208988800; # convert to UNIX epoch time stamp
  $datum = date("Y-m-d (D) H:i:s",$tmestamp - date("Z",$tmestamp)); /* incl time zone offset */
  $doy = (date("z",$tmestamp)+1);

  echo "Time check from time server ",$timeserver," : [<font color=\"red\">",$timevalue,"</font>]";
  echo " (seconds since 1900-01-01 00:00.00).<br>\n";
  echo "The current date and universal time is ",$datum," UTC. ";
  echo "It is day ",$doy," of this year.<br>\n";
  echo "The unix epoch time stamp is $tmestamp.<br>\n";
} #if (!$timercvd)
else {
  echo "Unfortunately, the time server $timeserver could not be reached at this time. ";
  echo "$timercvd[1] $timercvd[2].<br>\n";
} # else
?>
于 2012-10-01T13:38:46.280 に答える