Browse Source

Microtime : récupération de toutes les microsecondes

Microtime(true) dépend de la précision de PHP définie dans php.ini, et
par défaut, nous perdons les deux dernières décimales des microsecondes.
Du coup, sur une machine très rapide, cela aurait pu poser des problèmes
d'identifiants dupliqués.
Patch utilisant gettimeofday() à la place.
Au passage, reste en string tout le long et plus besoin de faire la
conversion CAST(? * 1000000 AS SIGNED INTEGER) côté base de données.
https://github.com/marienfressinaud/FreshRSS/issues/202
Alexandre Alapetite 12 years ago
parent
commit
97a7d7b0b2
3 changed files with 14 additions and 4 deletions
  1. 2 2
      app/controllers/feedController.php
  2. 1 1
      app/models/Entry.php
  3. 11 1
      lib/lib_rss.php

+ 2 - 2
app/controllers/feedController.php

@@ -106,7 +106,7 @@ class feedController extends ActionController {
 							    $feed->keepHistory ()) {
 							    $feed->keepHistory ()) {
 								$values = $entry->toArray ();
 								$values = $entry->toArray ();
 								$values['id_feed'] = $feed->id ();
 								$values['id_feed'] = $feed->id ();
-								$values['id'] = min(time(), $entry->date (true)) . '.' . rand(0, 999999);
+								$values['id'] = min(time(), $entry->date (true)) . uSecString();
 								$values['is_read'] = $is_read;
 								$values['is_read'] = $is_read;
 								$entryDAO->addEntry ($values);
 								$entryDAO->addEntry ($values);
 							}
 							}
@@ -229,7 +229,7 @@ class feedController extends ActionController {
 						$feed->keepHistory ())) {
 						$feed->keepHistory ())) {
 						$values = $entry->toArray ();
 						$values = $entry->toArray ();
 						//Use declared date at first import, otherwise use discovery date
 						//Use declared date at first import, otherwise use discovery date
-						$values['id'] = empty($existingGuids) ? min(time(), $entry->date (true)) . '.' . rand(0, 999999) : microtime(true);
+						$values['id'] = empty($existingGuids) ? min(time(), $entry->date (true)) . uSecString() : uTimeString();
 						$values['is_read'] = $is_read;
 						$values['is_read'] = $is_read;
 						$entryDAO->addEntry ($values);
 						$entryDAO->addEntry ($values);
 					}
 					}

+ 1 - 1
app/models/Entry.php

@@ -196,7 +196,7 @@ class Entry extends Model {
 class EntryDAO extends Model_pdo {
 class EntryDAO extends Model_pdo {
 	public function addEntry ($valuesTmp) {
 	public function addEntry ($valuesTmp) {
 		$sql = 'INSERT INTO `' . $this->prefix . 'entry`(id, guid, title, author, content_bin, link, date, is_read, is_favorite, id_feed, tags) '
 		$sql = 'INSERT INTO `' . $this->prefix . 'entry`(id, guid, title, author, content_bin, link, date, is_read, is_favorite, id_feed, tags) '
-		     . 'VALUES(CAST(? * 1000000 AS SIGNED INTEGER), ?, ?, ?, COMPRESS(?), ?, ?, ?, ?, ?, ?)';
+		     . 'VALUES(?, ?, ?, ?, COMPRESS(?), ?, ?, ?, ?, ?, ?)';
 		$stm = $this->bd->prepare ($sql);
 		$stm = $this->bd->prepare ($sql);
 
 
 		$values = array (
 		$values = array (

+ 11 - 1
lib/lib_rss.php

@@ -255,6 +255,16 @@ function lazyimg($content) {
 	);
 	);
 }
 }
 
 
+function uTimeString() {
+	$t = @gettimeofday();
+	return $t['sec'] . str_pad($t['usec'], 6, '0');
+}
+
+function uSecString() {
+	$t = @gettimeofday();
+	return str_pad($t['usec'], 6, '0');
+}
+
 function invalidateHttpCache() {
 function invalidateHttpCache() {
-	file_put_contents(DATA_PATH . '/touch.txt', microtime(true));
+	file_put_contents(DATA_PATH . '/touch.txt', uTimeString());
 }
 }