8791 sujets

Développement web côté serveur, CMS

Bonjour,
J'ai un script qui me permet de modifier un fichier css dynamiquement pour l'administration de divers sites.
En fait je modifie les taille position couleur... du design du site avec des curseurs et le fichier css utilisé pour la mise en page se modifie instantanément pour voir les modification.

Le problème est que ça fonctionne très bien chez plusieurs hébergeurs, je peux immédiatement voir les changements, sauf chez online car il me faut actualiser la page à plusieurs reprises !

J'ai bien vérifié par ftp et le fichier css est bien modifié en temps réel mais l'affichage ne suit pas ! il me faut parfois attendre 5 minutes !

Une idée ?

Merci à vous
Modifié par TiltRock (05 Mar 2012 - 15:45)
Salut !

Configuration du serveur et la gestion de la mise en cache ?


J'utilise une astuce pour palier rapidement à ca, rajouter un paramètre à l'appel du fichier :

src="monfichier.css?monparametre"

Mon parametre est souvent le résultat de la function time()
Bonne idée !

Par contre quel son les paramètres qui gèrent ça dans la "Configuration du serveur et la gestion de la mise en cache"

Je ne veux pas utiliser le <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"> auquel j'avais pensé en premier !

JE teste ça, mais ça devrait fonctionner

Merci à toi pour cette réponse rapide
Bon article effectivement, mais mon cas est particulier !

Comme me disait mon prof d’électronique appliquée "pourquoi faire simple quand tu peux faire compliqué" Smiley biggrin

En fait j'ai créé un cms qui permet de modifier le design avec une interface va voir une demon vidéoen particulier celle ci Gestion et design avancé du menu gauche.

Tu verras que si veux utiliser la conf Apache ce n'est pas possible chez online ! et un .htaccess n'est à mon avis pas recommandé car ce CMS est téléchargeable librement et donc certaines personnes pourraient ne rien y comprendre Smiley eek

D'autre part, n'étant pas un pro du php Smiley confused je n'ai trouvé que la solution de changer le nom des fichiers CSS à chaque modification, (parfois plusieurs fois par minutes !) dans ce genre rubric_top_css10032012081342.css où tu peux voir que je rajoute dynamiquement jj mm aa hh mm ss au fichier css,

C'est une vraie usine à gaz, qui fonctionne très bien et qui à mon avis et niveau supprime tout les problèmes du cache navigateur tout en évitant d'utiliser la balise META qui force le rechargement inutile de donnée qui sont peu être déjà dans le cache.

Mon objectif est d'apprendre Smiley cligne et surtout de minimiser la charge serveur et d'utilisation de la bande passante même si c'est infime ! question de conviction (Le désert est immense mais n'est fait que de tout petits grains de sable Smiley cligne

Maintenant j'ai cherché à comparer la date du fichier CSS en cache et celui disponible sur le serveur pour un éventuel rafraichissement mais je n'ai rien trouvé

Si tu as une remarque je suis pour tout ce qui est constructifs
Modifié par TiltRock (10 Mar 2012 - 08:58)
Re !

Donc l'utilisation du paramètre PHP sera tout à fait fonctionnel pour toi (ou comme tu le fais en renommant vraiment le fichier), sans forcément modifier les noms de fichiers (ça permet de forcer la télécharger à nouveau du fichier).

Sur online, on peut faire ce que l'on veut d'apache, si tu te trouves sur un serveur dédié, pour un hébergement mutualisé c'est tout autre chose, et pour un CMS, forcément, il faut le rendre le plus accessible possible, et donc la conf apache reste problématique car forcément différente entre les hébergeurs.

