Erreur fatale

Petit nouveau ! | 4 Messages

14 janv. 2009, 10:40

Bonjour,

je travaille sur un projet qui génère un fichier pdf de grande taille. Le problème est qu'il arrive un moment ou mon script ne fonctionne plus.

Le message est du genre : "PHP Fatal error: Out of memory (allocated 606339072) (tried to allocate 181408979 bytes) in C:\wamp\www\file_pdf\fpdi.php on line 432".

J'ai passé le memory_limit à -1, et rien n'y fait.

L'impression que j'ai, c'est que php n'arrive pas à écrire le fichier sur le disque car il est trop gros. En effet, le script se déroule correctement jusqu'à ce stade puis bloque et me renvoie le code erreur.

Connaissez vous un tel problème ? Y a-t-il des paramètres permettant de le résoudre ?

merci et @+

ViPHP
ViPHP | 5924 Messages

14 janv. 2009, 10:48

Ah mais il a pas dépassé la memory limit, il a juste dépassé la taille de la RAM. Alors -1 ou pas -1 si ya plus de RAM ya plus de RAM… Bref, tu dis que c'est un gros pdf mais 600 Mo c'est pas un peu abusé ?

Bref, il va sans dire que tu ne peux même pas songer à garder un tel script…

Petit nouveau ! | 4 Messages

14 janv. 2009, 11:10

Je sais bien que ça parraît trop lourd, mais mon script me permet de générer un fichier pdf à partir d'une base de donnée. Ce fichier pdf est lourd et truffé de liens, ce qui m'impose de le créer en une seule fois. A moins qu'il y ai une autre solution à ce niveau ...

Je précise que je suis malheureusement contraint de conserver ce système de fichier car les autres solutions que j'ai proposées ne convenaient pas à mes interlocuteurs ...

En attendant de trouver mieux, est-ce que rajouter de la ram à mon PC suffirait à repousser ce problème ? Je dois fournir mon petit fichier rapidement, ce qui limite ma marge de manœuvre ...

Au fait, le fichier ne fait pas 600 Mo. Il se situe plutôt aux alentours de 150 MO.

merci de ta réponse

@+

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

14 janv. 2009, 11:48

Bonjour,

Un ajout de RAM pourrait effectivement résoudre ton problème.
Sinon une solution alternative pour générer un PDF qui serait moins gourmand en terme de ressource serait de générer un XML avec PHP et ensuite de générer le PDF avec FOP, toutefois, ça t'oblige à recoder la partie génération PDF et si tu n'as jamais utilisé FOP ce n'est pas évident au début, donc la solution la + simple d'ajouter 1 ou 2Go RAM semble plus raisonnable :)
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 4 Messages

14 janv. 2009, 12:31

Merci pour l'info, je vais me pencher sur le sujet car c'est une démarche qui me paraît un peu obscure ...

Si je comprends bien il faut que je récupère toutes mes données dans un fichier XML en les formatant, puis utiliser FOP uniquement pour la génération du fichier PDF ?

Est-ce que je ne risque pas d'être confronté au même problème ? Les ressources necessaires risquent d'être aussi importantes ...
En fait le volume de données que je dois présenter me semble tout simplement incompatible avec le format PDF, mais pour le coup je n'ai malheureusement pas eu le choix.

Pour tester avec de la RAM supplémentaire il va falloir attendre un peu, car je n'en ai pas sous la main...

@+ et encore merci

ViPHP
ViPHP | 2287 Messages

14 janv. 2009, 12:58

Une alternative serait d'augmenter la taille de mémoire virtuelle de ton système (en attendant l'achat de RAM). Une autre possibilité serait d'exporter ce (lourd) travail dans une tâche en ligne de commande, moins gourmande en mémoire, et d'optimiser au maximum.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Petit nouveau ! | 4 Messages

14 janv. 2009, 17:19

J'ai bien l'impression que dans cette config il n'y a pas de solution miracle. Je viens quand même de réussir à contourner l'erreur en activant la compression du pdf généré. Apparemment ça suffit à rester en dessous du seuil "critique". Normalement ça devrait aller comme ça car je suis presque arrivé au bout de mon travail.

Je vais quand même essayer d'optimiser mon code pour être moins gourmand.


@+