2010-08-15 2 views
1

HI, мой php очень ржавый, и я не могу вспомнить, как это сделать.сравнение временных меток

У меня есть сценарий, который я хочу называть только каждые 15 минут. Я создал таблицу с именем last_updated. То, что я хочу сделать, это иметь некоторый код в верхней части моего скрипта, который запрашивает эту последнюю обновленную таблицу, и если now() минус последнее обновление более 15 минут, тогда запустите сценарий и обновите last_updated до сих пор ... if он не запускает скрипт. Имеет ли это смысл?

Теперь я знаю, когда я обновляю last_updated Мне нужно использовать now() Чтобы поместить новую временную метку, но я не уверен, как выполнить сравнение теперь с значением db, чтобы увидеть, если оно больше 15 мин.

Любые идеи

+0

«Я создал таблицу [...] now()» - MySQL? – VolkerK

+0

Это не должно быть инициировано загрузкой страницы - что, если никто не посещает сайт за этот 15-минутный интервал? Как в часах, так и в днях ... Во-вторых, при запуске из загрузки страницы, скорее всего, будут проблемы с параллелизмом - что, если два или более пользователя загружают страницу? Вам нужно что-то проверить, чтобы это значение еще не было установлено. –

+0

Это не проблема, если никто не посетил более 15 минут. Если несколько пользователей одновременно попадают на страницу, сценарий запускается для первого из этих посетителей и проверяет метку времени. Если прошло более 15 минут с момента последнего обновления, сделайте кое-что. Другие пользователи вызовут тот же скрипт, но на этот раз он будет меньше 15 минут с момента последнего обновления, поэтому обновление не будет выполнено. –

ответ

2
<?php 
$pdo = new PDO('mysql:host=your_host;dbname=your_database', $user, $password, array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)); 

// query the database. change 
$stmt = $pdo->query('SELECT UNIX_TIMESTAMP(last_updated_date) FROM last_updated ORDER BY last_updated_date DESC LIMIT 1'); 

$lastUpdatedTimestamp = $stmt->fetch(PDO::FETCH_COLUMN); 

if ((time() - $lastUpdatedTimestamp) > (60 * 15)) { 
    touch($file); 
    // do stuff 
} 

time() дает вам текущее время в секундах. Вы должны, вероятно, развернуть 60 * 15 до 900, я просто предоставил ему оба номера, чтобы проиллюстрировать, что происходит.

Кроме того, файл может быть лучше для этого, чем таблица базы данных. Посмотрите на функцию touch() . Он изменяет время модификации файла или создает пустой файл с текущим временем в качестве времени модификации, если он не существует. Вы можете проверить файл мод времени с filemtime()

<?php 
$lastUpdated = null; 
$file = '/path/to/writable/file/with/nothing/in/it'; 

if (file_exists($file)) { 
    $lastUpdated = filemtime($lastUpdated); 
} 

if (!$lastUpdated || (time() - $lastUpdated) > 900) { 
    touch($file); 
    // do stuff 
} 
+0

привет, спасибо. Я попробовал параметр файла касания, но даже если я установил права на файл и каталоги, я все еще получаю сообщение об ошибке, говоря, что сенсорный файл не может касаться файла. Так что я отказался от него, поскольку я не действительно хотите установить слишком много привилегий для записи по соображениям безопасности. Пример метки времени, который вы указали .... что такое $ lastupdatedtimestamp? У меня с этим проблемы. Если у меня есть поле таблицы с типом datetime, и я ввожу сейчас() в него, что дает мне что-то вроде: 2010-02-15 14:23:43 ... Мне нужно как-то преобразовать его, чтобы сравнить со временем ... –

+0

, вы можете сделать это на уровне базы данных, обернув поле в своем запросе с помощью UNIX_TIMESTAMP(), или вы можете сделать это в своем коде, запустив значение даты, которое выходит из базы данных с помощью функции php strtotime(), которая преобразует много разных текстовых дат в временную метку unix. – Shabbyrobe

+0

Я обновил свой ответ, чтобы объяснить, откуда приходит $ lastUpdatedTimeStamp - это значение, которое вы вытаскиваете из своей базы данных. Я не знаю, используете ли вы PDO или нет, я могу изменить пример, если вы этого не сделали. – Shabbyrobe

1

Вы, кажется использовать MySQL в качестве СУБД. В этом случае, и если вы хотите, вы можете позволить MySQL сделать большую часть работы:

SELECT 
    pit < Now()-Interval 15 Minute as mustUpdate 
FROM 
    last_updated 
WHERE 
    siteId=? 

pit является ваше поле DateTime и siteId некоторое условие, вы можете иметь, если вы храните более одной записи в таблице (которая звучит как хорошая идея для меня).
Результат (если есть такая запись с siteId=?) содержит поле mustUpdate, которое либо содержит 0, либо 1, 1, что указывает на то, что значение ямы более 15 минут в прошлом.

Смежные вопросы