Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Enchainer des fichiers .php

11 views
Skip to first unread message

Denis Beauregard

unread,
Nov 24, 2009, 5:44:50 PM11/24/09
to
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 ?

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

Pascal

unread,
Nov 25, 2009, 9:48:35 AM11/25/09
to
Denis Beauregard a �crit :
> Bonjour,

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

CrazyCat

unread,
Nov 25, 2009, 9:48:35 AM11/25/09
to
Denis Beauregard wrote:
> Mon h�bergeur a bloqu� la fonction mysql LOAD INFILE et je
> dois la remplacer par une s�rie d'�nonc�s SQL.

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

Olivier Miakinen

unread,
Nov 25, 2009, 9:48:35 AM11/25/09
to
Le 24/11/2009 23:44, Denis Beauregard a ᅵcrit :
>
> 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 ?

<meta http-equiv="refresh" content="60; URL=http://truc/page2"> ?

--
Olivier Miakinen

Jean-Francois Ortolo

unread,
Nov 25, 2009, 9:48:35 AM11/25/09
to
Le 24/11/2009 23:44, Denis Beauregard a �crit :


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

Jean-Francois Ortolo

unread,
Nov 25, 2009, 5:50:42 PM11/25/09
to
Rebonjour

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 ?

Denis Beauregard

unread,
Nov 25, 2009, 5:50:43 PM11/25/09
to
Le 24 Nov 2009 22:44:50 GMT, Denis Beauregard
<denis.b-at-franc...@nospam.com.invalid> �crivait dans
fr.comp.lang.php:

>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

0 new messages