A chaque fois que vous voulez utiliser les objets Word il lance un nouveau processus sur le serveur ( WINWORD.EXE ) s’il y a une erreur dans le script WINWORD.EXE n’est pas kill. Donc ce processus reste en consommant à peu près 8mo de RAM, si vous relancer le script un nouveau processus est lancé mais l’erreur elle reste donc le script affiche un message d’erreur et le 2ème processus ne meurt toujours pas donc on en est déjà à 16 mo de RAM utilisée pour rien à chaque fois que vous lancerez le script défaillant vous aurez une pénalité de 8MO avec un nouveau processus non killé. De quoi provoquer un énorme dénie de service et faire planter comme il se doit votre serveur. Bas oui si vous avez 512 mo de RAM mais que 100 personnes ont exécuté le script PHP en naviguant dessus bye-bye ça fait 800 mo de RAM pour 100 processus WINWORD qui servent à rien et qui ne seront jamais détruits. Bref votre serveur est dans la M…..

Bon rentrons dans le vif du code : à la base on vous propose ça ( exemple de base ) :


ini_set("com.allow_dcom","true");
$word = new COM("word.application") or die("Unable to instantiate Word" );
$template_file = " /devis_doc.doc";
$word->Documents->Open($template_file);
$current_date = date("m/d/Y" );
$range->Text = $current_date;
$word->Selection->TypeText("ceci est ma première page Word");
$new_file = "/devis.doc";
$word->Documents[1]->SaveAs($new_file);
$word->Quit();
$word = null;


Si par exemple « devis.doc » déclaré dans $template_file n’existe pas, c’est foutu … Ce que j’ai mentionné ci dessus s’applique pour la plus grande peine de votre serveur.

En fait si votre template *.doc est corompu l’avalanche de processus non killé relative au nombre d’execution du script se déclenchera.

Voilà un exemple de protection :


ini_set("com.allow_dcom","true");
$word = new COM("word.application") or die("Unable to instantiate Word" );
// on vérifie que le composant peut etre crée !!
if ($word == "Microsoft Word")
{
$template_file = "/devis_doc.doc";
// on vérifie que le fichier existe !!
if (file_exists($template_file)) {
$word->Documents->Open($template_file);
$current_date = date("m/d/Y" );
$range->Text = $current_date;
$word->Selection->TypeText("======================> \"$word\"");
$new_file = "/devis.doc";
$word->Documents[1]->SaveAs($new_file);
}
// S'il n'existe pas on affiche ça pour prevenir quand meme
else {
print "Le fichier $filename n'existe pas";
}
}
// Dans tous les cas on détruit le processus WINWORD.EXE
$word->Quit();
$word = null;


Ce n’est pas ultra complet mais c’est pour vous montrer le principe de protection. Si vous utiliser WORD en application web de production : Warning vous devez avoir accès aux processus étant en éxécution sur le serveur et pour les détruir. Sinon vous devrez faire un reboot sinon le serveur restera en ligne mais complètement H.S