IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Script PHP de migration entre 2 bases de données, timeout


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 78
    Par défaut Script PHP de migration entre 2 bases de données, timeout
    Bonjour à tous,

    Je travaille sur un script de migration entre un forum basé sur Connectix Boards et un PhpBB3.

    Jusqu'ici mon script gère :
    - importation et l'ordonnancement des forums, sous-forums et sous-sous-forums, avec leur description etc... OK.
    - conversion des noms de fichiers d'avatar puis import des avatars, OK.
    - import des utilisateurs, OK

    Pour importer les utilisateurs, j'ai fait une boucle qui traite une quantité prédéfinie d'utilisateurs, avec à chaque tour de boucle, une pause dont la durée est paramétrable, pour laisser souffler le serveur et faire en sorte que le forum ne soit pas trop impacté pendant la manip. Il y a même plusieurs niveaux de pause (tous les 10, tous les 100...) avec des temps de "repos" plus longs.

    Ensuite j'ai adapté la quantité d'utilisateurs à traiter au temps que mettait le lot à passer, avant que le timeout arrive. Je dis "timeout" mais je ne suis pas sûr du terme, mais en gros au delà d'une certaine durée, je me retrouve avec une erreur 500 et je dois recharger mon script pour reprendre.

    Si l'import se passe assez vite pour éviter le "timeout", j'ai un bouton pour relancer.

    Au final je passais mes utilisateurs par paquet de 500, et j'en avais 25000 à faire, à 20-40s le paquet, un peu long mais ça c'est bien passé.

    Je vais refaire le même système pour l'import des sujets, par contre j'en ai 50000, j'aimerais bien ne pas avoir à déclencher à la main petit lot par petit lot.

    Et surtout le pire ça sera les messages, là y'en a plus de 1,5 million, pas question de les passer par paquet de 500.

    J'ai utilisé set_time_limit(0); et ignore_user_abort(1); mais ça ne semblait pas avoir d'impact significatif et j'avais toujours des erreurs 500 si je tentais des paquets trop gros ou utilisait des pauses un peu longues (ma grosse pause était réglée sur 2/10ème de seconde au final, pas si grosse pause que ça)

    Mon idée actuelle serait de lancer l'exécution de mon script en arrière plan, en lui ajoutant un peu de log comme ça je peux me mettre en "tail -f" sur le fichier de log et observer ce qui se passe, et ajouter aussi des conditions d'interruption automatique (pas la peine qu'il bute 5min sur un enregistrement qui le bloque). Et surtout je veux un truc qui peut tourner tranquillement toute la nuit (ou plus) parce qu'il y a beaucoup de données à migrer et je ne veux pas avoir à agir pendant le traitement, juste avoir la possibilité de contrôler que ça avance bien.

    Mais peut-être que vous aurez des conseils ou des idées plus lumineuses que moi sur la question.

    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 78
    Par défaut
    Ma soluce pour l'instant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shell_exec('php -q /mypath/bgtask.php | at now');
    Dans bgtask.php j'ai mis une boucle qui écrit l'heure toutes les 6s, avec 16 itérations, dans un fichier de log.

    Si je lance directement ce script, j'ai un timeout à 1min environ et j'ai 9 ou 10 boucles d'effectuées.

    Et là avec mon code, j'ai aussi le timeout mais le script finit son boulot

    Si vous avez mieux à me proposer, n'hésitez pas. Ou si ma méthode pose problème, idem

    Merci.

  3. #3
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 574
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 574
    Par défaut
    regardez cet article :
    https://matthieu.developpez.com/execution_periodique/

    une piste serait de lancé un script qui fait plusieurs traitements pendant quelques minutes et ensuite vous configurez le lancement périodique de ce script.

  4. #4
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 78
    Par défaut
    Au final je suis resté sur la méthode que je montrais au départ.

    Crontab et compagnie pourquoi pas, mais ça m'aurait demandé de me ré-investir dans la compréhension d'une couche supplémentaire (ça fait longtemps que j'ai pas bossé avec cron) plus d'éventuels soucis de droits.

    Cette nuit j'ai importé 48000 sujets sans coup férir (après pas mal de tests unitaires ou par petits lots pour voir tous les points bloquants possibles).

    Ouf!

    Direction l'import des messages maintenant, et ça... ça va être rigolo

    Merci pour la suggestion Mathieu, y'a beaucoup de choses intéressantes dans le lien que tu suggères

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. PHP MYSQL comparaison entre 2 bases de données
    Par Jejey14 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/02/2019, 12h05
  2. migration entre 2 bases de donnees SQL-Server
    Par minota dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 03/06/2010, 18h48
  3. Script PHP de migration Postgresql vers MySQL
    Par CinePhil dans le forum Outils
    Réponses: 0
    Dernier message: 10/12/2009, 10h46
  4. Réponses: 1
    Dernier message: 12/08/2005, 16h36
  5. migration d' une base de données ?
    Par maysa dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 16/07/2004, 20h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo