2010-12-14 108 views
0

Je traite un grand fichier .gz en utilisant PHP (transfert de données de gz vers mysql) cela prend environ 10 minutes par fichier .gz. J'ai beaucoup de fichier .gz à traiter. Après que PHP a terminé avec un fichier, je dois changer manuellement le script PHP pour sélectionner un autre fichier .gz, puis réexécuter le script manuellement.Comment planifier le script PHP sur Job Finish (from CLI)

Je souhaite que le travail suivant soit exécuté automatiquement pour traiter le fichier suivant. le fichier gz est nommé comme 1, 2, 3, 4, 5 ... Je peux simplement faire une boucle pour être quelque chose comme ceci (fichier de processus: 1 - 5):

for ($i = 1 ; $i >= 5; $i++) 
{ 
    $file = gzfile($i.'.gz') 
    ...gz content processing... 
} 

Cependant, depuis la Le fichier gz est vraiment gros, je ne peux pas le faire, car si j'utilise cette boucle, PHP exécutera plusieurs gros fichiers gz en tant que travail de script unique. (prend beaucoup de mémoire)

Ce que je veux faire est après que PHP est fini avec un travail que je veux un nouveau travail pour traiter le prochain fichier.

peut-être ça va être quelque chose comme ceci:

$file = gzfile($_GET['filename'].'.gz') 
    ...gz content processing... 

Merci

Répondre

3

Si vous nettoyez après le traitement et gratuit toute la mémoire en utilisant unset(), vous pouvez simplement envelopper tout le script dans une boucle foreach (glob(...) as $filename). Comme ceci:

<?php 
foreach (glob(...) as $filename) { 
    // your script code here 
    unset($thisVar, $thatVar, ...); 
} 
?> 
+0

merci, la méthode est similaire à la méthode @ ern0. J'ai appris la fonction glob() de vous. Cela peut être utile pour moi. Merci – bbnn

0

Ce que vous devez faire est

  • Programmer une tâche cron pour exécuter votre script php toutes les x minutes
  • Lorsque le script est exécuté, vérifiez s'il existe un fichier de verrouillage, sinon créez-en un et commencez le traitement du fichier gz non traité suivant, si oui abo rt
  • Attendez que la file d'attente pour être effacé
+0

Est-il possible d'écrire un programme pour Cron? Je pensais cron seulement planifier des emplois en utilisant des intervalles de temps. Comment puis-je écrire le script? – bbnn

+0

Configurer un job cron avec des sémaphores * à la place * d'un seul cycle est assez bizarre et inefficace. – ern0

+0

@ ern0: n'hésitez pas à élaborer sur votre déclaration. –

0

Vous devriez appeler le script PHP avec argument, à partir d'un script shell. Voici le doc comment utiliser les paramètres de la ligne de commande dans PHP

Ou, je ne peux pas l'essayer maintenant, mais vous pouvez donner une chance à unset ($ file) après le traitement du gzip.

for ($i = 1 ; $i >= 5; $i++) 
{ 
    $file = gzfile($i.'.gz') 
    ...gz content processing... 
    unset($file); 
} 
+0

Je vais essayer quand le traitement actuel est terminé – bbnn