Sur cette discussion (qui date), en générant le fichier CSS à partir de PHP (ton fichier css s'appellerait donc style.css.php), tu pourrais vérifier la date du cache, et renvoyer au navigateur (via la fonction header()) si le fichier doit être télécharger de nouveau ou pas.

C'est la solution la plus "propre" que je vois.
Cooollll, tu m'as l'air d'avoir un bon carnet d'adresse Smiley smile

Ce lien est dans mes favoris car même si mon système fonctionne très bien même chez Online avec un mutualisé pour une association sans le sous Smiley cligne , je vais faire des tests.

D'après toi qu'est ce qui est le plus rapide pour le chargement de la page lors d'une visite, ou plutôt le plus logique à faire ?
Ce que tu me proposes ou mon système qui écrit un fichier css avec un script, voici un bout d'un de ces scripts le plus gros écrit 2000 lignes, tu verras donc que j'écris ou réécrit des styles.css et non pas de styles.css.php ! car mon objectif est de minimiser la charge serveur (mauvaise expérience chez ovh) à cause d'un script un peu lourd et le serveur à planté Smiley confused .

mysql_select_db($database_articles, $articles);
$query = "SELECT * FROM index_page WHERE on_off_line = 1 ORDER BY orderId ASC";
$result = mysql_query($query, $articles) or die("Impossible d'interroger la base de données");
$num = mysql_num_rows($result);
if ($num != 0) {
$fp2222233= fopen("Css/photo_index.css", "w+");
while ($row = mysql_fetch_array($result))
{
if ($row['id_index_page']) {
$_css2222233 .="#photos".$row['id_index_page']."{
-webkit-transition:all 0.1s ease-in-out;
-moz-transition:all 0.1s ease-in-out;
-o-transition:all 0.1s ease-in-out;
-transition:all 0.1s ease-in-out;
position:fixed;
z-index:100;
visibility: hidden;
margin-left: ".$row['position']."px;
bottom:15px;
}
#photos_vertical".$row['id_index_page']."{
-webkit-transition:all 0.1s ease-in-out;
-moz-transition:all 0.1s ease-in-out;
-o-transition:all 0.1s ease-in-out;
-transition:all 0.1s ease-in-out;
position:fixed;
z-index:100;
visibility: hidden;
margin-left: 150px;
bottom:15px;}\r\n";
} 
}
fwrite($fp2222233, $_css2222233);
fclose($fp2222233);
};


Par ailleurs quand un css est écrit avec php comme ça, c'est pour pouvoir changer la couleur de fond de fckeditor dans l'administration suivant le couleur de fond de page pour avoir une meilleur rendu lors de l'édition.

<?php require_once('../../../Connections/articles.php'); ?>
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}

mysql_select_db($database_articles, $articles);
$query_rsdesign = "SELECT * FROM design";
$rsdesign = mysql_query($query_rsdesign, $articles) or die(mysql_error());
$row_rsdesign = mysql_fetch_assoc($rsdesign);
$totalRows_rsdesign = mysql_num_rows($rsdesign);

$default_fck_editor_backcolor = $row_rsdesign['fck_back_color'];
$site_backgroud_color = $row_rsdesign['backgroudcolor'];
$textaera_back_color = $row_rsdesign['text_zone_back_color'];
$menu_textaera_back_color = $row_rsdesign['menu_text_zone_back_color'];
$fck_editor_backcolor=$row_rsdesign['text_zone_back_color'];

if ($default_fck_editor_backcolor!="") {
     $fck_editor_backcolor=$default_fck_editor_backcolor;
}
elseif ($fck_editor_backcolor!="") {
     $fck_editor_backcolor=$textaera_back_color;
}
elseif
	  ($fck_editor_backcolor==""){ 
     $fck_editor_backcolor=($row_rsdesign['menu_text_zone_back_color']);
}
$fckEditor_backcolor=$fck_editor_backcolor;
if ($fck_editor_backcolor=="") {
     $fckEditor_backcolor=$site_backgroud_color;
}
else{
	$fckEditor_backcolor=$fckEditor_backcolor;
	}
 header("Content-type: text/css");?>
body
{
	background-color: <?php echo $fckEditor_backcolor;?>;
    color: <?php echo $row_rsdesign['rubrique_menu_back_color']; ?>;
	font-size: 26px;
	font-family: "Times New Roman", Times, serif;
	padding: 5px 5px 5px 5px;
	margin: 0px;
}

body, td
{
	font-family: "Times New Roman", Times, serif;
	font-size: 16px; // taille de la police dans la zone de texte
}

a[href]
{
	color: -moz-hyperlinktext !important;		
	text-decoration: -moz-anchor-decoration;	
}
.Bold
{
	font-weight: bold;
}

