2013-06-26 9 views
1

En utilisant PHP/Joomla, j'essaie d'exporter la sauvegarde de la base de données dans le fichier CSV/sql à télécharger. Certaines tables ont un très grand nombre d'enregistrements. Quand je commence à l'exportation, il donne l'erreur suivante: Erreur fatale: temps d'exécution maximum de 30 secondes a dépasséExporter automatiquement la base de données MySql en CSV en utilisant PHP/Joomla

Note: Je ne veux pas utiliser le « max_execution_time » ou « set_time_limit() » ou tout php. paramètres ini. Parce que je vais utiliser ce script sur différents serveurs clients & je ne dirai pas à chaque client de modifier les paramètres. J'ai besoin du script PHP/Joomla, pas d'extensions.

S'il vous plaît aidez-moi.

+0

Avez-vous essayé d'exporter chaque table dans son propre fichier séparé? – iTom

+0

Oui. j'ai essayé. certains exportent mais à certaines tables il donne une erreur d'exécution. – Joomladev

+0

Vous êtes SOL. Si l'une de ces tables nécessite plus de 30 secondes à traiter, un délai d'attente se produira; même casser la table basse DB par table. Et je doute fortement que vous allez les exporter ligne par ligne, puis utiliser lecture/écriture encore et encore au niveau du serveur; ce serait un tel porc de ressources. – Ohgodwhy

Répondre

0

Vous pourriez même devoir scinder les enregistrements de chaque table en différents fichiers.

+0

Je pense que cela ne marchera pas. parce que j'ai d'énormes données dans de nombreux tableaux et je vais exécuter ce script tous les jours. – Joomladev

1

Étant donné que certaines tables contiennent énormément de données, cela prendra un certain temps. Par conséquent, la connexion expirerait et l'exportation échouerait.

Une meilleure approche consiste à utiliser la ligne de commande pour vider les données en tant que SQL. Vous pourriez vouloir regarder la commande mysqldump.

Vous pouvez également appeler la commande mysqldump à partir d'un script PHP comme celui-ci -

<?php 
# Database Settings 
$tmpDir = "/home/<username>/tmp/"; // Temp location the user has access to 
$user = "<username>_******"; // MySQL Username for the database 
$password = "*******"; // MySQL Password 
$dbName = "<username>_******"; // Database name, usually in the pattern: <username>_<dbname> 
$dbHost = "localhost"; // Mysql server hostname, usually localhost 

$sqlFile = $tmpDir . $dbName . date('Y_m_d') . ".sql"; // The dumped SQL File 
$attachment = $tmpDir . $dbName . "_" . date('Y_m_d') . ".tgz"; // TGZed file 

$creatBackup = "mysqldump -h '" . $dbHost . "' -u '" . $user . "' --password='" . $password . "' '" . $dbName . "' > '" . $sqlFile . "'"; // Full command 
$createZip = "tar cvzf $attachment $sqlFile"; // Full Command 

// Execute 'em 
system($creatBackup); 
system($createZip); 

Cela devrait créer un dump SQL et créer une archive hors de lui.

Les codes ci-dessus font partie d'un outil que j'ai construit pour m'envoyer des sauvegardes quotidiennes de mes bases de données. Vous pouvez le vérifier sur Github et le modifier en fonction de vos besoins - https://github.com/masnun/mysql-backup-to-email

+0

Je l'ai essayé. mais travaille maintenant. Une bibliothèque doit-elle être incluse? J'ai seulement changé les paramètres de connexion DB. – Joomladev

+0

Veuillez vous assurer que la commande mysqldump est disponible. Sur un serveur Linux, cela fait généralement partie du paquetage mysql-client. Si vous êtes sur un serveur partagé, vous l'avez probablement déjà. Aucune bibliothèque externe n'est nécessaire. – masnun

+0

Je crée une extension et cela va utiliser sur différents serveurs. Cela ne fonctionnera donc pas si la commande mysqldump n'est pas installée. Y a-t-il un autre moyen ou logique? – Joomladev

0

