#1 Le 26/07/2006, à 20:58
- cb68
comment lancer un script php qui dure longtemps
Bonjour,
J'ai à transférer un fichier csv dans un base mysql. Le problème c'est qu'il a plus de 2 000 000 de lignes et je dois avoir un time out.
Comment faire pour qu'il me traite tout le fichier ? php.ini ?
Ou y a t il un astuce pour le faire en bash ?
Kubuntu 6.06 depuis 2006-07-21
les avancés de linux :
http://cb68.free.fr/cb/linux.php
Hors ligne
#2 Le 26/07/2006, à 21:01
- PhilippeP
Re : comment lancer un script php qui dure longtemps
J'ai un doute mais il y a bien un time out soit dans php.ibi soit dans apache.conf ...
Attention, je suis loin d'être un Goubunturou ...
Il m'arrive de me tromper (si si...)
Desktop Kubuntu 12.04 KDE 4.9 SC - Lenovo Ideapad S10 3T Kubuntu 12.04 KDE 4.8 SC
Hors ligne
#3 Le 27/07/2006, à 08:58
- Tonio
Re : comment lancer un script php qui dure longtemps
Ou y a t il un astuce pour le faire en bash ?
sudo apt-get install php5-cli
(ou php-cli)
puis
php script.php
Hors ligne
#4 Le 27/07/2006, à 11:11
- lunique
Re : comment lancer un script php qui dure longtemps
Je ne sais pas a quoi ressemble un fichier CSV, mais en passant directement par mysql quitte a modifier le fichier pour que sa fasse des requetes ^ ^
Sinon, un pote m'avait torché ce script perl qui permet de decouper un fichier contenant des commandes Mysql sur une seule ligne (une commande par ligne, sinon, sa peut poser des probleme lors du decoupage) qui les encapsule dans un fichier php, le transfert sur un serveur et fait la mise a jour. C'etait pour pouvoir mettre a jour un site free avec des fichiers de plus de 2M
#!/usr/bin/perl -w
#Programme pour enlever certaines lignes dans le fichier de base de donnée
use strict;
use Net::FTP; # A installer (?)
use LWP::Simple; # A installer (?)
my $login = ""; #Login pour le compte
my $pass = ""; #Password
my $sql_server = ""; #Serveur SQL
my $ftp_server = ""; #serveur FTP
my $dir_server = "BDD/"; #repertoire de stockage des fichiers php sur le serveur
my $MAX_SIZE = 1000000; #Taille maximum de chaque fichier (en octet)
#--------------------------------------- Ne pas editer après ce point -------------------------------------
my $php_debut = "<?php \$link = mysql_connect('".$sql_server."', '".$login."', '".$pass."');\n";
$php_debut .= "mysql_select_db('".$login."', \$link);\n";
my $php_req_deb = "mysql_query(\"";
my $php_req_fin = "\", \$link);\n";
my $php_fin = "\n echo 'OK'; ?>\n";
die("Usage: $0 <INPUT_FILE> <OUTPUT_DIR>\n") if(2!=@ARGV);
my ($input_file, $output_file) = @ARGV;
my $key;
die($input_file." : Fichier illisible\n") if(! -r $input_file);
die("Impossible d'ouvrir le fichier $input_file") if(! open(IN, $input_file));
print("\n--Copie--\n");
my $total=0; #total des lignes
my $size = 0; #taille des fichiers
my $fichier = 0; #numero des fichiers
open(OUT, ">".$output_file.$fichier.".php"); #ouverture du fichier 0.php
print(OUT $php_debut); #ecriture de l'en tete php
while(<IN>) # Tant qu'il y'a des lignes : /!\ On considere 1 ligne = une instruction SQL
{
#$_ =~ s/'/\'/ ; #A mettre si il faut echaper le caractere ' en \' ...
print(OUT $php_req_deb); #Debut de la requete php
chomp($_); #On vire le \n à la fin de la ligne
print(OUT $_); #On copie la requete
print(OUT $php_req_fin); #On ecrit la fin de la requete php
$size+= length($_); # longueur de la chaine qu'on ajoute au fichier (1 char = 1 octet)
if($size>$MAX_SIZE) #Si on a depassé la taille MAX
{
print(OUT $php_fin); #fin ddu fichier php
close(OUT); #fermeture du fichier
$fichier++; #fichier suivant
open(OUT,">".$output_file.$fichier.".php"); #ouverture du fichier suivant
print(OUT $php_debut); #debut du fichier
$size =0; # reinitialisation de la taille
}
$total++;
}
close(IN);
print(OUT $php_fin);
close(OUT);
print("\n");
print("Nb de lignes traitées:\t".$total);
print("\nNb de fichiers:\t".($fichier+1));
print("\n\n");
my $i=0;
my $name;
#connexion ftp au site, grace à l'objet Net::FTP
my $ftp = Net::FTP->new($ftp_server, Debug => 0, Passive =>1 ) or die("$!");
$ftp->login($login,$pass);
$ftp->cwd($dir_server);
for($i=0; $i<=$fichier; $i++)
{
$name = $output_file.$i.".php";
print("Envoi du fichier $name ...\n"); #envoi de chaque fichier sur le serveur
$ftp->put($name);
}
$ftp->quit();
print("FTP Términé..\nExecution des scripts, mise à jour de la BDD...\n");
my $content; #reponse du server
my $url = "http://".$login.".free.fr/".$dir_server;
for($i=0; $i<=$fichier; $i++)
{
print("Execution du script $i / $fichier ...");
$content = get($url.$i.".php"); #fonction LWP:Simple
if($content eq 'OK') #Si la réponse est la chaine OK, c'est que tout s'est bien installé
{
print(" OK\n");
}else
{
print(" ERREUR\n"); #Sinon il y'a eut une erreur
}
}
print("\nFIN\n");
Hors ligne
#5 Le 27/07/2006, à 11:41
- cb68
Re : comment lancer un script php qui dure longtemps
Pour info mon fichier fait plus de 100 Mega.
Je vais essayer php-cli.
Ou y a t il de la doc ?
donc ce serait un script php qu'on lance dans un bash ? Plus de timeout de apache alors ? Ce serait ça la solution.
Pour répondre au post précédent : un fichier csv c'est un fichier texte ou les champs sont séparé par des virgules ou point virgules
par exeples
champ1,champs2,champs3 etc..
chaque ligne correspond à un enregistrement. C'est assez utile pour transferer des données entre systèmes différents. le xml va le remplacer mais le xml est un fichier plat plus gros encore car pour chaque champs il y a des tags début fin etc..
Kubuntu 6.06 depuis 2006-07-21
les avancés de linux :
http://cb68.free.fr/cb/linux.php
Hors ligne
#6 Le 27/07/2006, à 16:05
- Tonio
Re : comment lancer un script php qui dure longtemps
Je vais essayer php-cli.
Ou y a t il de la doc ?
donc ce serait un script php qu'on lance dans un bash ? Plus de timeout de apache alors ? Ce serait ça la solution.
Voila. Ce te permets d'executer directement tes scripts php en ligne de commande, pas de time out, je m'en sers régulierement pour des taches longues.
Pour la doc, no sé, mais c'est vraiment pas dur à utiliser.
Hors ligne
#7 Le 27/07/2006, à 17:06
- cb68
Re : comment lancer un script php qui dure longtemps
j'arrive à me faire un echo mais pas à lire une base
Fatal error: Call to undefined function: mysql_connect() in /../../07-pfls/import.php on line 8
Avec http ca marche mais pas avec php-cli ? me manque t il quelque chose ?
Dernière modification par cb68 (Le 27/07/2006, à 17:07)
Kubuntu 6.06 depuis 2006-07-21
les avancés de linux :
http://cb68.free.fr/cb/linux.php
Hors ligne
#8 Le 27/07/2006, à 17:53
- cb68
Re : comment lancer un script php qui dure longtemps
C'est bon j'ai trouvé : je donne la réponse pour les prochain
il y a un fichier php.ini pour php-cli dans /etc/php4/cli il faut décommenter la ligne extension=mysql.so
Je ne sais pas pourquoi il faille toujours bricoller à des choses comme cela pour faire marcher à l'installation il devrait regarder si il y a mysql et ne pas activer ou mettre cette ligne !
Mais c'est pareil pour le apache !
En tout ca ca marche bien ! Merci
Maintenant on va voir pour voir si ma machine tien la charge pour 2 000 000 d'enregistrement !
http://actocom.blogspot.com/2006/07/tutorial-php-cli-lancer-php-sans.html
Dernière modification par cb68 (Le 30/07/2006, à 08:12)
Kubuntu 6.06 depuis 2006-07-21
les avancés de linux :
http://cb68.free.fr/cb/linux.php
Hors ligne