0

私はこのインタビューの質問をされたので、他のユーザーがどのように答えるかを確認するためにここに投稿すると思いました。

Please write some code which connects to a MySQL database (any host/user/pass), retrieves the current date & time from the database, compares it to the current date & time on the local server (i.e. where the application is running), and reports on the difference. The reporting aspect should be a simple HTML page, so that in theory this script can be put on a web server, set to point to a particular database server, and it would tell us whether the two servers’ times are in sync (or close to being in sync).

これは私が置いたものです:

// Connect to database server
$dbhost = 'localhost';
$dbuser = 'xxx';
$dbpass = 'xxx';
$dbname = 'xxx';

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die (mysql_error());

// Select database
mysql_select_db($dbname) or die(mysql_error());

// Retrieve the current time from the database server
$sql = 'SELECT NOW() AS db_server_time';

// Execute the query
$result = mysql_query($sql) or die(mysql_error());

// Since query has now completed, get the time of the web server
$php_server_time = date("Y-m-d h:m:s");

// Store query results in an array
$row = mysql_fetch_array($result);

// Retrieve time result from the array
$db_server_time = $row['db_server_time'];

echo $db_server_time . '<br />';
echo $php_server_time;

if ($php_server_time != $db_server_time) {
    // Server times are not identical

    echo '<p>Database server and web server are not in sync!</p>';

    // Convert the time stamps into seconds since 01/01/1970
    $php_seconds = strtotime($php_server_time);
    $sql_seconds = strtotime($db_server_time);

    // Subtract smaller number from biggest number to avoid getting a negative result
    if ($php_seconds > $sql_seconds) {
        $time_difference = $php_seconds - $sql_seconds;
    }
    else {
        $time_difference = $sql_seconds - $php_seconds;
    } 

    // convert the time difference in seconds to a formatted string displaying hours, minutes and seconds
    $nice_time_difference = gmdate("H:i:s", $time_difference);

    echo '<p>Time difference between the servers is ' . $nice_time_difference;
}
else {
    // Timestamps are exactly the same
    echo '<p>Database server and web server are in sync with each other!</p>';
}

はい、非推奨のmysql_ *関数を使用したことは知っていますが、それはさておき、どのように答えましたか。つまり、どのような変更を行い、その理由を教えてください。省略した要素のうち、考慮すべき点はありますか?

興味深いのは、私のホスティングアカウントで実行した場合、結果は常に正確な分数だけ離れているように見えることです。

2012-12-06 11:47:07

2012-12-06 11:12:07

4

4 に答える 4

3

これは私のコードの大部分でした:

$db = new PDO(...);
$dbTime = new DateTime(current($db->query('SELECT NOW()')->fetchAll(PDO::FETCH_COLUMN, 0)));
$myTime = new DateTime();
$diff = $myTime->diff($dbTime);
// do stuff with $diff
于 2012-12-06T17:01:03.797 に答える
2
$php_server_time = date("Y-m-d h:m:s");

年-月-日 時:月:秒の形式で時刻をフォーマットします。これは、サーバー時間が11:12:07. 実は12月だそうです。データベース時間とサーバー時間の差が正確に 35 分であることは、非常に驚​​くべきことです。「まさに」という言葉がなくても驚くでしょう。

分はiフォーマット文字列です。


それ以外では、時間が 1 秒異なっていても、必ずしもデータベースがサーバーと完全に同期していないことを意味するわけではありません。これは、測定の間にいくらかの (任意に短い) 時間が経過したことを意味している可能性があります。同期を確認する場合は、サーバーで 2 つの測定を行い、1 つはクエリの前、もう 1 つはクエリの後に行い、範囲比較を行うか、単純に時間のデルタ比較 (abs(t1-t2)<=1s) を行うことができます。

于 2012-12-06T16:56:49.407 に答える
1

廃止された関数の使用を手放しますmysql_が、私が就職の面接でその質問をしているとしたら、それは危険信号 #1 になります。PHP の現在のベスト プラクティスについていけていないか、気にしていないかのどちらかです。

そのコードについて私が懸念するもう1つのことは、MySQLが時間を与える形式を指定していないことです.出力形式を明示的に指定して、サーバー設定。

于 2012-12-06T16:56:07.667 に答える
0

PDOとクエリを使用していたでしょう:

SELECT UNIX_TIMESTAMP()

コードで:

$time_difference = abs($PDOStatement->fetchColumn() - date('U'));

おそらく、差が「ほぼ同じ」であると宣言するでしょう。<= 1

于 2012-12-06T17:12:33.513 に答える