summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2014-02-11 21:48:10 +0100
committerGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2014-02-11 21:48:10 +0100
commit0cabd1f50dd7d1cf0941a50139e6fbeed6825b4d (patch)
tree404190eba703df08a741623db491ea0917488b6d
parentd48f612c437009069593978fe43833fe2c7d74ea (diff)
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()`
-rw-r--r--README.md2
-rwxr-xr-xapp/Controllers/feedController.php5
-rw-r--r--app/Models/Feed.php18
-rwxr-xr-xapp/actualize_script.php19
-rw-r--r--constants.php2
-rw-r--r--p/i/install.php5
6 files changed, 29 insertions, 22 deletions
diff --git a/README.md b/README.md
index 247d08799..1ed6d8f82 100644
--- a/README.md
+++ b/README.md
@@ -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)
diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php
index 55e8f76cf..61bfc5919 100755
--- a/app/Controllers/feedController.php
+++ b/app/Controllers/feedController.php
@@ -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
diff --git a/app/Models/Feed.php b/app/Models/Feed.php
index e94ae2b3a..73f9c32fb 100644
--- a/app/Models/Feed.php
+++ b/app/Models/Feed.php
@@ -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);
+ }
}
diff --git a/app/actualize_script.php b/app/actualize_script.php
index bef9bd218..8d81e0189 100755
--- a/app/actualize_script.php
+++ b/app/actualize_script.php
@@ -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('');
diff --git a/constants.php b/constants.php
index a7c96f47b..4818f1565 100644
--- a/constants.php
+++ b/constants.php
@@ -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());
diff --git a/p/i/install.php b/p/i/install.php
index bb49e3fdb..4b0b1d194 100644
--- a/p/i/install.php
+++ b/p/i/install.php
@@ -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') { ?>