Vous n'êtes pas identifié.
AnnonceDownload / osCSS 1.2.2 RC / osCSS 2.0.9 (beta) :: See osCSS web sites, add your own |
#1 06-11-2009 00:04:49
- oscim
- Administrateur

- Date d'inscription: 25-09-2007
- Messages: 903
- Réputation : 1
- Site web
modif oscss et forte charge
Suite au probléme evoqué ici http://forums.oscss.org/viewtopic.php?id=1569, je confirme avoir résolu la plupart des pbs de commande perdu, et d'enregsitrement users.
Les modif apporté change donc uniquement les appel à la focntion tep_db_insert_id()
Pour ce faire j'ai changé les appels cette fonction, qui curieusement n'est de loing pas utilisé partout.
dans le /product info.php en lg 43
remplaacer par
Code:
$cs_s=tep_db_query("select reviews_id from " . TABLE_REVIEWS . " where products_id='".$customer_id."' and customer_id='" . (int)$_GET['products_id'] . "' ORDER BY reviews_id DESC");
$cs=tep_db_fetch_array($cs_s);
$insert_id=$cs['reviews_id'];Puis dans le fichier checkoup_process en lg 105
Code:
$cs_s=tep_db_query("select orders_id from " . TABLE_ORDERS . " where customers_id='".$customer_id."' and date_purchased='".$date_purchased."'");
$cs=tep_db_fetch_array($cs_s);
$insert_id=$cs['orders_id'];lg 177
Code:
$cs_s=tep_db_query("select orders_products_id from " . TABLE_ORDERS_PRODUCTS . " where orders_id='".$insert_id."' and products_id='".tep_get_prid($order->products[$i]['id'])."' and final_price='".$order->products[$i]['final_price']."' ");
$cs=tep_db_fetch_array($cs_s);
$order_products_id=$cs['orders_products_id'];Dans checkout_payment_adress
Code:
$cs_s=tep_db_query("select address_book_id from " . TABLE_ADDRESS_BOOK . " where customers_id='".$customer_id."' ORDER BY address_book_id DESC");
$cs=tep_db_fetch_array($cs_s);
$billto=$cs['address_book_id'];adress_book_process en lg 172
Code:
$cs_s=tep_db_query("select address_book_id from " . TABLE_ADDRESS_BOOK . " where customers_id='".$customer_id."' ORDER BY address_book_id DESC");
$cs=tep_db_fetch_array($cs_s);
$new_address_book_id=$cs['address_book_id'];Create_account en lg 194
Code:
Puis en lg 219
Code:
checkout_shipping_adress en lg 194
enfin dans held_process en lg 58
Code:
$cs_s=tep_db_query("select orders_id from " . TABLE_HOLDING_ORDERS . " where customers_id='".$customer_id."' and ip_address='".$ip."' order by orders_id DESC");
$cs=tep_db_fetch_array($cs_s);
$insert_id=$cs['orders_id'];et en lg 137
Code:
$cs_s=tep_db_query("select orders_products_id from " . TABLE_HOLDING_ORDERS_PRODUCTS . " where orders_id='".$insert_id."' and products_id='".tep_get_prid($order->products[$i]['id'])."' ");
$cs=tep_db_fetch_array($cs_s);
$order_products_id=$cs['orders_products_id'];L'ensemble de ces modif devrait vosu permettre d'eviter un certain nombre de désagrment, et de rattrapage laborieux lors de l'utilisation d'un plateforme oscss ou oscommerce en forte charge...
Ps: il ne s'agit que des modification de la partie public. notez aussi que certain module de paiement utilise aussi cette fonction.
Plusieurs fichier font aussi reference a cette fonction. Toufefois, elle est moins problématique, puisque le backoffice n'est pas exploité de la même maniére. Cela dis, lors d'enregsitrement sql en chaine sur plusieures tables elle peut être source de nombreuses erreurs..
Dernière modification par oscim (06-11-2009 00:09:21)
Pour un web au normes du W3C, pour un web plus propre !
- Download oscss Toutes versions
- stable osCSS 1.2.2Rc, beta osCSS 2.0.9 (help|wiki osCSS2)
- Utiliser le tracker pour suivre les évolutions et développements
- Inscrivez vos sites sur oscss pour présenter vos réalisations
Hors ligne
#2 06-02-2010 06:22:15
- johnhummer
- Membre actif
- Date d'inscription: 30-12-2009
- Messages: 37
- Réputation : 0
Re: modif oscss et forte charge
Bonjour,
Je ne sais pas ce que cela vaut, mais le forum d'osCommerce propose:
Code:
function tep_db_insert_id($link = 'db_link') {
global $$link;
return mysql_insert_id( $$link );
}Cela date de 2006... (http://www.oscommerce-fr.info/forum/lof … 37784.html).
La fonction mysql_insert_id a l'air de poser des problèmes suivant l'hébergeur et la version de PHP. Sur mon serveur, la fonction renvoi systématiquement 0 dans mon module PayPal IPN 
Hors ligne
#3 06-02-2010 10:27:48
- johnhummer
- Membre actif
- Date d'inscription: 30-12-2009
- Messages: 37
- Réputation : 0
Re: modif oscss et forte charge
Rebonjour,
Je puis vous dire que la modification poposée par osCommerce fonctionne très bien (mon PayPal IPN est enfin fonctionnel
). Il suffit d'éditer les fichiers database.php de includes/functions et admin/includes/functions. Beaucoup plus simple, d'autant que la conception du module PayPal IPN ne permet pas la récupération facile de l'ID en triturant les tables...
Hors ligne
#4 06-02-2010 14:36:35
- oscim
- Administrateur

- Date d'inscription: 25-09-2007
- Messages: 903
- Réputation : 1
- Site web
Re: modif oscss et forte charge
Salut,
En fait ca ne change pas vraiment la donne, ce que renvoi le formu oscom, le pbs de la function msql_insert_id, et qu'elle renvoi le dernier id dans la db .
Cependant En cas de forte charge sur le serveur, il n'est pas dis que l'id recuperer soit le bon.
Je m'explique , un client passe ca commande, et entre l'insert et la recup de l'id, un client s'enregistre.
Le mysql_insert_id ne renverra rien ou de manière erroné.
Chez mysql.org, il precise que cette fonction a ces limites ..
Quant à la recup de l'id de la commande, chez paypal un id_unique pour chaque paiement et precisé, perso , j'utilise cet id unique pour y preciser une date et le n° de commande.
Apres il me suffit de le recuperer dans la page gerant le process ipn
Dernière modification par oscim (06-02-2010 14:38:39)
Pour un web au normes du W3C, pour un web plus propre !
- Download oscss Toutes versions
- stable osCSS 1.2.2Rc, beta osCSS 2.0.9 (help|wiki osCSS2)
- Utiliser le tracker pour suivre les évolutions et développements
- Inscrivez vos sites sur oscss pour présenter vos réalisations
Hors ligne
#5 07-02-2010 07:15:28
- johnhummer
- Membre actif
- Date d'inscription: 30-12-2009
- Messages: 37
- Réputation : 0
Re: modif oscss et forte charge
Bonjour,
oscim a écrit:
En fait ca ne change pas vraiment la donne, ce que renvoi le formu oscom, le pbs de la function msql_insert_id, et qu'elle renvoi le dernier id dans la db .
Texte
Je me demande: pour chaque visiteur, y a-t-il une nouvelle connexion distincte à la BDD ? Dans ce cas, $$link est unique. En tout cas, cela a résolu mon problème d'ID à 0...
oscim a écrit:
Le mysql_insert_id ne renverra rien ou de manière erroné.
Chez mysql.org, il precise que cette fonction a ces limites ..
Texte
Oui, mais c'est inhérent aux accès concurrents. Pour que cette fonction... fonctionne comme on se l'imagine (sinon, elle fonctionne très bien), il faudrait une section critique réalisée par un sémaphore ou un mutex, ou autre.
Il me semble que cela peut être réalisé dans la BDD par LOCK TABLES pour le processus (léger) courant associé à la session.
Ou alors, en profitant de l'atomicité des requêtes SQL:
Code:
UPDATE users SET locked=1 WHERE id=1 AND locked=0
oscim a écrit:
Quant à la recup de l'id de la commande, chez paypal un id_unique pour chaque paiement et precisé, perso , j'utilise cet id unique pour y preciser une date et le n° de commande.
Apres il me suffit de le recuperer dans la page gerant le process ipn
Texte
Hum, je patauge un peu. Auriez-vous un petit bout de code
? Merci...
Hors ligne
#6 07-02-2010 12:34:49
- oscim
- Administrateur

- Date d'inscription: 25-09-2007
- Messages: 903
- Réputation : 1
- Site web
Re: modif oscss et forte charge
Salut
La var envoyé à paypal nommé invoice, contient le numero de commande qui doit être unique.
Donc dans ma class paypal , j'ai
Code:
$parameters['invoice'] = date('Y-m').'-'.substr($cart_PayPal_IPN_ID, strpos($cart_PayPal_IPN_ID, '-')+1);Pour construire un id de commande du type (aaaa-mm-n°cmd)
Ensuite dans le fichier ipn (perso à /ext/modules/paypal/)
Je decortique ma var invoice pour en recuperer le numero de commande
Code:
$order_id_invoice=substr($_POST['invoice'],8);
L'une des particularité du module paypal et que l'enregsitrement de la commande à lieux sur la page confirmation, et non process comme les autre.
Donc le numero de command eet defini a cette etape et peut donc être directement envoyé a paypal
Enfin, pour finir sur le mysql_insert_id, personnement, lors de la mise en oeuvre d'un oscss sur une site ayant quelques 1300 connexion jour, j'ai eu des erreur en cascade dans les enregistrements (user, liaison customer adress, etc .. )
Pourtant tout fonctionne tres bien lors des teste, donc sans charge.
Perso , c'est pourquoi j'ai remplacé toutes les occurence de mysl_insert_id, par un select, et un fetch_array. Certe la solution et un peu plus lourde, mais celle ci, je l'ai validé sous forte charge...
Dernière modification par oscim (07-02-2010 12:40:09)
Pour un web au normes du W3C, pour un web plus propre !
- Download oscss Toutes versions
- stable osCSS 1.2.2Rc, beta osCSS 2.0.9 (help|wiki osCSS2)
- Utiliser le tracker pour suivre les évolutions et développements
- Inscrivez vos sites sur oscss pour présenter vos réalisations
Hors ligne
#7 08-02-2010 04:35:11
- johnhummer
- Membre actif
- Date d'inscription: 30-12-2009
- Messages: 37
- Réputation : 0
Re: modif oscss et forte charge
Merci pour les infos sur le module PayPal, cela m'éclaire beaucoup sur la communication ipn.php -> paypal_ipn.php...
Pour en revenir à la question du post, je pense que le problème n'est pas lié à la charge du site (il y a plus de probabilité qu'il se manifeste lorsque la charge augmente, mais un site avec 2 utilisateurs malchanceux peut aussi connaître ce genre de mésaventure). D'ailleurs une forte charge de 50 utilisateurs, tout est relatif... C'est toute la différence entre la théorie et la pratique.
Effectivement, la solution select-fetch_array contourne le problème. Une solution (?) plus légère serait peut-être de modifier tep_db_perform pour poser un verrou sur la table modifiée, et retourner l'ID en cas d'auto-incrément ? je dis ça comme cela, je ne suis pas un spécialiste du SQL...
Hors ligne
#8 08-02-2010 12:22:36
- oscim
- Administrateur

- Date d'inscription: 25-09-2007
- Messages: 903
- Réputation : 1
- Site web
Re: modif oscss et forte charge
Salut,
De rien 
Pour la question tu tep_db_insert, effectivement, je ne suis pas un specialiste sql, donc, ou quelque part je contourne le pbs.
Cependant , la plupart des infos que j'ai trouvées vont dans ce sens.
Quant au perf, ca serait bien de commencer par vider la meme du resultat sql via tep_db_free_result...
Pour un web au normes du W3C, pour un web plus propre !
- Download oscss Toutes versions
- stable osCSS 1.2.2Rc, beta osCSS 2.0.9 (help|wiki osCSS2)
- Utiliser le tracker pour suivre les évolutions et développements
- Inscrivez vos sites sur oscss pour présenter vos réalisations
Hors ligne