Problème de mise en cache dans la mémoire (php& apache)

cs_oshin Messages postés 50 Date d'inscription samedi 11 janvier 2003 Statut Membre Dernière intervention 8 août 2009 - 3 août 2008 à 09:51
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 3 août 2008 à 13:23
Salut à tous,

J'ai un GROS problème URGENT.

J'ai un serveur dédié avec apache et php installé :
Apache/1.3.37 (Unix) mod_gzip/1.3.19.1a PHP/4.4.4 mod_ssl/2.8.28 OpenSSL/0.9.6m

et sur mon serveur web tourne un script d'upload et donc, avec des liens de download pour télécharger ces mêmes fichiers..
Mon problème est le suivant :

Lorsque quelqu'un clique pour TELECHARGER un fichier, apache ou php, le charge en mémoire avant de lancer le téléchargement. Sur de petit fichier ça ne pose aucun problème, mais sur des gros fichiers de 700mo, ça démoli toute la ram et le swap...

Ma question est la suivant :

Quel réglage dois je faire sur php ou apache pour arrêter cette mise en cache des données en mémoire ? Je n'arrive pas à trouver et google ne m'a guerre aidé.. !

5 réponses

Bling 182 Messages postés 510 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 5 juillet 2009 3
3 août 2008 à 10:16
Tu proposes le téléchargement de quelle facon ?

Donne le code de ta page de téléchargement.
0
cs_oshin Messages postés 50 Date d'inscription samedi 11 janvier 2003 Statut Membre Dernière intervention 8 août 2009
3 août 2008 à 11:28
Voici le code de la page qui lance le téléchargement.
En faite... c'est le readfile qui charge en mémoir le fichier avant..
mais en local sur mon ordinateur sous php5 et apache2 j'ai pas ce probleme.. je pense pas que ça vienne du fait que j'ai php4 ?

<?php

define('UPLOAD_SAFE',true);
if(file_exists('./includes/config.php'))
{
  include('./includes/config.php');
  include('./includes/tools.php');
 
  // ip a bloquer - chaque ip separé par une virgule
  $upload_cfg['_ip_blackliste'] = generate_banlist($upload_cfg['_rep_script'].'/includes/');
}
else
  exit('Le fichier config.php n\'est pas au bon endroit.');

// utilisateurs de FREE : penser à creer un repertoire sessions à la racine de votre site
session_start();

// est ce que l'on est dans la liste des ip banni ?
if(in_array($_SERVER['REMOTE_ADDR'],$upload_cfg['_ip_blackliste']))
  exit('Votre IP est banni du service de téléchargement.

');

// est ce que l'on demnde un mot de passe pour accéder au système d'upload ?
if($upload_cfg['_use_password_view'] === true)
{
  if((!isset($_SESSION['myphpupload_user_password']) || $_SESSION['myphpupload_user_password'] != $upload_cfg['_user_password']) && !check_connexion($upload_cfg['_admin_login'], $upload_cfg['_admin_pass']))
  {
    include('./connexion.php');
    exit();
  }
}

// on recupere l'id du fichier à affiché
if(!isset($_GET['i']) || empty($_GET['i']))
  exit("Paramètres manquants");
else
  $id = quote_smart($_GET['i']);

$requete = "SELECT id,ref,date,file,ip,nbr_view,nbr_dl FROM ".$upload_cfg['_sqltable']." WHERE ref='$id'";
$sql = mysql_query($requete);
$nbr = mysql_num_rows($sql);

if($nbr == 0)
  exit('Fichier invalide');
else
{
  $post = mysql_fetch_array($sql);
  $fichier = $post['file'];
  $date = $post['date'];
}

// on doit verifier que le fichier existe belle et bien. on pourrai avoir supprime le fichier mais pas l'enregistrement dans la base
if(!file_exists($upload_cfg['_rep_secret'].'/'.$fichier))
  exit("Fichier inexistant");

// y'a t'il une limitation sur temps ?
$now = mktime();
if($upload_cfg['_limite'] == 1)
{
  // si oui, on test la validité
  $max_validite = $date + $upload_cfg['_limite_validite'];
  if($max_validite < $now && !check_connexion($upload_cfg['_admin_login'], $upload_cfg['_admin_pass']))
    exit("Fichier périmé");
}

// incremente de +1 les telechargements
$nbr_dl = ($post['nbr_dl']+1);
mysql_query("UPDATE ".$upload_cfg['_sqltable']." SET nbr_dl='$nbr_dl' WHERE ref='$id'");

$urlFichier = $upload_cfg['_rep_secret'].'/'.$fichier;

// le nom de fichier
$filename = substr($fichier,32);

// son extension
$ext = get_file_ext($fichier);

// selon l'extension on choisi le type d'entete a declarer
switch($ext) {
  case "gz": $type = "application/x-gzip"; break;
  case "tgz": $type = "application/x-gzip"; break;
  case "zip": $type = "application/zip"; break;
  case "pdf": $type = "application/pdf"; break;
  case "psd": $type = "application/psd"; break;
  case "eps": $type = "application/eps"; break;
  case "png": $type = "image/png"; break;
  case "gif": $type = "image/gif"; break;
  case "jpg": $type = "image/jpeg"; break;
  case "txt": $type = "text/plain"; break;
  case "htm": $type = "text/html"; break;
  case "html": $type = "text/html"; break;
  default: $type = "application/octet-stream"; break;
}

// on envoi les entetes - important pour que le telechargement se lance meme si le navigateur voudrai l'ouvrir.
header("Content-disposition: attachment; filename=".$filename);
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: $type\n");
header("Content-Length: ".filesize($urlFichier));
header("Pragma: no-cache");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
header("Expires: 0");

// on lance le telechargement
readfile($urlFichier);

//Phpstats
define('__PHP_STATS_PATH__','/home/upme/www/phpstats/');
include(__PHP_STATS_PATH__.'php-stats.redir.php');

exit();
?>
0
Bling 182 Messages postés 510 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 5 juillet 2009 3
3 août 2008 à 12:11
Oui, si tu fais un readfile, il va charger le fichier en mémoire... Php5 est surement plus optimisé, et le charge par bouts.
0
cs_oshin Messages postés 50 Date d'inscription samedi 11 janvier 2003 Statut Membre Dernière intervention 8 août 2009
3 août 2008 à 12:30
Effectivement, le problème vient de php4 qui fait "chier",
le problème c'est que j'ai un dédie redhat 7.2 de chez ovh... une usine à gaz, pour installer php5 la dessus, c'est la merde. Grr -_-

Je crois que je vais installer debian et faire une install propre avec ce que j'ai besoin :P
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
3 août 2008 à 13:23
salut

remplace

readfile($urlFichier);

par un fopen, un while, un feof, un fread, et un fclose

t'as des exemples sur la page :
http://fr2.php.net/fopen


notement un truc genre :

while(!feof($proxy_fp)) {$proxy_cont .= fread($proxy_fp,4096);}
0
Rejoignez-nous