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

Signaler
Messages postés
50
Date d'inscription
samedi 11 janvier 2003
Statut
Membre
Dernière intervention
8 août 2009
-
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
-
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

Messages postés
510
Date d'inscription
lundi 27 novembre 2006
Statut
Membre
Dernière intervention
5 juillet 2009
3
Tu proposes le téléchargement de quelle facon ?

Donne le code de ta page de téléchargement.
Messages postés
50
Date d'inscription
samedi 11 janvier 2003
Statut
Membre
Dernière intervention
8 août 2009

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();
?>
Messages postés
510
Date d'inscription
lundi 27 novembre 2006
Statut
Membre
Dernière intervention
5 juillet 2009
3
Oui, si tu fais un readfile, il va charger le fichier en mémoire... Php5 est surement plus optimisé, et le charge par bouts.
Messages postés
50
Date d'inscription
samedi 11 janvier 2003
Statut
Membre
Dernière intervention
8 août 2009

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
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
41
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);}