Mutex par flux pour les actualisations

Contribue à https://github.com/marienfressinaud/FreshRSS/issues/351
Nouvelle constante TMP_PATH comme répertoire pour stocker des fichiers
temporaires (si possible en mémoire et non sur disque, tel tmpfs pour
/tmp sur certaines distributions Linux)
Requiert PHP 5.2.1+ (contre 5.2.0 auparavant) pour le
`sys_get_temp_dir()`
pull/426/head
Alexandre Alapetite 11 years ago
parent d48f612c43
commit 0cabd1f50d
  1. 2
      README.md
  2. 5
      app/Controllers/feedController.php
  3. 18
      app/Models/Feed.php
  4. 19
      app/actualize_script.php
  5. 2
      constants.php
  6. 5
      p/i/install.php

@ -25,7 +25,7 @@ Privilégiez pour cela des demandes sur GitHub
* Serveur modeste, par exemple sous Linux ou Windows
* Fonctionne même sur un Raspberry Pi avec des temps de réponse < 1s (testé sur 150 flux, 22k articles, soit 32Mo de données partiellement compressées)
* Serveur Web Apache2 ou Nginx (non testé sur les autres)
* PHP 5.2+ (PHP 5.3.7+ recommandé)
* PHP 5.2.1+ (PHP 5.3.7+ recommandé)
* Requis : [PDO_MySQL](http://php.net/pdo-mysql), [cURL](http://php.net/curl), [LibXML](http://php.net/xml), [PCRE](http://php.net/pcre), [ctype](http://php.net/ctype)
* Recommandés : [JSON](http://php.net/json), [zlib](http://php.net/zlib), [mbstring](http://php.net/mbstring), [iconv](http://php.net/iconv)
* MySQL 5.0.3+ (ou SQLite 3.7.4+ à venir)

@ -189,6 +189,10 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
$flux_update = 0;
$is_read = $this->view->conf->mark_when['reception'] ? 1 : 0;
foreach ($feeds as $feed) {
if (!$feed->lock()) {
Minz_Log::record('Feed already being actualized: ' . $feed->url(), Minz_Log::NOTICE);
continue;
}
try {
$url = $feed->url();
$feedHistory = $feed->keepHistory();
@ -251,6 +255,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
$feedDAO->updateLastUpdate ($feed->id (), 1);
}
$feed->unlock();
unset($feed);
// On arrête à 10 flux pour ne pas surcharger le serveur

@ -281,4 +281,22 @@ class FreshRSS_Feed extends Minz_Model {
$this->entries = $entries;
}
function lock() {
$lock = TMP_PATH . '/' . md5(Minz_Configuration::salt() . $this->url) . '.freshrss.lock';
if (file_exists($lock) && ((time() - @filemtime($lock)) > 3600)) {
@unlink($lock);
}
if (($handle = @fopen($lock, 'x')) === false) {
return false;
}
//register_shutdown_function('unlink', $lock);
@fclose($handle);
return true;
}
function unlock() {
$lock = TMP_PATH . '/' . md5(Minz_Configuration::salt() . $this->url) . '.freshrss.lock';
@unlink($lock);
}
}

@ -1,24 +1,5 @@
<?php
require(dirname(__FILE__) . '/../constants.php');
//<Mutex>
$lock = DATA_PATH . '/actualize.lock.txt';
if (file_exists($lock) && ((time() - @filemtime($lock)) > 3600)) {
@unlink($lock);
}
if (($handle = @fopen($lock, 'x')) === false) {
syslog(LOG_NOTICE, 'FreshRSS actualize already running?');
if (defined('STDERR')) {
fwrite(STDERR, 'FreshRSS actualize already running?' . "\n");
}
echo 'FreshRSS actualize already running?', "\n";
return;
}
register_shutdown_function('unlink', $lock);
//Could use http://php.net/function.pcntl-signal.php to catch interruptions
@fclose($handle);
//</Mutex>
require(LIB_PATH . '/lib_rss.php'); //Includes class autoloader
session_cache_limiter('');

@ -15,3 +15,5 @@ define('FRESHRSS_PATH', dirname(__FILE__));
define('LIB_PATH', FRESHRSS_PATH . '/lib');
define('APP_PATH', FRESHRSS_PATH . '/app');
define('TMP_PATH', sys_get_temp_dir());

@ -548,8 +548,9 @@ function checkStep0 () {
'all' => $language ? 'ok' : 'ko'
);
}
function checkStep1 () {
$php = version_compare (PHP_VERSION, '5.2.0') >= 0;
$php = version_compare (PHP_VERSION, '5.2.1') >= 0;
$minz = file_exists (LIB_PATH . '/Minz');
$curl = extension_loaded ('curl');
$pdo = extension_loaded ('pdo_mysql');
@ -721,7 +722,7 @@ function printStep1 () {
<?php if ($res['php'] == 'ok') { ?>
<p class="alert alert-success"><span class="alert-head"><?php echo _t ('ok'); ?></span> <?php echo _t ('php_is_ok', PHP_VERSION); ?></p>
<?php } else { ?>
<p class="alert alert-error"><span class="alert-head"><?php echo _t ('damn'); ?></span> <?php echo _t ('php_is_nok', PHP_VERSION, '5.1.0'); ?></p>
<p class="alert alert-error"><span class="alert-head"><?php echo _t ('damn'); ?></span> <?php echo _t ('php_is_nok', PHP_VERSION, '5.2.1'); ?></p>
<?php } ?>
<?php if ($res['minz'] == 'ok') { ?>

Loading…
Cancel
Save