New file |
0,0 → 1,137 |
<?php |
|
/***************************************************************************\ |
* SPIP, Systeme de publication pour l'internet * |
* * |
* Copyright (c) 2001-2005 * |
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * |
* * |
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. * |
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * |
\***************************************************************************/ |
|
|
// |
// Ce fichier ne sera execute qu'une fois |
if (defined("_ECRIRE_INC_FLOCK")) return; |
define("_ECRIRE_INC_FLOCK", "1"); |
|
function spip_file_get_contents ($fichier) { |
if (substr($fichier, -3) != '.gz') { |
if (function_exists('file_get_contents') |
AND os_serveur != 'windows') # windows retourne '' |
return @file_get_contents ($fichier); |
else |
return join('', @file($fichier)); |
} else |
return join('', @gzfile($fichier)); |
} |
|
// options = array( |
// 'phpcheck' => 'oui' # verifier qu'on a bien du php |
// dezippe automatiquement les fichiers .gz |
function lire_fichier ($fichier, &$contenu, $options=false) { |
$contenu = ''; |
if (!@file_exists($fichier)) |
return false; |
|
#spip_timer('lire_fichier'); |
|
if ($fl = @fopen($fichier, 'r')) { |
|
// verrou lecture |
@flock($fl, LOCK_SH); |
|
// a-t-il ete supprime par le locker ? |
if (!@file_exists($fichier)) { |
@fclose($fl); |
return false; |
} |
|
// lire le fichier |
$contenu = spip_file_get_contents($fichier); |
|
// liberer le verrou |
@flock($fl, LOCK_UN); |
@fclose($fl); |
|
// Verifications |
$ok = true; |
if ($options['phpcheck'] == 'oui') |
$ok &= (ereg("[?]>\n?$", $contenu)); |
|
#spip_log("$fread $fichier ".spip_timer('lire_fichier')); |
if (!$ok) |
spip_log("echec lecture $fichier"); |
|
return $ok; |
} |
} |
|
|
// |
// Ecrire un fichier de maniere un peu sure |
// |
// zippe les fichiers .gz |
function ecrire_fichier ($fichier, $contenu, $ecrire_quand_meme = false) { |
|
// Ne rien faire si on est en preview, debug, ou si une erreur |
// grave s'est presentee (compilation du squelette, MySQL, etc) |
if (($GLOBALS['var_preview'] OR ($GLOBALS['var_mode'] == 'debug') |
OR defined('spip_interdire_cache')) |
AND !$ecrire_quand_meme) |
return; |
|
$gzip = (substr($fichier, -3) == '.gz'); |
|
#spip_timer('ecrire_fichier'); |
|
// verrouiller le fichier destination |
if ($fp = @fopen($fichier, 'a')) |
@flock($fp, LOCK_EX); |
else |
return false; |
|
// ecrire les donnees, compressees le cas echeant |
// (on ouvre un nouveau pointeur sur le fichier, ce qui a l'avantage |
// de le recreer si le locker qui nous precede l'avait supprime...) |
if ($gzip) $contenu = gzencode($contenu); |
@ftruncate($fp,0); |
$s = @fputs($fp, $contenu, $a = strlen($contenu)); |
|
$ok = ($s == $a); |
|
// liberer le verrou et fermer le fichier |
@flock($fp, LOCK_UN); |
@fclose($fp); |
|
if (!$ok) { |
spip_log("echec ecriture fichier $fichier"); |
@unlink($fichier); |
} |
|
return $ok; |
} |
|
// |
// Supprimer le fichier de maniere sympa (flock) |
// |
function supprimer_fichier($fichier) { |
if (!@file_exists($fichier)) |
return; |
|
// verrouiller le fichier destination |
if ($fp = @fopen($fichier, 'a')) |
@flock($fp, LOCK_EX); |
else |
return; |
|
// liberer le verrou |
@flock($fp, LOCK_UN); |
@fclose($fp); |
|
// supprimer |
@unlink($fichier); |
} |
|
?> |