[php] Analyse Des Ressources Necessaires

Bonjour,

j’ai recu un mail de ovh, mon hebergeur, me disant que j’utilisais bcp trop de ressource système (hebergement mutualisé) et que si je ne modifiais pas au plus vite mes script, ils se veraient obligé de desacté mon compte.

Le pb c’est que je n’ai aucune information quant à la page posant problème.

Je me demande donc cmt analyser les resources nécéssaires à l’execution d’un script, et cela, me permettant de cibler le problème.

(ovh ne me donnant aucune autre information, sauf si je désire payer un de leurs technicien biensur… :p)

Merci d’avance

titib

ps: petite precision, les scripts qui doivent bouffer des ressources sont, je suppose des script d’upload d’image. Le site consistant en une banque d’image par les utilisateurs. Donc une bonne partie des visites est constituées par des upload. Je dirais, en moyenne, une 10aines d’upload d’image de max 150ko/jours (upload+rediensionnement)

et y a un moyen d’optimiser la chose?

Ben cherches plus alors :slight_smile:

upload = bouffeur
redimensionnage = bouffer too

:slight_smile:

montre ton script, certains pourront peut-être t’aider :wink:

Malgré l’abonnement payé (car c’est pas gratuit OVH me semble t-il :??: ), ils ont le droit de supprimer ou desactiver des compte comme ça ?

ça me parait fou. On paie un service, alors on a le droit de l’utiliser à sa convenance non ?
A moins que les clauses d’OVH soient particulières et qu’ils mettent des quotas en ressources d’entrée de jeu :??:

Si c’est ça, j’irais jamais chez eux :na:

Heu t’es surtout sur un hébergement mutualisé

donc quand tu fais joujou avec tes scripts, tu bourrines aussi le bande passante des autres, ainsi que le serveur…

http://www.ovh.com/fr/espaceclient/contrat…t-mutualise.pdf

page 11, 10.2

"Le Client a la possibilité de créer et éxécuter ses propres scripts. Cette utilisation doit être raisonnable. Toutefois, dans le but de fournir un service de bonne qualité, etc (ça me fait chier de recopier un contrat que tu étais censé lire)

Ce qui m’inquiette c’est ca (qui était dans le mail)

"Votre script a besoin au minimum 27 % de la RAM
disponible sur le serveur."

Sinon je vous join mon script d’upload, comme ca vous jugez par vous meme (si c’est raisonable que ca bouffe 27% de la ram, ce qui me parait démenciel).