je suggère que, au lieu de réinventer la roue que vous utilisez Akeeba Backup car il vous permettra de créer des sauvegardes automatiques de votre site entier, ou tout simplement les fichiers ou les répertoires spécifiques, ou seulement la base de données ou des tables spécifiques ou toute combinaison que vous pouvez penser.

C'est également gratuit.

It's won awards year after year, highly évalué sur le Joomla Extension Directory et nous l'utilisons sur tous nos sites et nos sites clients.

Si vous obtenez the Pro version, vous pouvez même effectuer une sauvegarde sur Amazon S3 ou d'autres systèmes utiles.

Je n'ai aucune affiliation avec Akeeba autre que j'aime utiliser leurs produits - ils me laissent dormir la nuit.

+0

C'est BEAUCOUP plus facile que de passer un tas de temps à essayer de le faire fonctionner vous-même. Surtout que vous prévoyez d'utiliser ceci sur différents serveurs clients. Akeeba rend trivial le déplacement d'un site d'un serveur à un autre. Pourquoi réinventer la roue? –

+0

Oui je sais akeeba est très bon mais je crée une extension/produit. Donc, je ne peux pas dire à chaque client qui utilise Akeeba pour sauvegarder les données. Si je crée mon script, je l'utiliserai aussi comme un cronjob. – Joomladev

+0

D'accord, votre question n'indiquait pas clairement que vous essayiez de faire cela dans le cadre d'une composante - jetez un coup d'œil à ma nouvelle réponse pour quelque chose de similaire à ce que nous avons fait. À la vôtre: D – Craig

2

Compte tenu de vos commentaires à ma réponse précédente, je vous suggère de créer un Joomla! CLI (jetez un oeil dans le répertoire /cli de votre installation Joomla 2.5+).

Nous avons fait la même chose que vous pour la version Pro de notre extension Easystaging que nous avons développée pour un usage interne, pour gérer les sites Web des clients avec des processus d'approbation de contenu particuliers. La version interne a dû répondre aux exigences de nos clients plus importants.

Effectivement, nous avons créé une classe qui hérite de JApplicationCli et peut être lancée par CRON ou à partir de l'interface utilisateur de nos composants. par exemple.

class EasyStaging_PlanRunner extends JApplicationCli 
{ 
    /** 
    * Entry point for the plan funner (yes it's more fun) 
    * 
    * @return void 
    * 
    * @since 2.5 
    */ 
    public function doExecute() 
    { 
    } 
} 

Si elle est lancée par l'utilisateur à partir de Joomla nous utilisons une méthode utilitaire pour vous assurer que les fourches du système hors tension correctement:

/** 
* Runs the script in the background by scheduling it with the `at` daemon and returns the result 
* 
* @param string $pathToScript A path to the script to run e.g. "/path/to/my/cli/app.php" 
* 
* @return int 
*/ 
private function _runScriptInBackground($pathToScript) 
{ 
    $cmdPath = "/usr/bin/php -q $pathToScript"; 

    // We need '2>&1' so we have something to pass back 
    $cmd  = 'echo "' . $cmdPath . '" | at now 2>&1'; 
    $result = shell_exec($cmd); 

    return $result; 
} 

Depuis ce forum fonctionne efficacement en tant que script de ligne de commande un lot des limites sont beaucoup plus lâches mais ils ne vous permettront toujours pas d'avoir une très grande table. (Certains de nos clients ont plusieurs milliers d'articles ou de moins bons éléments de contenu K2). Pour contourner cela, nous avons écrit une méthode d'exportation appelée à partir de notre boucle de répartition principale de doExecute() pour récupérer et exporter des lignes de table dans des lots raisonnables. Pour nous raisonnable a été déterminée par la valeur des bases de données distantes max_allowed_packet et nous créons un fichier SQL avec des déclarations qui correspondent à cette limite avec une petite allocation pour divers frais généraux. Vous ne pouvez pas avoir ces problèmes, mais même si vous devriez probablement décomposer votre SQL en déclarations de taille raisonnable insert. Une fois le plan terminé, nous compressons tous les fichiers et les envoyons à l'archive.

Questions connexes