.Title
{
	font-weight: bold;
	font-size: 18px;
	color: #cc3300;
}

.Code
{
	border: #8b4513 1px solid;
	padding-right: 5px;
	padding-left: 5px;
	color: #000066;
	font-family: 'Courier New' , Monospace;
	background-color: #ff9933;
}
<?php
mysql_free_result($rsdesign);
?>


Alors j'ai compris que ce fichier qui s'appelait avant fck_editorarea.css s’appelle maintenant fck_editorarea.php, j'ai bien sur fait appel à ce fichier fck_editorarea.php dans le liens du style !

Ma question !
Si ce fichier est dans le cache, sera-t-il chaque fois redemandé, il me semblait avoir lu ce genre de chose sur le net, ou non, s'il n'a pas changé car il est comme je le comprends "simulé" ? et n'existe pas en dur.

Pour conclure si la mise en cache peu être contrôlée avec ta méthode, et que c'est plus rapide que mon système je modifie tout ça Smiley biggrin

Encore un grand merci
Alors, j'ai apporté ma touche à ton code PHP car pas assez lisible pour moi, j'en ai profité pour tenter d'optimiser un chouilla le code :

<?php
mysql_select_db($database_articles, $articles); // Choix de la base de donnée

$query = "SELECT id_index_page, position FROM index_page WHERE on_off_line = 1 ORDER BY orderId ASC"; // Sélection des id_index_page et position
$result = mysql_query($query, $articles) or die('Impossible d\'interroger la base de données');
$num = mysql_num_rows($result);

if($num > 0)
	{
	$num_css = '2222233'; // Initialisation du nom de la css
	$file_css = 'fp'.$num_css; // Initialisation du nom de la variable ${$css_prop} = $fp2222233
	$css_prop = '_css'.$num_css; // Initialisation du nom de la variable ${$css_prop} = $_css2222233

	while($row = mysql_fetch_assoc($result)) // Traitement des résultats
		{
		if(!empty($row['id_index_page'])) // Double contrôle, mais pourquoi pas ?
			{
			${$css_prop} = '#photos'.$row['id_index_page'].','."\n";
			${$css_prop}.= '#photos_vertical'.$row['id_index_page'].' {'."\n";
				${$css_prop}.= "\t".'-webkit-transition:all 0.1s ease-in-out;'."\n";
				${$css_prop}.= "\t".'-moz-transition:all 0.1s ease-in-out;'."\n";
				${$css_prop}.= "\t".'-o-transition:all 0.1s ease-in-out;'."\n";
				${$css_prop}.= "\t".'-transition:all 0.1s ease-in-out;'."\n";
				${$css_prop}.= "\t".'position:fixed;'."\n";
				${$css_prop}.= "\t".'z-index:100;'."\n";
				${$css_prop}.= "\t".'visibility: hidden;'."\n";
				${$css_prop}.= "\t".'margin-left: '.$row['position'].'px;'."\n";
				${$css_prop}.= "\t".'bottom:15px'."\n";
			${$css_prop}.= '}'."\n\n";

			${$css_prop}.= '#photos_vertical'.$row['id_index_page'].'{'."\n";
				${$css_prop}.= "\t".'margin-left: 150px'."\n";
			${$css_prop}.= '}'."\n\n";
			}
			else
				{
				//Prévoir une raison de sortie
				}
		}
	${$file_css} = fopen('Css/photo_index.css', 'w+'); // Ouverture du fichier css (si non existant, création du fichier)
	fwrite(${$file_css}, ${$css_prop}); // Remplissage du fichier
	fclose(${$file_css}); //Fermeture du fichier
	}
	else
		{
		// Prévoir une raison de sortie
		}
?>


<?php
require_once('../../../Connections/articles.php');

if(!function_exists('GetSQLValueString'))
	{
	function GetSQLValueString($theValue, $theType, $theDefinedValue=FALSE, $theNotDefinedValue=FALSE) 
		{
		if(PHP_VERSION < 6)
			{
			$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
			}
			
		$theValue = function_exists('mysql_real_escape_string') ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
		
		$theValue = ($theValue != '') ? TRUE : FALSE;
		
		switch($theType)
			{
			case 'text':
			case 'date':
				$theValue = ($theValue) ? '\''.$theValue.'\'' : 'NULL';
				break;    
			case 'long':
			case 'int':
				$theValue = ($theValue) ? intval($theValue) : 'NULL';
				break;
			case 'double':
				$theValue = ($theValue) ? doubleval($theValue) : 'NULL';
				break;
			case 'defined':
				$theValue = ($theValue) ? $theDefinedValue : $theNotDefinedValue;
				break;
			default:
				break;
			}
		return $theValue;
		}
	}

mysql_select_db($database_articles, $articles);

$query_rsdesign = "SELECT fck_back_color, backgroudcolor, text_zone_back_color, menu_text_zone_back_color, rubrique_menu_back_color FROM design";

$rsdesign = mysql_query($query_rsdesign, $articles) or die('Erreur MYSQL');

$row_rsdesign = mysql_fetch_assoc($rsdesign);

$totalRows_rsdesign = mysql_num_rows($rsdesign);

$default_fck_editor_backcolor = $row_rsdesign['fck_back_color'];

$site_backgroud_color = $row_rsdesign['backgroudcolor'];

$textaera_back_color = $row_rsdesign['text_zone_back_color'];

$menu_textaera_back_color = $row_rsdesign['menu_text_zone_back_color'];

$fck_editor_backcolor=$row_rsdesign['text_zone_back_color'];

if($default_fck_editor_backcolor != '')
	{
    $fck_editor_backcolor = $default_fck_editor_backcolor;
	}
	elseif($fck_editor_backcolor != '')
		{
		$fck_editor_backcolor = $textaera_back_color;
		}
		elseif($fck_editor_backcolor == '')
			{ 
			$fck_editor_backcolor = $row_rsdesign['menu_text_zone_back_color'];
			}

$fckEditor_backcolor = $fck_editor_backcolor;

if($fck_editor_backcolor == '')
	{
    $fckEditor_backcolor = $site_backgroud_color;
	}
	else
		{
		$fckEditor_backcolor = $fckEditor_backcolor;
		}

//Header PHP for CSSphp File		
$css = '<?php'."\n";
$css.= 'header(\'Content-type: text/css\');'."\n";
$css.= 'if(strtotime($_SERVER[\'HTTP_IF_MODIFIED_SINCE\']) == filemtime(__FILE__))'."\n";
	$css.= "\t".'{'."\n";
	$css.= "\t".'header(\'Last-Modified: \'.gmdate(\'D, d M Y H:i:s\', filemtime(__FILE__)).\' GMT\', TRUE, 304);'."\n";
	$css.= "\t".'}'."\n";
	$css.= "\t".'else'."\n";
		$css.= "\t\t".'{'."\n";
		$css.= "\t\t".'header(\'Last-Modified: \'.gmdate(\'D, d M Y H:i:s\', filemtime(__FILE__)).\' GMT\', TRUE, 200);'."\n";
		$css.= "\t\t".'header(\'Content-Length: \'. filesize(__FILE__));'."\n";
		$css.= "\t\t".'}'."\n";
$css.= '?>'."\n\n";

//CSS content
$css.= 'body {'."\n";
	$css.= "\t".'background-color: '.$fckEditor_backcolor.';'."\n";
	$css.= "\t".'color: '.$row_rsdesign['rubrique_menu_back_color'].';'."\n";
	$css.= "\t".'font-size: 26px;'."\n";
	$css.= "\t".'font-family: "Times New Roman", Times, serif;'."\n";
	$css.= "\t".'padding: 5px;'."\n";
	$css.= "\t".'margin: 0'."\n";
$css.= '}'."\n\n";

$css.= 'body,'."\n";
$css.= 'td {'."\n";
	$css.= "\t".'font-family: "Times New Roman", Times, serif;'."\n";
	$css.= "\t".'font-size: 16px // taille de la police dans la zone de texte'."\n";
$css.= '}'."\n\n";

$css.= 'a {'."\n";
	$css.= "\t".'color: -moz-hyperlinktext !important;'."\n";		
	$css.= "\t".'text-decoration: -moz-anchor-decoration'."\n";
$css.= '}'."\n\n";

$css.= '.Bold {'."\n";
	$css.= "\t".'font-weight: bold'."\n";
