Mon h�bergeur a bloqu� la fonction mysql LOAD INFILE et je
dois la remplacer par une s�rie d'�nonc�s SQL.
Le hic, c'est que j'ai 2,5 millions d'�nonc�s � ins�rer...
Y a-t-il une m�thode simple pour qu'une page en PHP soit
ex�cut�e, puis apr�s un temps arbitraire (au retour de la
fonction mysql_query par exemple) appeler une autre page ?
Comme alternative, je pourrais lire les �nonc�s SQL dans un
fichier et les envoyer � mysql_query un apr�s l'autre mais
j'aurais encore le probl�me de l'encha�nement des pages PHP.
J'avais pens� � un �nonc� <img src="page412.php">
� la fin de la page, mais cela ne me semble pas tr�s �l�gant.
Denis
Bonjour,
> Mon h�bergeur a bloqu� la fonction mysql LOAD INFILE et je
> dois la remplacer par une s�rie d'�nonc�s SQL.
> Le hic, c'est que j'ai 2,5 millions d'�nonc�s � ins�rer...
Je pense � une solution interm�diaire, qui consisterait � utiliser LOAD
INFILE sur une installation locale o� serait dupliqu�e la structure de
la table, puis un export en SQL des donn�es vers un fichier, toujours
local, qu'il suffira de passer en import au serveur via l'interface
d'administration MySQL de l'h�bergeur (phpMyAdmin, je suppose).
Faut juste faire attention au volume (en MB) et, peut-�tre, faire un
import par lot.
Cordialement,
Pascal
Est-ce que par hasard tu ne pourrais pas utiliser la commande MySQL
"SOURCE" ?
> Y a-t-il une m�thode simple pour qu'une page en PHP soit
> ex�cut�e, puis apr�s un temps arbitraire (au retour de la
> fonction mysql_query par exemple) appeler une autre page ?
Rien ne t'emp�che, si ta page n'affiche rien (n'envoie pas de headers),
de faire en fin de script quelque chose comme:
<?php
sleep(100);
header("Location: page.php?num=1");
?>
--
R�seau IRC Francophone: http://www.zeolia.net
Aide et astuces : http://www.g33k-zone.org
Communaut� Francophone sur les Eggdrops: http://www.eggdrop.fr
<meta http-equiv="refresh" content="60; URL=http://truc/page2"> ?
--
Olivier Miakinen
Bonjour Monsieur
A supposer au pire qu'il y ait au moins une table SQL qui ne puisse
pas �tre lue d'une traite, vous avez certainement des index dans vos
tables, tels qu'il soit possible de lire vos tables de mani�re
fractionn�e, en sp�cifiant des s�lection du genre
"SELECT * FROM table WHERE index LIKE <expression> ORDER BY index;"
A ce moment-l�, vous alimentez une variable indic�e du type :
$table[0] = "table_1";
$table[1] = "table_2";
$table[2] = "table_3";
... etc ...
En d�but de votre script, et puis �ventuellement une autre variable
indic�e � deux indices :
$critere[0][0] = "critere_1_1";
$critere[0][1] = "critere_1_2";
... etc ...
$critere[1][0] = "critere_2_1";
$critere[1][1] = "critere_2_2;
... etc ...
Vous avez donc un simple script comportant au d�but toutes ces
affectations. Pour chaques tables, vous voulez les sauver chacune dans
un fichier ASCII avec tous leurs champs, s�par�s mettons par un
caract�re "\t" ( tout autre caract�re sera correct, pourvu qu'il soit
discriminant ). Le nom du fichier sera index� pareil ( n'importe quel
pr�fixe fait l'affaire ) :
$fichier[0] = "fichier_1";
$fichier[1] = "fichier_2";
... etc ...
Apr�s toutes ces affectations, vous avez donc le script, qui doit
�tre lanc� plusieurs fois, pour fractionner les �critures dans chaque
fichiers.
Vous devez donc avoir deux param�tres : Mettons $i et $j
Le script sera lanc� sur votre navigateur, avec les param�tres $i=0
et $j=0, et s'ex�cutera tant que :
- Soit la table courante sera enti�rement lue et �crite dans le
fichier correspondant,
- Soit la dur�e d'ex�cution du script mesur�e apr�s chaque
incr�mentation du param�tre $j � l'int�rieur du script, du script exc�de
un d�lai qui d�pend du d�lai maximum d'ex�cution du script.
Je vous conseille de fixer cette limite � 1/3 ou 1/4 de ce d�lai
maximum d'ex�cution, pour laisser, si limite non atteinte, le temps �
l'it�ration suivante de $j, de s'effectuer.
- Soit, apr�s incr�mentation de $j � l'int�rieur du script, $j
devient sup�rieur � $j_max[$i] ( $j_max[$i] est la valeur maximale de $j
telle que $critere[$i][$j] a �t� aliment�e en d�but de script ).
Si l'une des conditions ci-dessus n'est pas v�rifi�e, vous devz
fermer le fichier en cours, puis vous avez deux solution :
- Soit la table courante a �t� enti�rement lue et �crite dans le
fichier correspondant. Dans ce cas, vous incr�mentez $i, vous fixez $j =
0, puis vous v�rifiez si $table[$i] est aliment�e, dans ce cas, vous
faites une instruction de relocation 302 avec header, du type :
header("Location: votre_script.php?i=$i&j=0");
exit;
Ces deux instructions vous permettent de relancer facilement le m�me
script, avec les param�tres ajust�s.
- Soit la table courante n'a pas �t� enti�rement lue et �crite dans
le fichier correspondant, auquel cas vous avez encore deux solutions :
- La dur�e d'ex�cution mesur�e apr�s chaque incr�mentation du
param�tre $j dans le script, exc�de le d�lai fix�. Vous devez fermer le
fihcier courant avec fclose($fp); A ce moment-l�, vous avez incr�ment�
$j, si $criter[$i][$j] est aliment�, m�me chose : Il faut faire une
redirection 302 avec ces deux param�tres :
header("Location: votre_script.php?i=$i&j=$j");
exit;
- Enfin, deuxi�me solution de la deuxi�me solution ;) $j apr�s
incr�mentation devien sup�rieur � $j_max[$i]. En fait cel� revient �
dire que la table courante a �t� enti�rement lue et �crite dans le fichier.
Donc vous incr�mentez $i, puis si $table[$i] est aliment�e, vous
faites une relocation pareil, avec $j = 0:
header("Location: votre_script.php?i=$i&j=0");
exit;
Voil�. Tout le probl�me est de fixer les crit�res $critere[$i][$j]
suivant les dimensions et le contenu des tables, pour qu'un lecture
d'une table sur ce crit�re, puisse �tre faite en un seul lancement de
script.
C'est � vous � examiner le contenu des tables, faires des SELECT sur
crit�res ( probablement avec PhpMyAdmin ), pour trouver des crit�res pas
trop s�lectifs, mais pas trop gourmands en quantit� d'enregistrements.
Une choses encore: Vous devez ouvrir en d�but de script ( apr�s
affectation des variables indic�es ), le fichier en append, et non pas
en �criture simple.
Voici donc l'instruction :
$fp = @fopen($fichier[$i][$j], "a");
if(!$fp)
{
echo "Erreur a l'ouverture du fichier $fichier[$i][$j] en append<br>\n";
exit;
}
En ce qui me concerne, mon h�bergeur me fournit la possibilit� de
faire des sauvegardes avec une interface web d�clenchant l'utilitaire
mysql_dump.
Bien � vous.
Amicalement.
Jean-Fran�ois Ortolo
Je me suis tromp� dans les requ�tes sur crit�res.
Sachant qu'il y a un certain nombre de crit�res :
$critere[0][0] = "...";
$critere[0][1] = "...";
$critere[0][2] = "...";
...etc...
$critere[1][0] = "...";
...etc...
Et surtout ( j'avais oubli� cel� : )
$index[0] = "...";
$index[1] = "...";
... etc...
Les ordres SQL sont les suivants :
$sql = "SELECT * from $table[$i] WHERE $index[$i]>=$critere[$i][$j]
AND index[$i]<$critere[$i][$j + 1] ORDER BY index";
Ceci �atant entre quotes doubles, les variables sont interpr�t�es.
Pour $index[$i] , vous prenez de pr�f�rence une PRIMARY KEY de la
table $table[$i] , ce n'est th�oriquement pas strictement n�cessaire,
pourvu que ce soit un index, quel que soit son type ( alphab�tique ou
num�rique ), peut importe.
Donc, pour chaque $i vous avez une liste de limites des select, puis
vous terminez la liste ( pour chaque $i ) par un crit�re correspondant �
$critere[$i][$j_max[$i]] plus grand que la plus grande valeur de index
dans la table $table[$i]
Evidemment, pour chaque $i vous affectez $j_max[$i] en d�but de script.
Cette m�thode de s�lection assure, qu'il n'y aura pas
d'enregistrements copi�s plusieurs fois dans le fichier correspondant.
Pour le probl�me du traitement en fin de SELECT : mesure du temps
�coul� depuis le d�but du script, v�rification que le d�lai est
inf�rieur � la limite fix�e ( en fonction du d�lai maximum d'ex�cution
d'un script, fix� par votre h�bergeur ), puis traitement en fonction des
conditions non remplies, vous incr�mentez si besoin $j, puis si
$j>=$j_max[$i] , sortie de la boucle, fermeture du fichier ( fclose($fp
); ), puis incr�mentation de $i, v�rification que $table[$i] existe.
Si $table[$i] existe, lancement du m�me script avec les param�tre
i=$i et j=0 , sinon le traitement est termin�.
Simple n'est-ce pas ?
>Bonjour,
>
>Mon h�bergeur a bloqu� la fonction mysql LOAD INFILE et je
>dois la remplacer par une s�rie d'�nonc�s SQL.
>
>Le hic, c'est que j'ai 2,5 millions d'�nonc�s � ins�rer...
>
>
>Y a-t-il une m�thode simple pour qu'une page en PHP soit
>ex�cut�e, puis apr�s un temps arbitraire (au retour de la
>fonction mysql_query par exemple) appeler une autre page ?
Merci � tous pour les id�es.
Voici ce que je suis en train de faire.
- un petit logiciel en C++ qui va transformer la BDD en �nonc�s
SQL, sans doute par blocs de 10 ou 100 insertions (il y a en
moyenne 240 caract�res par ligne et 23 champs). Le r�sultat
sera quelque chose comme 25 fichiers de 100000 insertions.
- un script en PHP qui va lire chaque ligne, faire l'insertion
et noter ce qu'il a fait, via une session. Un premier essai
pour �valuer combien d'insertions avant le time out, puis on
fera le 1/3 de ce nombre, avec un header() pour encha�ner au
suivant.
25 fichiers, c'est parce qu'il faudra sauter un certain nombre
de lignes. 25, cela donne autour de 24 Mo par fichier, ce qui
n'est pas trop �lev� je pense, mais je verrai � l'usage.
Denis