|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Futur Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 135 ![]() |
Bonjour à tous !!
Je fais appelle à vous pour réaliser un projet que j'ai ! Je vous explique, je veux créé des tableaux de statistiques à partir de fichier qui se trouve sur une url fixes http://wiki.fr.grepolis.com/wiki/Donn%C3%A9es_mondes Comme par exemple : http://fr1.grepolis.com/data/players.txt.gz Je voudrais en fait que toute les heures, ce fichier (pour commencer) soit téléchargé, décompressé et classé dans une base Mysql de façon à pourvoir insérer les données dans un tableau J'espère avoir été clair |
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() ![]() |
Bonjour,
Pour effectuer une action à intervalles réguliers, il faut programmer ton système d'exploitation pour qu'il déclenche l'éxécution automatiquement : LINUX -> Cron Job - WINDOWS -> Scheduled Tasks.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
|
00
|
|
|
#3 | |
|
Futur Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 135 ![]() |
Citation:
|
|
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() ![]() |
Non y'a rien, ta tâche récurrente doit juste appeler ton script php de traitement à intervalles réguliers. Tu trouveras des tonnes d'exemples sur le web.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
|
00
|
|
|
#5 |
|
Futur Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 135 ![]() |
D'accord ! Très bien ! Maintenant ... vif du sujet ... la façon de créer ce script ^^
|
|
|
00
|
|
|
#6 |
![]() ![]() Développeuse PHP/Java Inscription : avril 2007 Messages : 3 665 ![]() |
Un script PHP pour tâche récurrente, c'est comme un script PHP classique, à ceci près qu'au lieu de le lancer via un navigateur, c'est la tâche planifiée qui va le lancer.
Donc il faut que tu écrives un script PHP qui fait ce qui tu veux que ta tâche fasse. Tu pourras le tester en lançant en ligne de commande ou simplement en l'appelant dans ton navigateur comme n'importe quel autre script php
__________________
Modératrice PHP Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur) Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) |
|
|
00
|
|
|
#7 | ||||
|
Invité régulier
![]() Inscription : avril 2007 Messages : 18 ![]() |
Tu peux faire un script de remplissage de données
Code :
Code :
|
||||
|
|
00
|
|
|
#8 | ||||
|
Membre du Club
![]() Inscription : octobre 2011 Messages : 50 ![]() |
Je travaille actuellement sur une map Grepo, c'est ton jour de chance:
Code :
Code :
Code :
$req = mysql_query("TRUNCATE TABLE towns"); Petit conseil maintenant: Je te déconseille de travailler avec Mysql car des tables avec 120 000 entrées et des requêtes avec jointures, ca va être lent très lent ! Alors si tu travaille sur un site de stat je te conseilles de garder les fichiers .txt et de travailler dessus. Comme ça en plus tu peux garder un historique et créer des graphiques d'évolution sans devoir créer 400 tables. et pour mettre à jour tu as juste 10 fichiers à dl car l'incorporation des fichiers dans la base prend près de 2h à full 100% serveur (dual core 2.4). Pour exemple une requête qui verifie qu'une ile est habitée en comparant la table towns et islands m'a pris la matinée et elle s'est jamais terminée alors que ça a pris 2min en conservant les .txt Si tu veux que le script s'exécute à intervalle régulier, RDV dans le menu 'Cron' de ton hébergeur Tu peux me contacter IG si tu veux ! Meme pseudo sur Upsilon ! |
||||
|
|
00
|
|
|
#9 | |
|
Expert Confirmé
![]() ![]() |
Citation:
J'ai utilisé MySql avec des tables de plusieures dizaines de millions d'enregistrements, jointures et tout ce qui va avec et je peux t'assurer que c'est indolore. Ensuite tu gagnerais en vitesse si tu n'incluais pas le fichier connection.php à chaque boucle dans le foreach. Et puis ton histoire qui t'évite de devoir créer 400 tables pour des graphiques, je suis dubitatif. C'est clair qu'avec un système organisé comme cela semble être le cas, tu m'étonnes qua ça rame.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
|
|
10
|
|
|
#10 | |
![]() ![]() Développeuse PHP/Java Inscription : avril 2007 Messages : 3 665 ![]() |
Citation:
Si connection.php se contente de faire une connexion à la base de données (genre mysql_connect), inutile de le faire n fois : une connexion à la base de données reste ouverte tant qu'elle n'est pas explicitement fermée (ou jusqu'à la fin du script si la connexion est non persistante).
__________________
Modératrice PHP Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur) Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) |
|
|
|
00
|
|
|
#11 |
|
Membre du Club
![]() Inscription : octobre 2011 Messages : 50 ![]() |
Oui, en effet, je l'ai sortit de la boucle mais j'ai oublié de l'effacer dans la boucle ! :s Je corrige ça immédiatement !
T'as jamais oublié une ligne, un point virgule ou un dollars ??? T'es pas obligé d... Un Update de 120.000 entrées et non pas un bête insert ou select. Il faut updater les 120k entrées et non pas updater 1 entrée dans une table de 120k. Rien que l'insertion prend quelques minutes. l'update dans une boucle évidemment puisqu'elle va chercher les données dans un .txt va prendre les données une à une pour les comparer une à une dans la bdd ca doit faire un peu près 120k.120k comparaisons et réédition. Au lieu de faire un match dans 2 chaines issues de 2 fichiers .txt.... :s Surtout s'il veut exécuter les scripts de màj toutes les heures ! OMG 500.000 lignes à inserer, updater ou effacer toutes les heures ! (bah ouais, y'a 10 fichiers) Sans compter les requêtes nécéssaires aux visiteurs. Et en plus ca simplifie la mise à jour car il n'y'a qu'à telecharger 10 fichiers. Mtnt peut être que j'me trompes mais c'est pas à cause du mysqlconnect dans la boucle car la requête update avec la jointure dépasse le temps impartit quand je l'exécute dans phpmyadmin. Si quelqu'un à une solution pour modifier un champ sur chaque ligne des 120.000 lignes de la table 'islands' en fonction d'une valeur trouvée dans la table 'towns', et ce en moins de 30sec histoire que ce soit de la rigolade pour le serveur, je suis preneur. http://fr1.grepolis.com/data/islands.txt.gz http://fr1.grepolis.com/data/towns.txt.gz |
|
|
00
|
|
|
#12 |
|
Futur Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 135 ![]() |
C'est vraiment gentil ! Merci de votre aide ! Je teste ça demain ! Je suis vraiment à fond dans ce projet
KstorTroy : excellent que tu sois sur Grepo ! Je vois que tu es sur le forum de Grepolis, tu dois me connaitre ^^ Je contacterais ! |
|
|
00
|
|
|
#13 | ||
|
Expert Confirmé
![]() ![]() |
Citation:
La 1ère phrase est Citation:
En plus si la structure de tes fichiers ne change pas, il te suffira de purger tes tables d'import à la fin de tes traitements et cela restera réutilisable lors du prochain jeu de données à injecter. Tu peux également purger tes données dans des tables "history". Et au pire tu crées une procédure stockée qui profite des optimisations internes du moteur MySql à l'opposé d'une séquence de requêtes SQL envoyées depuis PHP. Et en terme de performances, tu devrais voir une sacrée différence. @plus
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
||
|
20
|
|
|
#14 | |
|
Membre du Club
![]() Inscription : octobre 2011 Messages : 50 ![]() |
Merci, ça à l'air magique vu comme ça. Je connaissais pas.
Je teste ça immédiatement ! ![]() Citation:
![]() +
|
|
|
|
00
|
|
|
#15 |
|
Futur Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 135 ![]() |
Je suis en train de tester le script du haut ! J'ai effectivement testé la fonction cron de l'hébergeur qui marche parfaitement !
Tient moi au courant sur la méthode que tu vas tester |
|
|
00
|
|
|
#16 |
|
Futur Membre du Club
![]() Étudiant Inscription : juin 2011 Messages : 135 ![]() |
J'ai créé le fichier connection.php, j'ai testé, ça me remplit ma base avec les bonnes données !!
|
|
|
00
|
|
|
#17 | ||
|
Membre du Club
![]() Inscription : octobre 2011 Messages : 50 ![]() |
Voilà le magikscript :
Great tks à rawsrc qui m'a lancé sur la route... Code :
Il y'a moyen d'optimiser la fonction cf ici mais une bonne partie des optimisations sont inutiles lorsque les données sont importées dans une table vide et le script s'exécute assez rapidement à mon goût. Je vais mettre ce script dans une autre boucle pour màj les données des xxxx serveurs, ca devrait prendre moins de 60 secondes. En effet, c'est BEAUCOUP plus rapide. Que plaisir pour les yeux mais surtout quel soulagement pour le serveur de pouvoir faire CA : Y'avait pas besoin de ceci: Je ne purgerai pas les données pour les mettre dans des tables history car si je comptes bien, rien que pour les serveurs francais, j'aurai plus de 200 tables. C'est grave si j'me retrouve avec des tables de 1.000.000 d'entrées ? Sinon, j'éfface: mysql_query("TRUNCATE TABLE $nomtable") Aucune notion de 'procédures stockées' avec mysql, je vais travailler dessus maintenant. ![]() Toujours pas de solution pour modifier rapidement les 120.000 entrées d'une table. Je vais voir si les procédures stockées vont remédier à ça. . |
||
|
|
00
|
|
|
#18 | |
|
Expert Confirmé
![]() ![]() |
Citation:
Je ne t'en voudrai pas si tu es précis.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
|
|
10
|
|
|
#19 |
|
Membre du Club
![]() Inscription : octobre 2011 Messages : 50 ![]() |
J'ai trouvé une solution alternative pour modifier les 120.000 entrées car je n'ai besoin de faire qu'une fois cette opération pour mettre au point la map.
Mais j'aimerais modifier 27.000 entrées. Il y'a 2 colonnes 'island_x' et 'island_y' dans la table 'towns' ce n'est pas la position de la ville mais la position de l'île sur laquelle se trouve la ville. Hors ces positions sont déjà dans la table 'islands'. La position réelle d'une ville sur la map est trouvée grâce à la position de l'île, grâce à la position de la ville sur l'île mais aussi grâce au type d'île. Je dois donc pour positionner une ville sur la map aller chercher 2 informations dans la table 'islands'. En comparant les colonnes 'island_x' et 'island_y' de la table towns et les colonnes 'x_pos' et 'y_pos' de la table islands'. En bref je dois remplacer les colonnes 'island_x' et 'island_y' par une colonne 'island_id' dans la table 'towns' pour faciliter la jointure. Et j'ai besoin que cette opération soit performante parc'qu'elle sera récurrente. http://forum.grepolis.net/showthread.php?t=5589 |
|
|
00
|
|
|
#20 | |||
|
Expert Confirmé
![]() ![]() |
Citation:
Code :
J'ai fait un test sur les fichiers mis à disposition sur le site et le temps de traitement de la requête ci-dessus est de 265 ms sur une petite config donc sur un serveur cela devrait être sacrément plus court (je récupère tout le jeu de données)
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
|||
|
10
|
Copyright © 2000-2012 - www.developpez.com