Przeglądaj źródła

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 lat temu
rodzic
commit
97a7d7b0b2
3 zmienionych plików z 14 dodań i 4 usunięć
  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 ()) {
 								$values = $entry->toArray ();
 								$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;
 								$entryDAO->addEntry ($values);
 							}
@@ -229,7 +229,7 @@ class feedController extends ActionController {
 						$feed->keepHistory ())) {
 						$values = $entry->toArray ();
 						//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;
 						$entryDAO->addEntry ($values);
 					}

+ 1 - 1
app/models/Entry.php

@@ -196,7 +196,7 @@ class Entry extends Model {
 class EntryDAO extends Model_pdo {
 	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) '
-		     . 'VALUES(CAST(? * 1000000 AS SIGNED INTEGER), ?, ?, ?, COMPRESS(?), ?, ?, ?, ?, ?, ?)';
+		     . 'VALUES(?, ?, ?, ?, COMPRESS(?), ?, ?, ?, ?, ?, ?)';
 		$stm = $this->bd->prepare ($sql);
 
 		$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() {
-	file_put_contents(DATA_PATH . '/touch.txt', microtime(true));
+	file_put_contents(DATA_PATH . '/touch.txt', uTimeString());
 }