Je connais pas mal Php, je maîtrise les fonctions de base d'Apache, mais je débute complètement avec Linux.
Sur une architecture LAMP, je vais avoir besoin d'effectuer chaque nuit de gros traitements de maintenance sur mon serveur web.
De gros traitements, c'est : importer de gros fichiers textes de plusieurs dizaines de milliers d'enregistrements, les scanner, en contrôler les données, récupérer des fichiers images vers lesquels il pointent (plusieurs centaines à plusieurs milliers), recadrer ces images à différents formats puis les recopier ; pour enfin insérer tout ça proprement dans une base de données.
Tout ça, j'ai l'habitude de le faire en PHP (travail sur fichiers textes, librairie GD ou autre) et de programmer des crons qui me lancent tout ça au milieu de la nuit.
Mais que je commence à me poser des questions sur la viabilité et la fiabilité de ce système sur des traitements aussi lourds.
- Je sais bien que l'on peux augmenter le timeout de scripts Php pour empêcher qu'ils tombent en rade. Mais malgré la stabilité de Php5 est-ce que c'est le bien langage le plus adapté pour ce genre de tâche ?
- Dans quelle mesure les procédures stockées de Mysql5 apportent-elles un bénéfice de performance, pour ces gros traitement SQL ?
- Les crons, on peut les lancer à des heures précises. Mais est-ce qu'on pourrait pas mieux organiser une liste séquentielle de tâches à effectuer ? Ce serait plus rassurant que de fixer arbitrairement des heures éloignées en priant pour que deux scripts ne fiissent pas par se marcher sur les pieds.
En dehors de Php + cron, sous une architecture LAMP, comment faire tout ça ?
J'ai commencé à me renseigner sur le shell en Linux, mais pour qui vient du Php, c'est effrayant. J'ai même du mal à identifier si ça peut être une solution pour moi.
N'hésitez à m'expliquer ça comme à un gamin de six ans, avec une histoire de grenouilles et faisant des grosses voix d'animaux, c'est comme ça que je comprends le mieux.
# Mon avis sur la question.
Posté par LaBienPensanceMaTuer . Évalué à 5.
Bien que le shell unix puisse sembler assez ... obscure, il est le plus adapté pour ce genre de tache, et je te rassure, tu peux certainement te passer d'utiliser le quart des syntaxes barbares que tu as pu croiser dans les différents tutoriels sur le net !
En effet, tu disposes d'outils puissants et rapides car écrit en C pour faire toutes ces taches.
Par exemple:
_ pour "parser" tes enregistrements depuis tes fichiers textes, tu as les outils awk, grep, sed, cut, tail, head qui sont voués à ces taches.
_ pour retravailler tes images tu as convert issu de la suite ImageMagick qui excellera.
_ mysql pour faire des requêtes mysql, l'exemple typique serait ici de "générer" un fichier contenant toutes tes requêtes puis de le faire executer par mysql à coup de mysql < le fichier.
La souplesse de Linux n'exclut pas non plus une utilisation conjointe de php, le shell scripting, Perl/Python/...
Maintenant, pour répondre concrétement à tes questions:
Le timeout PHP n'a d'incidence que lorsque tu lances un script php via Apache il me semble. Or ce genre d'opération n'a pas à être lancé via apache, mais plutot par un appel php -f ton_script.php
Sisi, c'est d'ailleurs la base du shell Unix !
Soit trois script php : script1.php, script2.php et script3.php renvoyant 0 en cas de succés.
Si tu ajoutes une crontab de cette forme:
10 4 * * * php -f /chemin/script1.php && php -f /chemin/script2.php && php -f /chemin/script3.php
Alors si script1.php échoue et renvoie une valeur différente de 0, le reste de la chaine ne sera pas executé.
La syntaxe command1 && command2 équivaut à dire je lance command2 si et seulement si command1 s'est terminé avec succés.
J'espère avoir éclairé un peu ta lanterne, si t'as d'autres questions ou besoin de précisions, hesite pas !
[^] # Re: Mon avis sur la question.
Posté par El_Riiico . Évalué à 1.
Merci pour ces quelque pistes, je vais creuser un peu tout ça , je sens que la cafetière va tourner jusque tard dans la nuit.
Ah, déjà une question : à part les sites de référence de type Lea linux, t'aurais une ou deux adresses ou je pourrais trouver des infos pratiques ?
Sinon je ferai chauffer google...
[^] # deux adresses :
Posté par slack . Évalué à 2.
http://casteyde.christian.free.fr/system/linux/guide/online/(...)
Tu y trouveras toutes les bases de linux bien expliquées.
Si tu cherches des informations sur les scripts bash :
http://www.tldp.org/LDP/abs/abs-guide.pdf
[^] # Re: Mon avis sur la question.
Posté par romain . Évalué à 3.
En outre, pour la petite histoire, la base provient d'une fusion de 6 bases distinctes (2 millions de lignes, 1 Go de données), fusion assurée en PHP dans un script qui a tourné pendant ~4 heures sur une bonne machine. C'était un traitement moyennement lourd (rien à voir avec ce qui se fait en banque), mais qui m'a assuré de la bonne stabilité de PHP.
Il est bon d'utiliser l'outil le plus adapté pour chaque tâche, mais il est aussi bon de ne pas se disséminer dans plusieurs langages différents, sous peine de rendre l'ensemble moins facile à appréhender.
Cela dépend grandement de ce que tu fais, mais si ton code peut facilement s'articuler autour d'un truc objet, PHP et Perl sont parfaitement adéquats, et je dirais même préférables dans la mesure où ils peuvent être plus lisibles et modulables que des scripts bash.
L'idée de chaîner les traitements dans le cron est pas mal ; je ne connaissais pas. Spontanément, j'aurais implémenté un automate au dessus de mon process pour gérer la synchronisation de chaque traitement, et notamment les rapports d'erreurs éventuelles, mais c'est un peu le syndrôme Not Invented Here qui se manifeste.
# php
Posté par fabien . Évalué à 2.
serieux, je en vois pas pourquoi.
le temps necessaire (la lourdeur) ne pose pas de probleme a cron donc c'est comme si tu lancais ceci depuis la ligne de commande.
pour en revenir au PHP, c'est tres efficace (en terme de dev surtotu si tu connais dejà le php) en C tu va en chier grave avec les API graphique (j'ai mois même crée un script en php pour découper une image en fonction de zones blanche.. enfin bref, j'ai pas passé 3 jour à essayé de faire marcher les API, c'etait du tout cuit, un vrai bonheur)
on peu considerer le PHP comme etant un script bash avec plein d'API, c'est de l'interpreté (ya plein de script sous unix/linux qui sont des script on en est pas mort)... ensuite quel obligation de perf tu as puisque ca tourne la nuit? est-ce important si au lieu de mettre 3 heure ca n'en mets qu'une seul ???? (pourquoi perdre des jour de programmation pour ...?)
un batch quoi ?
ben je te propose un fichier batch depuis lequel tu lance tes appel php, pas de probleme.
le plus serieusement (d'apres ce que tu dis et que tu laisse voir par rapport a tes competences) : le PHP c'est bien pour toi.
# Ok, merci à tous
Posté par El_Riiico . Évalué à 2.
Pour chaque enregistrement de chaque fichier, il faut successivement :
extraire, comparer et sauvegarder les modifications des données, dézipper un fichier lié, y récupérer 5 photos (parfois de plusieurs Mo chacune), en faire différentes mignatures, coller tout ça dans la base, et passer au suivant en repérant les doublons et les incohérences.
Quand on sait que ces étapes vont à terme être répétées plusieurs dizaines de milliers de fois par nuit, il y a de quoi se mettre sérieusement à réfléchir avant de se lancer à corps perdu dans le code.
Je crois que je vais continuer à faire les traitements en Php5 comme auparavant. Je vais juste m'essayer aux précédures stockées Mysql5 qui peuvent me faire gagner du temps sur les étapes de contrôle.
Pour le reste, je vais commencer des tests de performance, et envisager l'achat de serveurs suplémentaires si nécessaire.
Je pense juste utiliser l'idée de Cron de Gérald qui a l'air pratique, ou utiliser un batch si ça facilite la gestion des alertes en cas de problème.
Merci pour vos réponses.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.