$css.= '}'."\n\n";

$css.= '.Title {'."\n";
	$css.= "\t".'font-weight: bold;'."\n";
	$css.= "\t".'font-size: 18px;'."\n";
	$css.= "\t".'color: #cc3300'."\n";
$css.= '}'."\n\n";

$css.= '.Code {'."\n";
	$css.= "\t".'border: #8b4513 1px solid;'."\n";
	$css.= "\t".'padding-right: 5px;'."\n";
	$css.= "\t".'padding-left: 5px;'."\n";
	$css.= "\t".'color: #000066;'."\n";
	$css.= "\t".'font-family: \'Courier New\' , Monospace;'."\n";
	$css.= "\t".'background-color: #ff9933'."\n";
$css.= '}'."\n\n";

$file_css = fopen('Css/css.css.php', 'w+'); // Ouverture du fichier css (si non existant, création du fichier)
fwrite($file_css, $css); // Remplissage du fichier
fclose($file_css); //Fermeture du fichier

mysql_free_result($rsdesign);
?>


Le deuxième bout de code, car généré un fichier css.css.php qui est ton fichier CSS en PHP en DUR. Seul les headers sont traités pour vérifier si le cache est à jour côté navigateur (en partant du principe que le bout de code fonctionne, je ne l'ai pas testé).

Donc comme le fichier doit renvoyer sa date de dernière modification, ainsi que le statut de la transaction (200 si modifié), ça devrait forcer le navigateur à télécharger de nouveau le fichier. Sinon, il ne le télécharge pas de nouveau.

La charge serveur est ... ridicule ainsi.

Par contre, il ne faut pas oublier les "golden rules" en code, côté PHP :
- Utilisation de simple quote en priorité au double quote (sur des millions d'opération, j'ai déjà lu, je ne sais où, que c'était un chouilla mieux)
- Mieux vaut découper une variable en plusieurs fois qu'un gros bloc (permet en plus, de gérer l'indentation du code)
- Bien indenté son code (meilleure lisibilité)
- Bien commenté son code (meilleure maintenabilité)
- Ne pas dupliquer ses fonctions, si elle n'existe pas, elle doit exister ailleurs, alors il faut inclure le fichier qui contient la function, et ne pas la réécrire (meilleure maintenabilité)
- Essayer de limiter un maximum les comparateurs, si on l'utilise plusieurs fois, autant faire le traitement une fois, et c'est fini, ensuite vérifier que la variable existe ou non est plus rapide

Code CSS :
- Dans le premier bloc, pour les 2 ID différent, une seule règles changeait, autant les grouper tant que possible, tant que ça ne gène pas la compréhension
- Le dernier ; n'est pas obligatoire dans les règles CSS de chaque sélecteur, autant gagner un petit octet =)
- Les règles CSS peuvent être réduite, par exemple : margin: 5px 5px 5px 5px; peut être écrit : margin: 5px; (9octets de gagnés)

Côté SQL :
- Toujours indiqué quels champs on souhaite récupérer (pas de SELECT *)
- Préféré mysql_fetch_assoc à mysql_fetch_array (2 fois plus de donnée à traiter, car les résultats disponibles sont $var['nom'] et $var[0] (cumul du fetch_assoc + fetch_row), ou alors, indiquer le type de résultat attendu, par exemple MYSQL_ASSOC, mais du coup, autant prendre le fonction éponyme.

Pour aller plus loin, pourquoi ne pas utiliser la PDO pour faire tes connexions SQL ?

A terme, les fonction "mysql_*" ne seront plus supportée, autant sauté le pas maintenant ? Surtout pour un CMS Smiley cligne

EDIT: Le forum déforme l'indentation du code, le voici en ligne : http://dl.free.fr/ih8ORWV4n
Modifié par Super_baloo8 (13 Mar 2012 - 21:12)
Eh bien que dire de plus Smiley smile

Effectivement avec tes explication c'est plus clair, je vais m'approprier tout ça Smiley langue
Rien à dire

Tes explications très clair et surtout très constructive vont me permettre de faciliter l'administration et supprimer ce qui est inutile.

Je vais aussi voir par là Smiley smile pour la PDO car il faut effectivement évoluer

Merci Smiley smile