<?php
if($_POST['SubmitPost'] == 'Poster')
{
	$AddPhotoAlbum = $_POST['addphoto-album'];
	$AddPhotoDescription = $_POST['addphoto-description'];
	$AddPhotoFichier = $_FILES['addphoto-fichier'];
	$AddPhotoFichierTmpName = $_FILES['addphoto-fichier']['tmp_name'];      
	$AddPhotoFichierName= strtr($_FILES['addphoto-fichier']['name'], "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ", "aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn"); 
	$AddPhotoFichierName = preg_replace("/([^[:alnum:].]+)/", "", $AddPhotoFichierName); 
	$AddPhotoFichierType = $_FILES['addphoto-fichier']['type'];
	$AddPhotoFichierSize = $_FILES['addphoto-fichier']['size'];  
	$AddPhotoFichierFormat = getimagesize($_FILES['addphoto-fichier']['tmp_name']);
	$AddPhotoFichierNewName = 'b_'. $AddPhotoFichierName;
	$RepertoireDestination = URLABSOLUE . 'photos/';    
	
	$taille_octets_max = 153600; // Taille maxi du fichier, en octets.
	
	$creationrepertoire = 0;
	// vérification de l'existence du dossier de l'album
	if(!is_dir($RepertoireDestination . $AddPhotoAlbum .'/'))
	{
  // si le dossier n'existe pas, on le crée
  if(!mkdir($RepertoireDestination . $AddPhotoAlbum .'/', 0777))
  {
  	echo 'un des dossier n\'a pu etre cree';
  }
  else
  {
  	$creationrepertoire = 1;
  }
	}
	// si il existe, on passe
	else
	{
  $creationrepertoire =1;
	}
	// si: soit le dossier existe, soit le dossier a bien été crée, alors on passe a l'upload du fichier
	if($creationrepertoire == 1)
	{

  if ($AddPhotoFichier == 'none' || !$AddPhotoFichier)
  {
  	echo 'Vous devez sp&eacute;cifier un fichier à envoyer.';
  }  	
  elseif($AddPhotoFichierType != "image/png" && $AddPhotoFichierType != "image/jpeg"
  	&& $AddPhotoFichierType != "image/pjpeg" && $AddPhotoFichierType != "image/x-png")
  {
  	echo 'Le fichier doit &ecirc;tre au format JPEG ou un PNG.';
  }
  elseif($AddPhotoFichierSize > $taille_octets_max)
  {
  	echo 'Le fichier doit peser moins de '.($taille_octets_max/1024).' Ko.';
  }
  elseif($AddPhotoFichierFormat[0] > 600 || $AddPhotoFichierFormat[1]> 600)
  {
  	echo 'Dimensions maximum: 600x600';
  }
  else
  {

  	if(file_exists($RepertoireDestination . $AddPhotoAlbum .'/'. $AddPhotoFichierNewName))
  	{
    $AddPhotoFichierNewName = preg_replace("/\.([a-zA-Z]{3,4})$/i", "_".time().".\\1", $AddPhotoFichierNewName);
  	}
  	$datenow = date('Y-m-d H:i:s');

  	$queryPhoto = $db->query("INSERT INTO ". TBL_PHOTOS ." (`album` , `id-posteur` , `date-post` , `description` ,`filename`) VALUES ('". $AddPhotoAlbum ."', '". $_user_id ."', '". $datenow ."', '". $AddPhotoDescription ."','". $AddPhotoFichierNewName ."')");    	
  	if($queryPhoto)
  	{
  	
    if (move_uploaded_file($AddPhotoFichierTmpName, $RepertoireDestination . $AddPhotoAlbum .'/'. $AddPhotoFichierNewName))
    {
    	$AddPhotoFichierNewNewName = ereg_replace("^b_", "s_", $AddPhotoFichierNewName);
    	copy($RepertoireDestination . $AddPhotoAlbum .'/'. $AddPhotoFichierNewName,$RepertoireDestination . $AddPhotoAlbum .'/'. $AddPhotoFichierNewNewName);
    	$fichier = $RepertoireDestination . $AddPhotoAlbum .'/'. $AddPhotoFichierNewNewName;
    	
    	
    	$width = 150;  // Définition de la largeur maximale
    	$height = 150; // Définition de la hauteur maximale
    
    	// Cacul des nouvelles dimensions
    	list($width_orig, $height_orig) = getimagesize($fichier);
    
    	if ($width && ($width_orig < $height_orig)) 
    	{
      $width = ($height / $height_orig) * $width_orig;
    	}
    	else
    	{
      $height = ($width / $width_orig) * $height_orig;
    	}
    	$ok = 0;
    	if($AddPhotoFichierType == 'image/png' || $AddPhotoFichierType == 'image/x-png')
    	{
      // Redimensionnement
      $image_p = imagecreatetruecolor($width, $height);
      $image = imagecreatefrompng($fichier);
      imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
      
      // Affichage
      if(imagepng($image_p, $fichier))
      {
      	$ok  = 1;
      }
      else
      {
      	echo 'erreur';
      }      	
    	}
    	elseif($AddPhotoFichierType == 'image/jpeg' || $AddPhotoFichierType == 'image/pjpeg')
    	{
      // Redimensionnement
      $image_p = imagecreatetruecolor($width, $height);
      $image = imagecreatefromjpeg($fichier);
      imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
      
      // Affichage
      if(imagejpeg($image_p, $fichier, 80))
      {
      	$ok  = 1;
      }
      else
      {
      	echo 'erreur';
      }
    	}    	

    	if($ok == 1) // si ok
    	{    	
      echo 'votre image a bien &eacute;t&eacute; mise en ligne';
    	}
    	
    }    	
    else
    {
    	echo 'une erreur est survenue';
    	unlink($AddPhotoFichierTmpName);
    }    
  	}
  	else
  	{
    echo 'une erreur est survenue';
  	}
  }      	
	}
}
?>

Je n’étais pas censé les lire vu que je ne suis pas hébergé chez eux :jap:

Mais j’y pensais à une époque et je me rend compte que l’idée aurait été mauvaise finallement.

Mais ce n’est pas une spécificité d’OVH je suppose. En général, la plupart des hébergeurs ne louent pas UN serveur dédié (voire plusieurs) pour un seul hébergement (v’là la taille des salle d’hébergement sinon :paf: )

Fichtre, faudra que jaille relire les conditions de mon hébergeur pour être sur.

sinon, pour le code, pas d’idée?

Je trouve ça vache de leur part quand meme.

Même si ça use 27% de la RAM pendant un quart de seconde et une dizaine de fois par jour, on est loin de l’utilisation excessive des ressources :sarcastic:

Pour ton code, je ne suis pas spécialiste de l’optimisation.
A ta place, j’aurais juste fait une fonction qui traite les photos à uploader.

ça ne change rien aux ressources utilisées, c’est simplement plus propre (pour moi).
Maintenant concernant les fonctions utilisées, elles ont l’air d’etre toutes utilisées à bon escient (entendre par là que leur utilisation est justifiée par les tests que tu as besoin de faire). Alors je vois pas trop ce qui pourrait les remplacer :neutre:

Même en changeant la méthode, t’aura toujours besoin des fonctions de traitement de l’image, et ce sont elles qui prennent des ressources.

Bref, on tourne en rond :paf:

bah oui… je sais bien que ca tourne en rond. Mais si sur chaque upload je peux gagner qq % d’utilisation RAM, c tjs ca…

l’autre pb est qu’ils disent que j’utilise 27% de la ram, mais je ne sais pas cb je suis sencé utiliser normallement… Donc ca ne m’avance pas bcp… :stuck_out_tongue:

mais ceci dit, pq ces fct de modification d’image utilisent de la ram? De la BP je comprend, mais de la ram…

sinon, SN, tu peux pas m’aider pour l’optimisation? :stuck_out_tongue:

Bein dans le cas le plus defavorable :

toi tu utilise 27 % et 2 autres pekin aussi bein le server il charge comme une mule car ya plus de ram dispo pour les autres (100 clients) ça commence a swpaer, ça rame et plantage.

Ensuite en general sur mutualisé tu as le droit de bouffer 1 a 5 % du CPU dispo sur une journée. sachant que souvent le mutu c’est des bi proc avec 4go ou voir quadri proc.

A savoir que 27% pour du redimensionnement d’image ça m’etonne pas du tout …

donc en résumé, j’ai aucune chance de solutionner le pb, la seule solution étant de prendre un hebergement plus gros, c ca? (dédié).

:S

est-ce que qq’un peu qd meme me dire si il a une idée pour optimiser le code?

Pas forcément. T’as pas besoin de faire tous les jours tes redimensionnements

tu peux même faire ça sur ton ordinateur à toi, avec un script php (même en ligne de commande).

le problème c’est que le principe du site, c’est d’être une galerie d’image que les utilisateurs mettent en ligne. Donc je suis obliger de redimensionner les images a la volée.
La seule autre solution étant de demander aux utilisateurs deux images, une au format grand, et une au format petite… mais c’est pas terrible niveau confort d’utilisation…

titib > Ce que veux dire Sans-Nom, c’est que tu pourrais, par exemple, retarder tes redimensionements (ne pas les faire à l’upload, mais tous les jours à 5h par exemple, ou alors, les faire de chez toi de temps en temps).

j’avais compris, mais le principe est une galerie. Le redimensionnement c’est les miniature de ma galerie. Faire tout décallé, implique que les photos ne sont pas visibles tout de suite mais après un certain tps…

est-ce qq’un à une autre idée?

Sinon, qq’un vois qqch à optimiser ds mon script?

27% du bazar c’est énorme sachant qu’il doit y avoir beaucoup de monde sur ces types de serveurs…

Le problème de ces mutualisés illimités c’est qu’ils ne le sont pas illimités en vérité… je suis chez sivit et c’est le même problème concernant les limites.

Elles doivent rester dans des normes “acceptables” mais t’inquiètes qu’ils se gardent bien de répondre à la question : combien de mégas par jour, combien de hits par jour :slight_smile:

J’imagine que c’est pareil chez OVH.

Essaie de regarder d’autres script de ce style, moi j’utilise SPIP chez sivit, qui fait le redimensionnement des images et jamais sivit ne m’a fait de remarque sur ce sujet là, et pourtant pour certains articles ca chiffre pas mal le nombre de redimensionnements… peut être que tu peux dériver le code de SPIP pour résoudre ton problème.

Et ce n’est qu’un exemple évidement !

j’ai pas vraiment le temps de me taper l’analyse complete du script mais en le zieutant rapidement je remarque que tu n’as pas OBLIGATOIREMENT besoin des imagecopyresampled … trop lourd, à remplacer par des : imagecopyresized

ensuite et c’est à tester : imagecreatetruecolor -> imagecreate … ca dépendra du type d’image que te U/L tes clients, fait ton test sur différents formats .

pour avoir une idée précise de la conso de tes scipts, commence par créer une classe chrono qui va te permettre de mesurer le temps par bloc de script + total … ensuite à toi de le relier à une classe MySQL pour stocker tes résultats pendant à peine 24h, tu rajoutes ceci dans tes scripts à tester : tu sauras quel sont tes scripts trop gourmand, ce genre de chose est toujours a faire quand on met un ligne un nouveau script ou site .