mirror of
https://github.com/FreshRSS/FreshRSS.git
synced 2026-01-21 03:37:56 -05:00
Minz ne prenait pas en charge OPcache (cache PHP) http://php.net/opcache activé par défaut depuis PHP5.5. Ce fut un peu dur d'isoler ce bug :-/ Il faut penser à appeler opcache_invalidate avant de ré-utiliser un fichier par include(). Aussi, le mécanisme de lock() n'est plus approprié ni nécessaire. Pour FreshRSS, évite l'utilisation de ModelArray car il ne restait que quelques lignes d'utiles, et évite un héritage + appel de classe, ce qui est toujours ça de gagné.
82 lines
1.9 KiB
PHP
82 lines
1.9 KiB
PHP
<?php
|
|
/**
|
|
* MINZ - Copyright 2011 Marien Fressinaud
|
|
* Sous licence AGPL3 <http://www.gnu.org/licenses/>
|
|
*/
|
|
|
|
/**
|
|
* La classe Model_array représente le modèle interragissant avec les fichiers de type texte gérant des tableaux php
|
|
*/
|
|
class Minz_ModelArray {
|
|
/**
|
|
* $filename est le nom du fichier
|
|
*/
|
|
protected $filename;
|
|
|
|
/**
|
|
* Ouvre le fichier indiqué, charge le tableau dans $array et le $filename
|
|
* @param $filename le nom du fichier à ouvrir contenant un tableau
|
|
* Remarque : $array sera obligatoirement un tableau
|
|
*/
|
|
public function __construct ($filename) {
|
|
$this->filename = $filename;
|
|
}
|
|
|
|
protected function loadArray() {
|
|
if (!file_exists($this->filename)) {
|
|
throw new Minz_FileNotExistException($this->filename, Minz_Exception::WARNING);
|
|
}
|
|
elseif (($handle = $this->getLock()) === false) {
|
|
throw new Minz_PermissionDeniedException($this->filename);
|
|
} else {
|
|
$data = include($this->filename);
|
|
$this->releaseLock($handle);
|
|
|
|
if ($data === false) {
|
|
throw new Minz_PermissionDeniedException($this->filename);
|
|
} elseif (!is_array($data)) {
|
|
$data = array();
|
|
}
|
|
return $data;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sauve le tableau $array dans le fichier $filename
|
|
**/
|
|
protected function writeArray($array) {
|
|
if (file_put_contents($this->filename, "<?php\n return " . var_export($array, true) . ';', LOCK_EX) === false) {
|
|
throw new Minz_PermissionDeniedException($this->filename);
|
|
}
|
|
if (function_exists('opcache_invalidate')) {
|
|
opcache_invalidate($this->filename); //Clear PHP 5.5+ cache for include
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private function getLock() {
|
|
$handle = fopen($this->filename, 'r');
|
|
if ($handle === false) {
|
|
return false;
|
|
}
|
|
|
|
$count = 50;
|
|
while (!flock($handle, LOCK_SH) && $count > 0) {
|
|
$count--;
|
|
usleep(1000);
|
|
}
|
|
|
|
if ($count > 0) {
|
|
return $handle;
|
|
} else {
|
|
fclose($handle);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private function releaseLock($handle) {
|
|
flock($handle, LOCK_UN);
|
|
fclose($handle);
|
|
}
|
|
}
|