modif oscss et forte charge

Version stable courante
téléchargement osCSS 1.2.2 RC

Messagepar oscim » Ven 06 Nov 2009, 02:04

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: Tout sélectionner
$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: Tout sélectionner
  $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: Tout sélectionner
    $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: Tout sélectionner
$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: Tout sélectionner
$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: Tout sélectionner

Puis en lg 219
Code: Tout sélectionner

checkout_shipping_adress en lg 194

enfin dans held_process en lg 58
Code: Tout sélectionner
  $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: Tout sélectionner
    $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 édition par oscim le Ven 06 Nov 2009, 02:09, édité 1 fois.
Pour un web au normes du W3C, pour un web plus propre !

- Download osCSS Toutes versions
- stable osCSS 2.1.0 (help|info|new dev) Official help|wiki|Tuto for osCSS 2 | doc doxygen
- Utiliser le tracker pour suivre les évolutions et développements
- Inscrivez vos sites sur oscss pour présenter vos réalisations
Avatar de l’utilisateur
oscim
Site Admin
 
Messages: 1643
Inscription: Mar 25 Sep 2007, 11:33

Messagepar johnhummer » Sam 06 Fév 2010, 08:22

Bonjour,

Je ne sais pas ce que cela vaut, mais le forum d'osCommerce propose:

Code: Tout sélectionner
  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 :(
johnhummer
Membre actif
 
Messages: 34
Inscription: Mer 30 Déc 2009, 11:56

Messagepar johnhummer » Sam 06 Fév 2010, 12:27

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...
johnhummer
Membre actif
 
Messages: 34
Inscription: Mer 30 Déc 2009, 11:56

Messagepar oscim » Sam 06 Fév 2010, 16:36

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 édition par oscim le Sam 06 Fév 2010, 16:38, édité 1 fois.
Pour un web au normes du W3C, pour un web plus propre !

- Download osCSS Toutes versions
- stable osCSS 2.1.0 (help|info|new dev) Official help|wiki|Tuto for osCSS 2 | doc doxygen
- Utiliser le tracker pour suivre les évolutions et développements
- Inscrivez vos sites sur oscss pour présenter vos réalisations
Avatar de l’utilisateur
oscim
Site Admin
 
Messages: 1643
Inscription: Mar 25 Sep 2007, 11:33

Messagepar johnhummer » Dim 07 Fév 2010, 09:15

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: Tout sélectionner
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...
johnhummer
Membre actif
 
Messages: 34
Inscription: Mer 30 Déc 2009, 11:56

Messagepar oscim » Dim 07 Fév 2010, 14:34

Salut

La var envoyé à paypal nommé invoice, contient le numero de commande qui doit être unique.

Donc dans ma class paypal , j'ai
Code: Tout sélectionner
$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: Tout sélectionner
$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 édition par oscim le Dim 07 Fév 2010, 14:40, édité 1 fois.
Pour un web au normes du W3C, pour un web plus propre !

- Download osCSS Toutes versions
- stable osCSS 2.1.0 (help|info|new dev) Official help|wiki|Tuto for osCSS 2 | doc doxygen
- Utiliser le tracker pour suivre les évolutions et développements
- Inscrivez vos sites sur oscss pour présenter vos réalisations
Avatar de l’utilisateur
oscim
Site Admin
 
Messages: 1643
Inscription: Mar 25 Sep 2007, 11:33

Messagepar johnhummer » Lun 08 Fév 2010, 06:35

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...
johnhummer
Membre actif
 
Messages: 34
Inscription: Mer 30 Déc 2009, 11:56

Messagepar oscim » Lun 08 Fév 2010, 14:22

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 2.1.0 (help|info|new dev) Official help|wiki|Tuto for osCSS 2 | doc doxygen
- Utiliser le tracker pour suivre les évolutions et développements
- Inscrivez vos sites sur oscss pour présenter vos réalisations
Avatar de l’utilisateur
oscim
Site Admin
 
Messages: 1643
Inscription: Mar 25 Sep 2007, 11:33


Retourner vers osCSS 1.2.2 RC

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron