Vous n'êtes pas identifié.

#1 06-11-2009 00:04:49

oscim
Administrateur
Date d'inscription: 25-09-2007
Messages: 903
Réputation :   
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 :   

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 sad

Hors ligne

 

#3 06-02-2010 10:27:48

johnhummer
Membre actif
Date d'inscription: 30-12-2009
Messages: 37
Réputation :   

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 smile). 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 :   
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 :   

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 wink ? Merci...

Hors ligne

 

#6 07-02-2010 12:34:49

oscim
Administrateur
Date d'inscription: 25-09-2007
Messages: 903
Réputation :   
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 :   

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 :   
Site web

Re: modif oscss et forte charge

Salut,

De rien smile

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

 

Pied de page des forums

Powered by PunBB and MyBestBB