Version imprimable du sujet

Cliquez ici pour voir ce sujet dans son format original

Forum osCommerce-fr _ Developpement OsC2.3 _ OSC2.3 rame et plante mon serveur

Écrit par : frogger74 21 Feb 2012, 23:02

Bonjour,



Je possède une boutique OSC 2.2, j'ai décidé de passer à la version 2.1.3, j'ai donc transféré le contenue de mon catalogue et compte client vers cette nouvelle version, j'ai en plus installé SPPC, QTPRO et ECOTAXE.

Mon OSC 2.3 fonctionne bien, sauf que cette version de OSC est très lente, même dans sa version de base, surtout le backoffice, celui ci est 10 fois plus lent que la version 2.2… je sais que je possède pas mal de produits (1500) mais quand même.

Au point de faire planter le serveur SQL, je suis sur un serveur dédié (1 giga de RAM), j'ai décidé il y à quelques jours de mettre en ligne le site, 4 heures après le serveur était saturé :

Code
Erreur Too many connections

Warning: mysql_connect() [function.mysql-connect]: Too many connections in /home/monsite.com/public_html/boutique/includes/functions/database.php on line 20

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /home/monsite.com/public_html/boutique/includes/functions/database.php on line 24

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /home/monsite.com/public_html/boutique/includes/functions/database.php on line 25

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /home/monsite.com/public_html/boutique/includes/functions/database.php on line 26

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /home/monsite.com/public_html/boutique/includes/functions/database.php on line 27
Unable to connect to database server!


J'ai donc demandé à mon héberger, celui ci me dit en gros m'indique que c'est le site osc 2.1.3 qui bug, une application php qui tourne en boucle, en me disant également que OSC, ce n'était pas viable….. bref je ne veux pas rentrer dans cette polémique, je cherche juste à comprendre ce qui cloche avec les fonction SQL, je pense que trop de connexion SQL sont ouverte …..

Voici le code de ma page function/database.php

Code
<?php
/*
   $Id$
   adapted for Separate Pricing Per Customer 2005/03/04

   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com

   Copyright (c) 2007 osCommerce

   Released under the GNU General Public License
*/

   function tep_db_connect($server = DB_SERVER, $username = DB_SERVER_USERNAME, $password = DB_SERVER_PASSWORD, $database = DB_DATABASE, $link = 'db_link') {
     global $link;

     if (USE_PCONNECT == 'true') {
       $link = mysql_pconnect($server, $username, $password);
     } else {
       $link = mysql_connect($server, $username, $password);
     }
     if ($link) mysql_select_db($database);
// Modification pour ecriture de la base SGL en CHARSET UTF-8
mysql_query("SET CHARACTER SET 'utf8'", $link);
mysql_query("SET NAMES utf8", $link);
mysql_query("SET CHARACTER_SET_CLIENT=utf8", $link);
mysql_query("SET CHARACTER_SET_RESULTS=utf8", $link);
// Modification pour ecriture de la base SGL en CHARSET UTF-8

     return $link;
   }

   function tep_db_close($link = 'db_link') {
     global $link;

     return mysql_close($link);
   }

   function tep_db_error($query, $errno, $error) {
     die('<font color="#000000"><strong>' . $errno . ' - ' . $error . '<br /><br />' . $query . '<br /><br /><small><font color="#ff0000">[TEP STOP]</font></small><br /><br /></strong></font>');
   }

   function tep_db_query($query, $link = 'db_link') {
     global $link;

     if (defined('STORE_DB_TRANSACTIONS') && (STORE_DB_TRANSACTIONS == 'true')) {
       error_log('QUERY ' . $query . "\n", 3, STORE_PAGE_PARSE_TIME_LOG);
     }

     $result = mysql_query($query, $link) or tep_db_error($query, mysql_errno(), mysql_error());

     if (defined('STORE_DB_TRANSACTIONS') && (STORE_DB_TRANSACTIONS == 'true')) {
        $result_error = mysql_error();
        error_log('RESULT ' . $result . ' ' . $result_error . "\n", 3, STORE_PAGE_PARSE_TIME_LOG);
     }

     return $result;
   }

   function tep_db_perform($table, $data, $action = 'insert', $parameters = '', $link = 'db_link') {
     reset($data);
     if ($action == 'insert') {
       $query = 'insert into ' . $table . ' (';
       while (list($columns, ) = each($data)) {
         $query .= $columns . ', ';
       }
       $query = mb_substr($query, 0, -2) . ') values (';
       reset($data);
       while (list(, $value) = each($data)) {
         switch ((string)$value) {
           case 'now()':
             $query .= 'now(), ';
             break;
           case 'null':
             $query .= 'null, ';
             break;
           default:
             $query .= '\'' . tep_db_input($value) . '\', ';
             break;
         }
       }
       $query = mb_substr($query, 0, -2) . ')';
     } elseif ($action == 'update') {
       $query = 'update ' . $table . ' set ';
       while (list($columns, $value) = each($data)) {
         switch ((string)$value) {
           case 'now()':
             $query .= $columns . ' = now(), ';
             break;
           case 'null':
             $query .= $columns .= ' = null, ';
             break;
           default:
             $query .= $columns . ' = \'' . tep_db_input($value) . '\', ';
             break;
         }
       }
       $query = mb_substr($query, 0, -2) . ' where ' . $parameters;
     }

     return tep_db_query($query, $link);
   }

   function tep_db_fetch_array($db_query) {
     return mysql_fetch_array($db_query, MYSQL_ASSOC);
   }

   function tep_db_num_rows($db_query) {
     return mysql_num_rows($db_query);
   }

   function tep_db_data_seek($db_query, $row_number) {
     return mysql_data_seek($db_query, $row_number);
   }

   function tep_db_insert_id($link = 'db_link') {
     global $link;

     return mysql_insert_id($link);
   }

   function tep_db_free_result($db_query) {
     return mysql_free_result($db_query);
   }

   function tep_db_fetch_fields($db_query) {
     return mysql_fetch_field($db_query);
   }

   function tep_db_output($string) {
     return htmlspecialchars($string);
   }

   function tep_db_input($string, $link = 'db_link') {
     global $link;

     if (function_exists('mysql_real_escape_string')) {
       return mysql_real_escape_string($string, $link);
     } elseif (function_exists('mysql_escape_string')) {
       return mysql_escape_string($string);
     }

     return addslashes($string);
   }

   function tep_db_prepare_input($string) {
     if (is_string($string)) {
       return trim(tep_sanitize_string(stripslashes($string)));
     } elseif (is_array($string)) {
       reset($string);
       while (list($key, $value) = each($string)) {
         $string[$key] = tep_db_prepare_input($value);
       }
       return $string;
     } else {
       return $string;
     }
   }
// BOF Separate Pricing Per Customer, adapted from sample code in user comments on
   // http://www.php.net/manual/en/function.mysql-list-tables.php
   // Wrap DB_DATABASE with Back Ticks, Fixes Hyphens in Database Name, code from
   // Jef Stumpf/Krumbsnatcher: http://forums.oscommerce.com/index.php?showtopic=53436&view=findpost&p=563454
   function tep_db_table_exists($table, $link = 'db_link') {
       $result = tep_db_query("show table status from `" . DB_DATABASE . "`");
       while ($list_tables = tep_db_fetch_array($result)) {
         if ($list_tables['Name'] == $table) {
             return true;
         }
       }
       return false;
   }

   function tep_db_check_age_specials_retail_table() {
       $result = tep_db_query("show table status from `" . DB_DATABASE . "`");
       $last_update_table_specials = "2000-01-01 12:00:00";
       $table_srp_exists = false;
       while ($list_tables = tep_db_fetch_array($result)) {
       if ($list_tables['Name'] == TABLE_SPECIALS_RETAIL_PRICES) {
         $table_srp_exists = true;
         $last_update_table_srp = $list_tables['Update_time'];
       }
         if ($list_tables['Name'] == TABLE_SPECIALS) {
         $last_update_table_specials = $list_tables['Update_time'];
         }
       } // end while

       if(!$table_srp_exists || ($last_update_table_specials > $last_update_table_srp)) {
          if ($table_srp_exists) {
              $query1 = "truncate " . TABLE_SPECIALS_RETAIL_PRICES . "";
              if (tep_db_query($query1)) {
                      $query2 = "insert into " . TABLE_SPECIALS_RETAIL_PRICES . " select s.products_id, s.specials_new_products_price, s.status, s.customers_group_id from " . TABLE_SPECIALS . " s where s.customers_group_id = '0'";
                      $result =  tep_db_query($query2);
                  }
          } else { // table specials_retail_prices does not exist
              $query1 = "create table " . TABLE_SPECIALS_RETAIL_PRICES . " (products_id int NOT NULL default '0', specials_new_products_price decimal(15,4) NOT NULL default '0.0000', status tinyint, customers_group_id smallint, primary key (products_id) )";
              $query2 = "insert into " . TABLE_SPECIALS_RETAIL_PRICES . " select s.products_id, s.specials_new_products_price, s.status, s.customers_group_id from " . TABLE_SPECIALS . " s where s.customers_group_id = '0'";
              if( tep_db_query($query1) && tep_db_query($query2) ) {
                   ; // execution succesfull
                  }
                 } // end else
             } // end if(!$table_srp_exists || ($last_update_table_specials....
         }

   function tep_db_check_age_products_group_prices_cg_table($customer_group_id) {
       $result = tep_db_query("show table status from `" . DB_DATABASE . "`");
       $last_update_table_pgp = strtotime('2000-01-01 12:00:00');
       $table_pgp_exists = false;
       while ($list_tables = tep_db_fetch_array($result)) {
             if ($list_tables['Name'] == TABLE_PRODUCTS_GROUP_PRICES.$customer_group_id) {
                 $table_pgp_exists = true;
                 $last_update_table_pgp = strtotime($list_tables['Update_time']);
             } elseif ($list_tables['Name'] == TABLE_SPECIALS ) {
                 $last_update_table_specials = strtotime($list_tables['Update_time']);
             } elseif ($list_tables['Name'] == TABLE_PRODUCTS ) {
                 $last_update_table_products = strtotime($list_tables['Update_time']);
             } elseif ($list_tables['Name'] == TABLE_PRODUCTS_GROUPS ) {
                 $last_update_table_products_groups = strtotime($list_tables['Update_time']);
             }
       } // end while

     if ($table_pgp_exists == false) {
       $create_table_sql = "create table " . TABLE_PRODUCTS_GROUP_PRICES.$customer_group_id . " (products_id int NOT NULL default '0', products_price decimal(15,4) NOT NULL default '0.0000', specials_new_products_price decimal(15,4) default NULL, status tinyint, primary key (products_id) )";
       $fill_table_sql1 = "insert into " . TABLE_PRODUCTS_GROUP_PRICES.$customer_group_id ." select p.products_id, p.products_price, NULL as specials_new_products_price, NULL as status FROM " . TABLE_PRODUCTS . " p";
       $update_table_sql1 = "update " . TABLE_PRODUCTS_GROUP_PRICES.$customer_group_id ." ppt left join " . TABLE_PRODUCTS_GROUPS . " pg using(products_id) set ppt.products_price = pg.customers_group_price where ppt.products_id = pg.products_id and pg.customers_group_id ='" . $customer_group_id . "'";
       $update_table_sql2 = "update " . TABLE_PRODUCTS_GROUP_PRICES.$customer_group_id ." ppt left join " . TABLE_SPECIALS . " s using(products_id) set ppt.specials_new_products_price = s.specials_new_products_price, ppt.status = s.status where ppt.products_id = s.products_id and s.customers_group_id = '" . $customer_group_id . "'";
             if ( tep_db_query($create_table_sql) && tep_db_query($fill_table_sql1) && tep_db_query($update_table_sql1) && tep_db_query($update_table_sql2) ) {
                      return true;
             }
         } // end if ($table_pgp_exists == false)
    
         if ( ($last_update_table_pgp < $last_update_table_products && (time() - $last_update_table_products > (int)MAXIMUM_DELAY_UPDATE_PG_PRICES_TABLE * 60) ) || $last_update_table_specials > $last_update_table_pgp || $last_update_table_products_groups > $last_update_table_pgp ) { // then the table should be updated
       $empty_query = "truncate " . TABLE_PRODUCTS_GROUP_PRICES.$customer_group_id . "";
       $fill_table_sql1 = "insert into " . TABLE_PRODUCTS_GROUP_PRICES.$customer_group_id ." select p.products_id, p.products_price, NULL as specials_new_products_price, NULL as status FROM " . TABLE_PRODUCTS . " p";
       $update_table_sql1 = "update " . TABLE_PRODUCTS_GROUP_PRICES.$customer_group_id ." ppt left join " . TABLE_PRODUCTS_GROUPS . " pg using(products_id) set ppt.products_price = pg.customers_group_price where ppt.products_id = pg.products_id and pg.customers_group_id ='" . $customer_group_id . "'";
       $update_table_sql2 = "update " . TABLE_PRODUCTS_GROUP_PRICES.$customer_group_id ." ppt left join " . TABLE_SPECIALS . " s using(products_id) set ppt.specials_new_products_price = s.specials_new_products_price, ppt.status = s.status where ppt.products_id = s.products_id and s.customers_group_id = '" . $customer_group_id . "'";
       if ( tep_db_query($empty_query) && tep_db_query($fill_table_sql1) && tep_db_query($update_table_sql1) && tep_db_query($update_table_sql2) ) {
           return true;
       }
         } else { // no need to update
              return true;
         } // end checking for update

   }

// EOF Separate Pricing Per Customer
?>



Peut être que SPPC etc pourrait être mieux adapté au autres contribution, du moin dans sa gestion de mysql... non? n'étant pas un grand expert en mysql , je patauge.. unsure.gif

Mais cela n'explique pas quel en serait la cause… d'autant que j'avais essayé de récupérer un peu de vitesse en supprimant des functions, mais çà n'y change rien, le problème doit être identique pour le backoffice , voir même pire , car il faut attendre presque 20 secondes à chaque action clique. (c'est sur que c'est plus rapide si je n'est qu'une centaine de produits.)

Peut être aussi le serveur dédié qui commence à saturer (1 Giga de ram), voir aussi le module MySQL du serveur (max_connections) qui pourrait être paramétré à la hausse… mais je pense qu'une optimisation du code de L'osc 2.3 serait plus intéressant.

ensuite en cherchant un peu j'ai trouvé ceci dans configure.php, y'a t'il un rapport ?
Code
define('USE_PCONNECT', 'false');
define('STORE_SESSIONS', 'mysql');


Donc, je pense changer d'hébergeur, pour passer sur un serveur dédié plus performant et infogéré par une équipe à l'écoute, car l'hébergeur actuel, n'a que faire de mes problèmes… ainsi un diagnostique pourrait être entrepris…

Bref, si vous avez une idée sur ce problème, je suis preneur… car je suis très déçu par la version OSC2.3 et je ne sais pas ou chercher, je commence à regretter son installation. confused.gif ??:

Merci pour votre aide cool.gif

Écrit par : krokus 25 Feb 2012, 10:31

Bonjour, etant sur un mutualise avec + de 2000 produits et osc 2.3, je peus te dire que ce n'est pas la 2.3 qui est en cause mais certainement un addon mal installe ou non prevue pour la 2.3.
Maintenant je ne suis pas un as, mais plus d'info sur ta config serveur serait interessant.

Écrit par : frogger74 26 Feb 2012, 14:15

Citation (krokus @ 25 Feb 2012, 10:31) *
Bonjour, etant sur un mutualise avec + de 2000 produits et osc 2.3, je peus te dire que ce n'est pas la 2.3 qui est en cause mais certainement un addon mal installe ou non prevue pour la 2.3.
Maintenant je ne suis pas un as, mais plus d'info sur ta config serveur serait interessant.


Salut

En fait c'est un serveur dédié équipé de 1Go de RAM, mon hebergeur m'indique qu'il s'agirait d'un "script php qui s'embalerais et créerait une boucle infinie."

Mais franchement , je ne vois pas le script en question, ce serais un script qui utilise aussi les ressource mysql, j'ai dessus:

-SEO ultimate URL
-SPPC
-Ecotaxe
-qtpro
- et d'autre petite contribution...

Ce qui me choc, depuis mon passage en 2.3, c'est la lenteur du backoffice angry.gif

Écrit par : Gnidhal 26 Feb 2012, 15:10

Bonjour,
déjà évoqué ailleurs, tu as à ta disposition des outils de débug intégrés concernant les lenteurs des requêtes et les moyens de localiser un problème
dans l'admin le module de traçage est assez efficace et voir le moyen de lui donner plus de précision dans le résultat ici : http://www.oscommerce-fr.info/forum/index.php?s=&showtopic=69387&view=findpost&p=360916

Écrit par : frogger74 26 Feb 2012, 23:27

Merci Gnidhal,


Tu me met sur la voix, j'ai mis en place le traçage, le fichier log explose , il est déjà à 60 mo en 10 minutes.

Par contre je n'est pas eu besoin d'ajouter ta fonction dans database.php.

Mais je suis une buse en SQL, si je regarde les log, je ne vois rien de spécial, comment savoir que tel ou tel requête consomme trop de temps d'exécution ?

comme ici:

Code
26/02/2012 22:55:02 [QUERY] SELECT products_stock_attributes
                                             FROM products_stock
                                             WHERE products_id = '4030'
26/02/2012 22:55:02 [QUERY] select configuration_group_id as cgID, configuration_group_title as cgTitle from configuration_group where visible = '1' order by sort_order
26/02/2012 22:55:02 [QUERY] select pd.products_name, pd.products_description,pd.products_description2,pd.products_description3, pd.products_condi,pd.products_contenance, pd.products_dimension, pd.products_head_title_tag, pd.products_head_desc_tag, pd.products_head_keywords_tag, pd.products_url, p.products_id, p.products_quantity, p.products_model, p.products_ref_const, p.products_avertissement, p.products_limite, p.products_on_order,  p.products_image, p.products_price,p.products_cost, p.products_weight, p.products_oversize, p.products_date_added, p.products_last_modified, date_format(p.products_date_available, '%Y-%m-%d') as products_date_available, date_format(p.products_date_available_pc, '%Y-%m-%d') as products_date_available_pc, p.products_status,p.products_carrot, p.products_sc_status, p.products_tax_class_id, p.ecotax_rates_id,c.ecotax_class_id, p.manufacturers_id from ((products p, products_description pd) left join products_to_categories p2c on (p.products_id = p2c.products_id)) left join categories c on ( p2c.categories_id = c.categories_id ) where p.products_id = '3870' and p.products_id =
       pd.products_id and pd.language_id = '1'
26/02/2012 22:55:02 [QUERY] select id, image, htmlcontent, sort_order from products_images where products_id = '3870' order by sort_order
26/02/2012 22:55:02 [QUERY] select manufacturers_id, manufacturers_name from manufacturers order by manufacturers_name
26/02/2012 22:55:02 [QUERY] select tax_class_id, tax_class_title from tax_class order by tax_class_title
26/02/2012 22:55:02 [QUERY] select ecotax_rates_id, ecotax_price from ecotax order by ecotax_class_id
26/02/2012 22:55:02 [QUERY] select languages_id, name, code, image, directory from languages order by sort_order
26/02/2012 22:55:02 [QUERY] select sum(tax_rate) as tax_rate from tax_rates tr left join zones_to_geo_zones za on (tr.tax_zone_id = za.geo_zone_id) left join geo_zones tz on (tz.geo_zone_id = tr.tax_zone_id) where (za.zone_country_id is null or za.zone_country_id = '0' or za.zone_country_id = '73') and (za.zone_id is null or za.zone_id = '0' or za.zone_id = '218') and tr.tax_class_id = '5' group by tr.tax_priority
26/02/2012 22:55:02 [QUERY] select sum(tax_rate) as tax_rate from tax_rates tr left join zones_to_geo_zones za on (tr.tax_zone_id = za.geo_zone_id) left join geo_zones tz on (tz.geo_zone_id = tr.tax_zone_id) where (za.zone_country_id is null or za.zone_country_id = '0' or za.zone_country_id = '73') and (za.zone_id is null or za.zone_id = '0' or za.zone_id = '218') and tr.tax_class_id = '6' group by tr.tax_priority
26/02/2012 22:55:02 [QUERY] select SUM(ecotax_price) as ecotax_price from ecotax where ecotax_rates_id = '35'
26/02/2012 22:55:02 [QUERY] select SUM(ecotax_price) as ecotax_price from ecotax where ecotax_rates_id = '19'
26/02/2012 22:55:02 [QUERY] select SUM(ecotax_price) as ecotax_price from ecotax where ecotax_rates_id = '20'
26/02/2012 22:55:02 [QUERY] select SUM(ecotax_price) as ecotax_price from ecotax where ecotax_rates_id = '21'
26/02/2012 22:55:02 [QUERY] select SUM(ecotax_price) as ecotax_price from ecotax where ecotax_rates_id = '22'
26/02/2012 22:55:02 [QUERY] select SUM(ecotax_price) as ecotax_price from ecotax where ecotax_rates_id = '23'


Par exemple sur les dernières ligne dans l'exemple, j'ai 170 lignes de la requête suivante.

Code
26/02/2012 22:55:02 [QUERY] select SUM(ecotax_price) as ecotax_price from ecotax where ecotax_rates_id = '35'


D'ailleurs, j'ai fait mes tests sur le backoffice, apparemment le front office et backoffice sont lié, et le ralentissement et bien plus visible coté backoffice.... même si je ne sais toujours pas d’où viens le problème. wacko.gif

Écrit par : FoxP2 27 Feb 2012, 07:49

Citation (frogger74 @ 21 Feb 2012, 23:02) *
Mon OSC 2.3 fonctionne bien, sauf que cette version de OSC est très lente, même dans sa version de base, surtout le backoffice, celui ci est 10 fois plus lent que la version 2.2… je sais que je possède pas mal de produits (1500) mais quand même.

10 fois plus lente, nan, la version 2.3.x est au moins 100 x + lente que la 2.2.x. Et tu as un dédié pour un fond de catalog de 1500 produits ? ...
bon, j'ai bien rit, je vais bosser ...

Écrit par : Gnidhal 27 Feb 2012, 09:31

Citation (FoxP2 @ 27 Feb 2012, 07:49) *
10 fois plus lente, nan, la version 2.3.x est au moins 100 x + lente que la 2.2.x. Et tu as un dédié pour un fond de catalog de 1500 produits ? ...
bon, j'ai bien rit, je vais bosser ...
Dis pas ça, ça pourrait être pris au premier degré !
Je connais un site qui tourne sur un mutualisé avec plus de 6000 produits et 1500 visiteurs/jour : ça roule smile.gif

@frogger74 c'est bien tu vois maintenant où est le problème.
Mais cet outil de traçage n'est pas à utiliser en ligne car tu ne pourras rien en faire. En production tu ne pourras pas pister les problèmes car tu auras trop de lignes : chaque requête génère une ligne, si tu as 10 visiteurs en ligne tu ne pourras pas tracer quoi que ce soit. A moins d'adapter le code pour ne racer que ton ip, faisable mais pas foncièrement propre.

Tu dois donc travailler en local pour :
1 chercher une requête qui planterai car elle a une erreur invisible:
c'est le cas quand on cible une table sans y chercher une colonne =>
select a.champ1, b,champ2, b.champ3 from table1 as a, table2 as b, table3 as c where a.champ1 = 'valeur' ans b.champ3 = 'valeur';
ici on appelle la table 3 avec l'alias c mais on ne cherche rien dedans. Résultat on ouvre la table mais la requête scanne la table pour rien... ta requête mettra 1 seconde à donner un résultat.
2 modifier les requêtes redondantes pour les regrouper en 1 seule :
c'est le cas dans tes 170 lignes à répétitions et là il faut modifier le code =>
On a vraisemblablement un bout de code qui fonctionne comme ça :
Code
for ($i = 1; $i<= 100; $i++){
  $query = tep_de_query("select SUM(ecotax_price) as ecotax_price from ".TABLE_ECOTAX." where ecotax_rates_id = '$i' ");
  $result = tep_db_fetch_array($query);
}
mauvaise méthode on fait 100 requêtes pour une recherche
la bonne méthode est là :
Code
  $list = array();
  for ($i = 1; $i<= 100; $i++){
    $list[] = $i;
  }
  $liste = implode(',',$list);
  $liste = trim($liste,',');
  if (count($list) ){
    $query = tep_de_query("select SUM(ecotax_price) as ecotax_price from ".TABLE_ECOTAX." where ecotax_rates_id in ($liste) ");
    $result = tep_db_fetch_array($query);
  }

a/ on construit une liste
b/ on fait une requête qui cherche dans la liste.

Pas forcément facile à faire quand on débute en code car pour l'exemple j'ai simplifié avec une boucle for $i... mais la construction de la liste peut être plus complexe.

Accessoirement, j'ai donné dans le post référencé plus haut, un moyen de modifier le log pour qu'il piste l'exe à la milliseconde car si une requête met plus d'une seconde c'est qu'elle est dramatiquement lourde donc dans la même seconde tu ne peux vois si une requête traîne vraiment quand l'affichage se limite au temps en secondes.

En tous cas, tu tiens un coupable : la contribution ecotax qui doit être développée avec une petite cuillère. On ne peut pas vraiment en vouloir à l'auteur, l'exotaxe est une chienlit. Mais il faudra faire un effort de ce coté pour l'optimiser ou te demander si elle est vraiment indispensable.
C'est vrai, l'exotaxe n'est pas forcément impérative pour les commerces en ligne, tu pourrais te contenter de placer une valeur fixe dans chaque champ produit et afficher la valeur de l'ecotaxe dans chaque fiche produit, rien d'autre.
Après comptablement c'est à toi de faire ressortir le montant global dans ta compta. Mais est-ce obligatoire sur la facture ?
Il me semble que l'ecotaxe est collectée à la source chez le fabricant. Elle n'a donc aucune incidence sur le prix de vente public d'un produit (elle est intégrée de fait) et n'est pas récupérable par les professionnels comme la TVA. Son affichage est donc informatif uniquement.
Sur ce sujet, ce que j'en dis est un point de vue, pas une valeur sure hein ?

Écrit par : frogger74 27 Feb 2012, 11:56

Citation (Gnidhal @ 27 Feb 2012, 09:31) *
Citation (FoxP2 @ 27 Feb 2012, 07:49) *
10 fois plus lente, nan, la version 2.3.x est au moins 100 x + lente que la 2.2.x. Et tu as un dédié pour un fond de catalog de 1500 produits ? ...
bon, j'ai bien rit, je vais bosser ...
Dis pas ça, ça pourrait être pris au premier degré !
Je connais un site qui tourne sur un mutualisé avec plus de 6000 produits et 1500 visiteurs/jour : ça roule smile.gif

@frogger74 c'est bien tu vois maintenant où est le problème.
Mais cet outil de traçage n'est pas à utiliser en ligne car tu ne pourras rien en faire. En production tu ne pourras pas pister les problèmes car tu auras trop de lignes : chaque requête génère une ligne, si tu as 10 visiteurs en ligne tu ne pourras pas tracer quoi que ce soit. A moins d'adapter le code pour ne racer que ton ip, faisable mais pas foncièrement propre.

Tu dois donc travailler en local pour :
1 chercher une requête qui planterai car elle a une erreur invisible:




Salut et encore merci Gnidhal !



Pour t'avouer les choses, je suis un peu fébrile sur ce coup, cela va faire 8 mois que je bosse comme un fou, la semaine dernière je décide donc de lancer la boutique, au bout de 4 heures, le serveur dédié était planté (too many SQL connexion) j'ai donc isolé le site, il est donc toujours accessible mais, seulement de moi, donc de ce coté la, je préfère rester et travailler en ligne... ce sera plus simple pour moi.

Pour l'ecotaxe, je suis à 300 % d'accord avec toi, c'est une grosse chianli, ont m'a demandé de l'installer car il était impératif de la voir s'afficher sur la facture (excès de zèle du comptable blink.gif ???), j'ai eu des tonnes de difficultées à la faire cohabiter avec sspc, car en plus, tu as la TVA sur l'ecotaxe, donc tu à l'écotaxe TTC et HT en fonction du customers group !! le plus incroyable , c'est que j'y suis arrivé, j'étaie tout fier biggrin.gif .... et voila que l'écotaxe me rappel à son bon souvenir, si possible j'aimerais autant résoudre la requête SQL , je vais déjà revoir tous ce qui comporte "ecotax", plus particulièrement les instructions sql, si je trouve le type de code que tu m'indique, j'essaierais ton correctif.... car il est vrai que j'ai du modifier les class / shopping_cart.php pour désolidariser le ECOTAX HT de l'ECOTAX TTC., ainsi forcer l'affichage HT et TTC en fonction du customer group, j'ai fait çà à la barbare car je suis pas vraiment un super pro... donc je sais pas si cela aurait pu jouer un rôle néfaste dans l'histoire.

par exemple dans shopping_cart.php, j'ai mis ce code (pour switcher en le HT et TTC):

Code
      if (MODULE_ORDER_TOTAL_ECOTAX_STATUS=='true'){
           $product_info_ecotax=tep_get_ecotax_description($products[$i]['ecotax_rates_id']);
           $ecotax_rates_id=($products[$i]['ecotax_rates_id']!=$product_info_ecotax[0]['ecotax_id_other']&&$product_info_ecotax[0]['ecotax_id_other']!=""&& $product_info_ecotax[0]['ecotax_id_other']!="0")?$product_info_ecotax[0]['ecotax_id_other']:$products[$i]['ecotax_rates_id'];
          }
    
    // Switch Prix HT & TTC dans le panier (TVA et ecotaxe TVA)
      if (isset($_SESSION['sppc_customer_group_id']) && $_SESSION['sppc_customer_group_id'] != '0') {
    $price_final_eco = $currencies->display_price($products[$i]['final_price'], tep_get_tax_rate($products[$i]['tax_class_id']),tep_get_ecotax_rate($ecotax_rates_id),$products[$i]['quantity']);
    $price_TVA = ' HT';
    
    } else {
    
    $price_final_eco = $currencies->display_price($products[$i]['final_price'], tep_get_tax_rate($products[$i]['tax_class_id']),$ecotax_rates_id,$products[$i]['quantity']);
    $price_TVA = '';
    }
    // Switch Prix HT & TTC dans le panier (TVA et ecotaxe TVA)



Ensuite dans product_info.php j'ai voulu afficher le prix en image, en remplacant les chifres composant chaque prix par une image... 1 = 1.png etc.... avec donc le prix remisé + sppc et donc ecotaxe en HT et TTC pour compliquer les choses wacko.gif , c'est l'usine à gaz mais comme je suis plutôt balo en php, j'ai opté pour ce qui fonctionne, donc le code suivant:


Code
    if ($new_price = tep_get_products_special_price($product_info['products_id'])) {
    // BOF Separate Pricing per Customer
          if ($customer_group_id != 0) { // only need to check products_groups if customer is not retail
            $scustomer_group_price_query = tep_db_query("select customers_group_price, customers_group_id from " . TABLE_PRODUCTS_GROUPS . " where products_id = '" . (int)$HTTP_GET_VARS['products_id']. "' and customers_group_id =  '" . $customer_group_id . "'");
            if ($scustomer_group_price = tep_db_fetch_array($scustomer_group_price_query)) {
              $product_info['products_price']= $scustomer_group_price['customers_group_price'];
              $scustomer_group_id=$scustomer_group_price['customers_group_id'];
              }
          } // end if ($customer_group_id > 0)
    // EOF Separate Pricing per Customer
    
    // ecotaxe HT ou TTC 1
    if ($customer_group_id != 0) {    
    // Si pro calculer le PRIX avec l'ecotaxe HT
    $old_prix = $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id']),tep_get_ecotax_rate( $ecotax_rates_id));
    } else {
    // Sinon calculer le PRIX avec l'écotaxe TTC
    $old_prix = $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id']),$ecotax_rates_id);
    }
    // ecotaxe HT ou TTC 1
    $new_prix = $currencies->display_price($new_price, tep_get_tax_rate($product_info['products_tax_class_id']),$ecotax_rates_id);
    
    $products_price_seul =  $new_prix .' ' . '<del style="text-align:inherit; color: red;">' . $old_prix . '</del>';
    
    $news_prix_gfx = preg_replace("#([1-9,0-0.])#", '<img id="texte_box_prix" src="images/icons/prix/n$1.png" border="0">', $new_prix);
    $old_prix_gfx = preg_replace("#([1-9,0-0.])#", '<img id="texte_box_prix" src="images/icons/prix/p$1.png" border="0">', $old_prix);
        
        //debut modif by paddybl for ecotax
          $products_price = '<table border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td valign="bottom">' . $news_prix_gfx .'</td>
        <td valign="bottom"><img src="images/icons/prix/euro.png" border="0"></td>
        <td valign="bottom" >' . '' . $old_prix_gfx . '' .'</td>
        <td valign="bottom"><img src="images/icons/prix/peuro.png" border="0">' . $products_tva_promo_gfx . '</td>
      </tr>
    </table>';
    
    $products_euro_sup = str_replace($global_euro,' ', $products_price);
    
    
        } else {
        // BOF Separate Pricing per Customer
          if ($customer_group_id > 0) { // only need to check products_groups if customer is not retail
            $scustomer_group_price_query = tep_db_query("select customers_group_price, customers_group_id from " . TABLE_PRODUCTS_GROUPS . " where products_id = '" . (int)$HTTP_GET_VARS['products_id']. "' and customers_group_id =  '" . $customer_group_id . "'");
            if ($scustomer_group_price = tep_db_fetch_array($scustomer_group_price_query)) {
                $product_info['products_price']= $scustomer_group_price['customers_group_price'];
                $scustomer_group_id=$scustomer_group_price['customers_group_id'];
                }
            } // end if ($customer_group_id > 0)
        // EOF Separate Pricing per Customer
        
    // ecotaxe HT ou TTC 2
    if ($customer_group_id != 0) {    
    // Si pro calculer le PRIX avec l'ecotaxe HT
    $old_prix = $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id']),tep_get_ecotax_rate( $ecotax_rates_id));
    } else {
    // Sinon calculer le PRIX avec l'écotaxe TTC
    $old_prix = $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id']),$ecotax_rates_id);        
    }
    // ecotaxe HT ou TTC 2
    
            
    $old_prix_gfx = preg_replace("#([1-9,0-0.])#", '<img id="texte_box_prix" src="images/icons/prix/n$1.png" border="0">', $old_prix);
    
    $products_price = '<table border="0" width="1" cellspacing="0" cellpadding="0">
      <tr>
        <td valign="bottom" width="1">' . $old_prix_gfx .' </td>
        <td valign="bottom" width="1"><img src="images/icons/prix/euro.png" border="0">' . $products_tva_gfx . '</td>
      </tr>
    </table>';
      
    $products_price_seul =  $new_prix .' ' . $old_prix;
        
    $products_euro_sup = str_replace($global_euro,'', $products_price);
    
        }
         //fin modif by paddybl for ecotax


Je ne sais pas si j'ai bien fait? , c'est sans doute du travail de cochon unsure.gif en même temps je ne suis pas sûr que cela soit le problème soulevé... car il n'est pas questions de requêtes SQL.... en même temps tout est requête SQL , non ?


Bon, j'ai donc recherché les requete ecotaxe intégrant "SUM" comme mot clé, j'ai trouvé ceci:

Dans Admin/includes/function/general.php (ligne 1870):
Code
    $tax_query = tep_db_query("select sum(tax_rate) as tax_rate from " . TABLE_TAX_RATES . " tr left join " . TABLE_ZONES_TO_GEO_ZONES . " za on (tr.tax_zone_id = za.geo_zone_id) left join " . TABLE_GEO_ZONES . " tz on (tz.geo_zone_id = tr.tax_zone_id) where (za.zone_country_id is null or za.zone_country_id = '0' or za.zone_country_id = '" . (int)$country_id . "') and (za.zone_id is null or za.zone_id = '0' or za.zone_id = '" . (int)$zone_id . "') and tr.tax_class_id = '" . (int)$class_id . "' group by tr.tax_priority");
       // $tax_query = tep_db_query("select SUM(tax_rate) as tax_rate from " . TABLE_TAX_RATES . " where tax_class_id = '" . (int)$class_id . "' group by tax_priority");


Ensuite plus haut dans Admin/includes/function/general.php: (ligne 483)

Code
// TABLES: ecotax, zones_to_geo_zones
  
    function tep_get_ecotax_price_value($class_id) {
      $ecotax_query = tep_db_query("select SUM(ecotax_price) as ecotax_price from " . TABLE_ECOTAX_RATES . " where ecotax_rates_id = '" . (int)$class_id . "'");
      if (tep_db_num_rows($ecotax_query)) {
        $ecotax_multiplier = 0;
        while ($ecotax = tep_db_fetch_array($ecotax_query)) {
          $ecotax_multiplier += $ecotax['ecotax_price'];
        }
        return tep_round($ecotax_multiplier, 2);
      } else {
        return 0;
      }
    }
      function tep_get_ecotax_rate_value($class_id) {
      $ecotax_query = tep_db_query("select SUM(tax_rate) as tax_rate from " . TABLE_ECOTAX_RATES . " where ecotax_rates_id = '" . (int)$class_id . "'");
      if (tep_db_num_rows($ecotax_query)) {
        $ecotax_multiplier = 0;
        while ($ecotax = tep_db_fetch_array($ecotax_query)) {
          $ecotax_multiplier += $ecotax['tax_rate'];
        }
        return $ecotax_multiplier;
      } else {
        return 0;
      }
    }
    //fin modif by paddybl for ecotax


A la ligne 542:

Code
    $ecotax_query = tep_db_query("select sum(tax_rate) as tax_rate from " . TABLE_ECOTAX_RATES . " tr  where tr.ecotax_rates_id = '" . (int)$rates_id . "' group by tr.ecotax_rates_id");


A la ligne 1827:

Code
  function tep_get_tax_rate($class_id, $country_id = -1, $zone_id = -1) {
      global $customer_zone_id, $customer_country_id;
  
      if ( ($country_id == -1) && ($zone_id == -1) ) {
        if (!tep_session_is_registered('customer_id')) {
          $country_id = STORE_COUNTRY;
          $zone_id = STORE_ZONE;
        } else {
          $country_id = $customer_country_id;
          $zone_id = $customer_zone_id;
        }
      }
  
      $tax_query = tep_db_query("select SUM(tax_rate) as tax_rate from " . TABLE_TAX_RATES . " tr left join " . TABLE_ZONES_TO_GEO_ZONES . " za ON tr.tax_zone_id = za.geo_zone_id left join " . TABLE_GEO_ZONES . " tz ON tz.geo_zone_id = tr.tax_zone_id WHERE (za.zone_country_id IS NULL OR za.zone_country_id = '0' OR za.zone_country_id = '" . (int)$country_id . "') AND (za.zone_id IS NULL OR za.zone_id = '0' OR za.zone_id = '" . (int)$zone_id . "') AND tr.tax_class_id = '" . (int)$class_id . "' GROUP BY tr.tax_priority");
      if (tep_db_num_rows($tax_query)) {
        $tax_multiplier = 0;
        while ($tax = tep_db_fetch_array($tax_query)) {
          $tax_multiplier += $tax['tax_rate'];
        }
        return $tax_multiplier;
      } else {
        return 0;
      }
    }

Sans doute une mauvaise adaptation pour la OSC2.1.3, mais je ne vois pas, j'ai vérifié l'install... mellow.gif ...

Dans catalog/Advanced_search_result.php :

Code
  if ( (DISPLAY_PRICE_WITH_TAX == 'true') && (tep_not_null($pfrom) || tep_not_null($pto)) ) {
        $select_str .= ", SUM(tr.tax_rate) as tax_rate ";
      }
    
            if ($status_tmp_product_prices_table == true) {
    $from_str = "from " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m using(manufacturers_id) left join " . $product_prices_table . " as tmp_pp using(products_id)";
            } elseif ($status_tmp_special_prices_table == true) {
    $from_str = "from " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m using(manufacturers_id) left join " . TABLE_SPECIALS_RETAIL_PRICES . " s on p.products_id = s.products_id ";
            } else {
    $from_str = "from " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m using(manufacturers_id) ";
            }
      // EOF Separate Pricing Per Customer
    
      if ( (DISPLAY_PRICE_WITH_TAX == 'true') && (tep_not_null($pfrom) || tep_not_null($pto)) ) {
        if (!tep_session_is_registered('customer_country_id')) {
          $customer_country_id = STORE_COUNTRY;
          $customer_zone_id = STORE_ZONE;
        }
        $from_str .= " left join " . TABLE_TAX_RATES . " tr on p.products_tax_class_id = tr.tax_class_id left join " . TABLE_ZONES_TO_GEO_ZONES . " gz on tr.tax_zone_id = gz.geo_zone_id and (gz.zone_country_id is null or gz.zone_country_id = '0' or gz.zone_country_id = '" . (int)$customer_country_id . "') and (gz.zone_id is null or gz.zone_id = '0' or gz.zone_id = '" . (int)$customer_zone_id . "')";
      }
    
      $from_str .= ", " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_CATEGORIES . " c, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c";
    
      // BOF Enable & Disable Categories
      // BOF CARROT
    $where_str = " where p.products_carrot = '0' and p.products_status = '1' and c.categories_status = '1' and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' and p.products_id = p2c.products_id and p2c.categories_id = c.categories_id ";
      // EOF Enable & Disable Categories
      // EOF Carrot


dans catalog/include/function/general.php:

Code
  function tep_get_ecotax_price_value($class_id) {
        $ecotax_query = tep_db_query("select SUM(ecotax_price) as ecotax_price from " . TABLE_ECOTAX_RATES . " where ecotax_rates_id = '" . (int)$class_id . "'");
        if (tep_db_num_rows($ecotax_query)) {
          $ecotax_multiplier = 0;
          while ($ecotax = tep_db_fetch_array($ecotax_query)) {
            $ecotax_multiplier += $ecotax['ecotax_price'];
          }
          return tep_round($ecotax_multiplier, 2);
        } else {
          return 0;
        }
      }
      
      function tep_get_ecotax_rate($rates_id, $country_id = -1, $zone_id = -1) {
        global $customer_zone_id, $customer_country_id;
    
        if ( ($country_id == -1) && ($zone_id == -1) ) {
          if (!tep_session_is_registered('customer_id')) {
            $country_id = STORE_COUNTRY;
            $zone_id = STORE_ZONE;
          } else {
            $country_id = $customer_country_id;
            $zone_id = $customer_zone_id;
          }
        }
    
        $ecotax_query = tep_db_query("select sum(tax_rate) as tax_rate from " . TABLE_ECOTAX_RATES . " tr  where tr.ecotax_rates_id = '" . (int)$rates_id . "' group by tr.ecotax_rates_id");


Pour moi, le code le plus suspect, serait le premier code non ?, je vais revoir l'install d'ecotax pour voir si y'a modification de la contribution orginal.

Merci d’avoir pris le temps de me lire.

Écrit par : frogger74 27 Feb 2012, 15:05

Bon, pour ceux que çà intéresse, j'avance dans l'analyse que ma soumise Gnidhal,


Alors je confirme que les codes qui provoquent mes 170 lignse de log "ecotaxe" sont bien celle ci:


Code
//debut modif by paddybl for ecotax
////
// Returns the ecotax rate for a zone / class
// TABLES: ecotax, zones_to_geo_zones

   function tep_get_ecotax_price_value($class_id) {
     $ecotax_query = tep_db_query("select SUM(ecotax_price) as ecotax_price from " . TABLE_ECOTAX_RATES . " where ecotax_rates_id = '" . (int)$class_id . "'");
     if (tep_db_num_rows($ecotax_query)) {
       $ecotax_multiplier = 0;
       while ($ecotax = tep_db_fetch_array($ecotax_query)) {
         $ecotax_multiplier += $ecotax['ecotax_price'];
       }
       return tep_round($ecotax_multiplier, 2);
     } else {
       return 0;
     }
   }
     function tep_get_ecotax_rate_value($class_id) {
     $ecotax_query = tep_db_query("select SUM(tax_rate) as tax_rate from " . TABLE_ECOTAX_RATES . " where ecotax_rates_id = '" . (int)$class_id . "'");
     if (tep_db_num_rows($ecotax_query)) {
       $ecotax_multiplier = 0;
       while ($ecotax = tep_db_fetch_array($ecotax_query)) {
         $ecotax_multiplier += $ecotax['tax_rate'];
       }
       return $ecotax_multiplier;
     } else {
       return 0;
     }
   }
   //fin modif by paddybl for ecotax


A noter, que pour provoquer ces 170 ligne il suffit juste de cliquer sur "modifier" (un produit) dans le backoffice, je n'est pour le moment pas trouvé de similitude coté frontoffice... mais bon.

J'ai donc fait cette adaptation (avec le code fourni par le boss Gnidhal)

Code
function tep_get_ecotax_price_value($class_id) {
$list = array();
   for ($i = 1; $i<= 100; $i++){
     $list[] = $i;
   }
   $liste = implode(',',$list);
   $liste = trim($liste,',');

    // $ecotax_query = tep_db_query("select SUM(ecotax_price) as ecotax_price from " . TABLE_ECOTAX_RATES . " where ecotax_rates_id = '" . (int)$class_id . "'");
     $ecotax_query = tep_db_query("select SUM(ecotax_price) as ecotax_price from ".TABLE_ECOTAX_RATES." where ecotax_rates_id in ($liste) ");

     if (tep_db_num_rows($ecotax_query)) {

       $ecotax_multiplier = 0;

       while ($ecotax = tep_db_fetch_array($ecotax_query)) {

         $ecotax_multiplier += $ecotax['ecotax_price'];

       }

       return tep_round($ecotax_multiplier, 2);

     } else {

       return 0;

     }

   }

     function tep_get_ecotax_rate_value($class_id) {
$list = array();
   for ($i = 1; $i<= 100; $i++){
     $list[] = $i;
   }
   $liste = implode(',',$list);
   $liste = trim($liste,',');

   //  $ecotax_query = tep_db_query("select SUM(tax_rate) as tax_rate from " . TABLE_ECOTAX_RATES . " where ecotax_rates_id = '" . (int)$class_id . "'");
     $ecotax_query = tep_db_query("select SUM(tax_rate) as tax_rate from ".TABLE_ECOTAX_RATES." where ecotax_rates_id in ($liste) ");

     if (tep_db_num_rows($ecotax_query)) {

       $ecotax_multiplier = 0;

       while ($ecotax = tep_db_fetch_array($ecotax_query)) {

         $ecotax_multiplier += $ecotax['tax_rate'];

       }

       return $ecotax_multiplier;

     } else {

       return 0;

     }

   }

   //fin modif by paddybl for ecotax


Résultat:, je n'est plus ces 170 lignes , d'écritures biggrin.gif par contre çà ne va pas plus vites dans le traitement, même voir plus lentement... huh.gif , j'ai donc du me planter dans son adaptation avec "$i". unsure.gif

Écrit par : Gnidhal 27 Feb 2012, 16:52

houla! STOOOOP!

Mon exemple de boucle
for $i=0;$i<100;$i++
était là juste pour l'exemple! tu n'as pas de boucle de ce type dans ton code!
dans ton code tu as dans categories.php (puisque tu dis que ça se passe quand tu veux éditer un produit) une ligne qui appelle l'affichage de l'exotax via une fonction tep_get_ecotax_price_value ou tep_get_ecotax_rate_value... (comme tu l'as découvert)
et vraisemblablement elle est dans une boucle où elle est appelée 170 fois, donc dans l'affichage du prix par groupe (sppc)je suppose.
J'ai pas creusé ton code, là je manque de temps.
Alors voilà un exemple de code empilé qui va à la casse!
une fonction de ce type est à utiliser pour afficher un prix final ou éventuellement une dizaine mais certainement pas une centaine de fois! dès que tu dépasse 3 ou 4 fois l'appel à une fonction qui fait une requête en bdd, tu dois penser à créer une autre fonction qui groupera ta demande pour éviter les requêtes en rafale. Ou alors tu travailles avec des arrays : stockage de valeur en mémoire sous forme de tableau et traitement entièrement via ces tableaux.

Je pense surtout que ton job de développeur doit intégrer aussi un bout de code de ce type :

Code
$commanditaire =(je_suis_prestataire == true)? 'client':'patron';
function je_dis_non_et_j_argumente($question, $reponse, $commanditaire){
  /*
  Là je sais pourquoi on ne peut pas marier la contribution A avec la contribution B à moins de passer 2 mois à tout redévelopper.
  En conséquence de quoi je vais proposer une solution alternative ou présenter la note horaire prévisionnelle.
  */
   if ($commanditaire == 'patron')
   return 'Non monsieur, ça ne fonctionnera pas ou alors ça va coûter 2 mois/homme en dev!';
   if ($commanditaire == 'client')
   return "Oui monsieur, tout est possible et je peux réaliser cela mais il faut repousser la date de mise à disposition du site de 60 jours et je dois revoir mon devis à la hausse en conséquence";
}

Au final il y a une autre option : un serveur dédié!
ça va chauffer coté serveur sql mais ça va tourner quand même et ça te laisse le temps de remettre à plat tout ça pour savoir comment résoudre le problème proprement.
Parce que ce que tu demandes ici n'est pas réalisable en lisant 3 bouts de scripts et en pondant un raccourci miracle à la façon d'une formule magique griffonnée sur un coin de nappe entre le café et le digestif.

Un peu de sérieux! je connais un peu ecotax et je me suis toujours refusé à exploiter ce genre de contribution qui au final ne donne pas un résultat à la mesure du travail pour l’implémenter ni à la mesure du travail coté serveur sql.

Écrit par : frogger74 27 Feb 2012, 18:40

Déjà l'infographiste que je suis à ses limites en php, donc 2 mois de développement en plus , juste pour rectifier le tir d'une contribution comme ecotax, je laisse tomber, de plus je suis déjà sur serveur dédié... donc je pense qu'il est préférable de tout revoir de zéro, voir même de revenir sur quelques chose de plus fiable, l'osc 2.2 par exemple.

mrgreen.gif

Écrit par : Gnidhal 27 Feb 2012, 19:02

Citation (frogger74 @ 27 Feb 2012, 18:40) *
Déjà l'infographiste que je suis à ses limites en php, donc 2 mois de développement en plus , juste pour rectifier le tir d'une contribution comme ecotax, je laisse tomber, de plus je suis déjà sur serveur dédié...
Avoir des limites, c'est naturel et normal, le php est un langage accessible et basique mais qui évolue énormément.
mais ??? serveur dédié ? ok j'avais oublié j'étais resté sur "too many connexions", un dédié avec 1 Go de ram... ok. Ton PC ou ton Mac, il a combien de RAM ? Bon c'est juste pour que tu te fasses une idée. Le premier Kimsufi chez OVH sur celeron a déjà 2 Go et la gamme d'après on a 16 Go...

Citation (frogger74 @ 27 Feb 2012, 18:40) *
donc je pense qu'il est préférable de tout revoir de zéro, voir même de revenir sur quelques chose de plus fiable, l'osc 2.2 par exemple.
Ah ?quelle différence 2.3 avec osc2.2 ? La 2.3 est juste plus moderne coté structure du code et surtout compatible php5.3 en plus de l'intégration de jQuery. Coté mysql elle est plutôt légèrement mieux que la 2.2, mais pas des masses.
C'est juste la contrib Ecotax qui est en trop il me semble et quand je dis 2 mois c'est avec une grosse louche pour poser un chiffre et caricaturer l'état de fait.
La réalité c'est juste que de vouloir appliquer deux contribs qui touchent autant la gestion des prix, c'est un gros risque de se trouver dans ta situation.
Si tu vires l'ecotax ça sera nettement plus fluide.
Si tu refais la même chose (sppc+ecotax) sur une 2.2 tu rencontreras les mêmes effets.
Déjà sppc mériterait d'être optimisé mais c'est une autre histoire.

Écrit par : frogger74 27 Feb 2012, 21:19

Salut!


En fait , je compte passer sur un serveur dédié avec infogérance pour me soulager d'un poids (chez EFEDUS) avec 4 giga de RAM contre 1 actuellement. mais cela ne me rassure pas, même si je sais qu'ils pourront me diagnostiquer et configurer le serveur en conséquence, me conseiller, mais ils ne pourront rien de plus pour moi, en ce qui concerne la modification du site en lui même.... car quand ont me dits "boucle infini" pour moi, çà veux dire "explosion de la mémoire", surtout qu'il n'y aura pas que ce site sur ce serveur, bien sûr, les quelques autres sites ne souffrent pas de ce problème...

Mais je ne suis pas sur que seul l'ecotax soit le soucis, je suis pas expert mais j'ai 32000 lignes de ce type, juste si je liste des produits dans le backoffice:

Code
                                            FROM products_attributes
                                               WHERE products_id = '13'
   26/02/2012 22:54:03 [QUERY] SELECT DISTINCT products_options_id
                                               FROM products_options
                                               WHERE products_options_track_stock = 1
   26/02/2012 22:54:03 [QUERY] SELECT products_quantity
                                               FROM products
                                               WHERE products_id = '13'
   26/02/2012 22:54:03 [QUERY] SELECT products_stock_attributes
                                               FROM products_stock
                                               WHERE products_id = '13'
   26/02/2012 22:54:03 [QUERY] SELECT DISTINCT options_id
                                               FROM products_attributes
                                               WHERE products_id = '14'
   26/02/2012 22:54:03 [QUERY] SELECT DISTINCT products_options_id
                                               FROM products_options
                                               WHERE products_options_track_stock = 1
   26/02/2012 22:54:03 [QUERY] SELECT products_quantity
                                               FROM products
                                               WHERE products_id = '14'
   26/02/2012 22:54:03 [QUERY] SELECT products_stock_attributes
                                               FROM products_stock
                                               WHERE products_id = '14'
   26/02/2012 22:54:03 [QUERY] SELECT DISTINCT options_id
                                               FROM products_attributes
                                               WHERE products_id = '15'
   26/02/2012 22:54:03 [QUERY] SELECT DISTINCT products_options_id
                                               FROM products_options
                                               WHERE products_options_track_stock = 1
   26/02/2012 22:54:03 [QUERY] SELECT products_quantity
                                               FROM products
                                               WHERE products_id = '15'


Alors je sais pas, c'est peut être normal, mais il faut que je réfléchisse à tous çà , que je prenne du recul, car la je l'ai vraiment mauvaise, autant de temps de travail, comprendre les rouages, pour un projet qui tombe à l'eau... je suis même prêt à mettre la main à la poche pour résoudre le problème, mais je suis même pas sur du résultat final... moi qui croyait que repartir de zéro sur une nouvelle version d'osc me permettrait d'éviter ce genre de soucis.. mais bon... wacko.gif

Écrit par : Gnidhal 27 Feb 2012, 22:43

ce n'est pas la base qui est mal ficelée, ce sont les contributions qu'il faut optimiser ou les pages qu'il faut gérer.
Il y a des possibilité de mettre les résultats de requête en cache ou d'optimiser les requêtes.

Tu as fait lourd quand même : je pense que QTPRO est le fautif dans le cas des lignes que tu cites : products_options_track_stock n'est pas inclus dans la base de la 2.3.1
si on ajoute sppc et ecotax, je ne suis pas étonné que tu exploses le compteur de requêtes.

C'est tout le problème de ces contributions (une grande majorité) : elles sont développées par des débutants ou des bricoleurs pour répondre à un besoin qui leur est propre sans tenir compte de l'optimisation.
Avantage: c'est une bonne base de développement qu'il faut savoir améliorer, le travail de structure et de génie sont là.
Inconvénient :posée en l'état dans un site et associée à d'autres contributions du même genre et c'est la cata (sans parler des risques de conflits)
Je ne jetterai jamais la pierre à un développeur amateur qui partage ses bricolages, c'est une des forces de l'open source et d'osCommerce. Ce qu'il partage est plein de génie et se générosité. La technique ou la compétence font malheureusement bien souvent défaut (pas toujours, il y a des perles).

Il faut donc savoir quel est ton besoin et comment le résoudre et développer pour ce cas plutôt que de coller un truc tout fait qui répond "à peu près" au besoin mais fait aussi plein d'autres choses. Dans ce cas il est nécessaire de faire le ménage dans les contributions que tu installes.
C'est là qu'une contribution est un petit sac plein de malices, elle offre une méthode, un raisonnement, des bouts de solutions , voire dans certains cas des solutions complètes.

Mais ne va pas rêver, les autres solutions comme prestash0p ou magent0 présentent les mêmes travers. Si la problématique a été pensée dans le coeur, il y a une solution probable pas trop lourde (encore qu'avec magnet0 c'est forcément lourd) sinon c'est de la bricole et les sanctions sont les mêmes (voire pires)



Écrit par : FoxP2 28 Feb 2012, 00:21

Le développement, ça ne s'invente pas, ça s'apprend.
via des formations solides qui apprennent les process, la rigueur, l'analyse, les concepts, les capacités d'abstraction, la curiosité, bref les bases.
rares sont ceux qui apprennent seuls (les zozotodidactes, on les reconnait vite quand on lit leurs codes)
donc parfois, il faut savoir passer la main. ça évite de perdre du temps, et par conséquence, de l'argent.

Écrit par : frogger74 28 Feb 2012, 10:23

J'avais déjà fait appel à un développeur, mais le résultat ne semble pas être la... à quel développeur pourrais-je faire appel ?

Écrit par : FoxP2 28 Feb 2012, 10:54

Citation (frogger74 @ 28 Feb 2012, 10:23) *
à quel développeur pourrais-je faire appel ?

les annonces se font dans le forum blablabla et le suivi par messagerie personnelle.

(attention à la rédaction de l'annonce, le cahier des charges, sans être détaillé, doit donner une idée du taf à réaliser. ça évitera des contacts sans intérêts)

Écrit par : paddybl 28 Feb 2012, 16:48

salut à tous,

comme on parle d'ecotax je me permet d'intervenir

je me disais bien que j'avais jamais écrit un truc pareil!:

Code
for ($i = 1; $i<= 100; $i++){
  $query = tep_de_query("select SUM(ecotax_price) as ecotax_price from ".TABLE_ECOTAX." where ecotax_rates_id = '$i' ");
  $result = tep_db_fetch_array($query);
}


j'ai cherché partout... hihi
ce que je peux dire, c'est j'ai fait travaille ecotax sans problème ni ralentissement flagrant avec une base de données de plus de 30000 produits.
donc le ralentissement vient certainement d'ailleur, ou d'un codage modifier

comme gnidhal je penserai à une boucle sans fin
que dit un top en ssh sur le serveur? si tu satures mysql
il est logique que ce soit lent partout
et le load average monte t-il?

bizarre ces 170 lignes de demande du tarif de l'éco-participation... depuis quel fichier y a-til cette appel?

autre chose, j'ai plus mon site pour montrer le texte, mais l'affichage de l'éco-participation doit obligatoirement etre TTC entre guillemet!
que ce soit pour un client en HT ou en TTC
c'est pour celà que j'ai un taux de tva différent qui s'applique uniquement aux classes d'éco-participation
le tarif de l'eco-participation ne peu etre déduit de sa taxe... et c'est bien là la difficulté
une écoparticipation à 1€ serra la même pour un client TTC que pour un client HT
tu ne dois pas enlever cette TVA d'apres les textes de loi

les fonctions tep_get_ecotax_price_value et tep_get_ecotax_rate_value cherche respectivement le tarif HT de l'éco-participation et le taux de taxe à appliquer sur celle-ci
si tu as 170 fois ces lignes c'est qu'il y a 170 l'appel ce qui me semble obligatoire... reste à comprendre pourquoi 170 fois.
ca ca m'intrigue

Écrit par : Gnidhal 28 Feb 2012, 17:46

Citation (paddybl @ 28 Feb 2012, 16:48) *
les fonctions tep_get_ecotax_price_value et tep_get_ecotax_rate_value cherche respectivement le tarif HT de l'éco-participation et le taux de taxe à appliquer sur celle-ci
si tu as 170 fois ces lignes c'est qu'il y a 170 l'appel ce qui me semble obligatoire... reste à comprendre pourquoi 170 fois.
ca ca m'intrigue

Salut paddybl, je ne pense pas que ça soit directement ta contrib qui provoque le problème mais son mariage avec d'autres contribs comme SPPC et QTPRO.
Si faire appel à une fonction qui contient une requête pour afficher un prix est parfaitement portable et simple, si on appelle cette même fonction plus de 5 fois dans une même page c'est qu'il est urgent de chercher comment grouper ces appels dans une même requête.


Écrit par : frogger74 28 Feb 2012, 23:19

Salut Paddybl,

Citation (paddybl @ 28 Feb 2012, 16:48) *
que dit un top en ssh sur le serveur? si tu satures mysql
il est logique que ce soit lent partout
et le load average monte t-il?


Bah en fait, je n'ai pas d'accès SSH , donc je n'ai qu'un accès limité. unsure.gif

Citation (paddybl @ 28 Feb 2012, 16:48) *
bizarre ces 170 lignes de demande du tarif de l'éco-participation... depuis quel fichier y a-til cette appel?



En fait pour générer cette foule de ligne , il me suffit de faire juste modifier un produit dans le backoffice:

J'ai 177 lignes de ce type:

Code
28/02/2012 23:01:40 [QUERY] select SUM(ecotax_price) as ecotax_price from ecotax where ecotax_rates_id = '35'
28/02/2012 23:01:40 [QUERY] select SUM(ecotax_price) as ecotax_price from ecotax where ecotax_rates_id = '19'
28/02/2012 23:01:40 [QUERY] select SUM(ecotax_price) as ecotax_price from ecotax where ecotax_rates_id = '20'
28/02/2012 23:01:40 [QUERY] select SUM(ecotax_price) as ecotax_price from ecotax where ecotax_rates_id = '21'
28/02/2012 23:01:40 [QUERY] select SUM(ecotax_price) as ecotax_price from ecotax where ecotax_rates_id = '22'


et 177 lignes de ce type:

Code
28/02/2012 23:01:40 [QUERY] select SUM(tax_rate) as tax_rate from ecotax where ecotax_rates_id = '35'
28/02/2012 23:01:40 [QUERY] select SUM(tax_rate) as tax_rate from ecotax where ecotax_rates_id = '19'
28/02/2012 23:01:40 [QUERY] select SUM(tax_rate) as tax_rate from ecotax where ecotax_rates_id = '20'
28/02/2012 23:01:40 [QUERY] select SUM(tax_rate) as tax_rate from ecotax where ecotax_rates_id = '21'
28/02/2012 23:01:40 [QUERY] select SUM(tax_rate) as tax_rate from ecotax where ecotax_rates_id = '22'
28/02/2012 23:01:40 [QUERY] select SUM(tax_rate) as tax_rate from ecotax where ecotax_rates_id = '23'
28/02/2012 23:01:40 [QUERY] select SUM(tax_rate) as tax_rate from ecotax where ecotax_rates_id = '24'
28/02/2012 23:01:40 [QUERY] select SUM(tax_rate) as tax_rate from ecotax where ecotax_rates_id = '25'


et 193 lignes de ce type:
Code
28/02/2012 23:01:30 [QUERY] select configuration_group_id as cgID, configuration_group_title as cgTitle from configuration_group where visible = '1' order by sort_order
28/02/2012 23:01:30 [QUERY] select c.categories_id, cd.categories_name, c.parent_id from categories c, categories_description cd where c.categories_id = cd.categories_id and cd.language_id = '1' and c.parent_id = '0' order by c.sort_order, cd.categories_name
28/02/2012 23:01:30 [QUERY] select c.categories_id, cd.categories_name, c.parent_id from categories c, categories_description cd where c.categories_id = cd.categories_id and cd.language_id = '1' and c.parent_id = '219' order by c.sort_order, cd.categories_name
28/02/2012 23:01:30 [QUERY] select c.categories_id, cd.categories_name, c.parent_id from categories c, categories_description cd where c.categories_id = cd.categories_id and cd.language_id = '1' and c.parent_id = '210' order by c.sort_order, cd.categories_name
28/02/2012 23:01:30 [QUERY] select c.categories_id, cd.categories_name, c.parent_id from categories c, categories_description cd where c.categories_id = cd.categories_id and cd.language_id = '1' and c.parent_id = '220' order by c.sort_order, cd.categories_name
28/02/2012 23:01:30 [QUERY] select c.categories_id, cd.categories_name, c.parent_id from categories c, categories_description cd where c.categories_id = cd.categories_id and cd.language_id = '1' and c.parent_id = '226' order by c.sort_order, cd.categories_name
28/02/2012 23:01:30 [QUERY] select c.categories_id, cd.categories_name, c.parent_id from categories c, categories_description cd where c.categories_id = cd.categories_id and cd.language_id = '1' and c.parent_id = '177' order by c.sort_order, cd.categories_name
28/02/2012 23:01:30 [QUERY] select c.categories_id, cd.categories_name, c.parent_id from categories c, categories_description cd where c.categories_id = cd.categories_id and cd.language_id = '1' and c.parent_id = '218' order by c.sort_order, cd.categories_name
28/02/2012 23:01:30 [QUERY] select c.categories_id, cd.categories_name, c.parent_id from categories c, categories_description cd where c.categories_id = cd.categories_id and cd.language_id = '1' and c.parent_id = '1' order by c.sort_order, cd.categories_name
28/02/2012 23:01:30 [QUERY] select c.categories_id, cd.categories_name, c.parent_id from categories c, categories_description cd where c.categories_id = cd.categories_id and cd.language_id = '1' and c.parent_id = '35' order by c.sort_order, cd.categories_name
28/02/2012 23:01:30 [QUERY] select c.categories_id, cd.categories_name, c.parent_id from categories c, categories_description cd where c.categories_id = cd.categories_id and cd.language_id = '1' and c.parent_id = '36' order by c.sort_order, cd.categories_name
28/02/2012 23:01:30 [QUERY] select c.categories_id, cd.categories_name, c.parent_id from categories c, categories_description cd where c.categories_id = cd.categories_id and cd.language_id = '1' and c.parent_id = '78' order by c.sort_order, cd.categories_name
28/02/2012 23:01:30 [QUERY] select c.categories_id, cd.categories_name, c.parent_id from categories c, categories_description cd where c.categories_id = cd.categories_id and cd.language_id = '1' and c.parent_id = '79' order by c.sort_order, cd.categories_name
28/02/2012 23:01:30 [QUERY] select c.categories_id, cd.categories_name, c.parent_id from categories c, categories_description cd where c.categories_id = cd.categories_id and cd.language_id = '1' and c.parent_id = '80' order by c.sort_order, cd.categories_name
28/02/2012 23:01:30 [QUERY] select c.categories_id, cd.categories_name, c.parent_id from categories c, categories_description cd where c.categories_id = cd.categories_id and cd.language_id = '1' and c.parent_id = '83' order by c.sort_order, cd.categories_name

Écrit par : paddybl 29 Feb 2012, 09:28

Je suis d'accord avec toi gnidhal,c'est pas normal qu'il y ait 170 puis 190 fois le même type d'appel aux fonctions.
disont que ce qui était compliqué avec l'éco-participation, quand j'ai réflechi aux algorythmes, a été de garder le code de base osc
le plus possible à l'original.
mais il fallait pouvoir ajouter cette ecotax en respectant les directives de la loi... donc taux de tva indépendant et variable suivant les cas.
ouff il l'on pas fait "le variable" facon 5.5, mias ca reste d'actualité sir on change de TVA... vont-il appliqué le nouveau taux ou l'ancien? mystère...
de plus il fallait pouvoir ajuster c'est ecotaxe en fonction du type de produit et des lots etc...
reste donc que chaque produit à sont prix, sa tva et sont ecoparticipation ou pas. les fonctions ne sont pas plus lourde que celle qui cherche le taux de tva et l'avantage c'est qu'on peu l'appeler quand on en a besoin sans alourdir encore nos requètes avec des jonctions difficile à intégrer dans un code déjà modifié (souvent)
la ou tu as raison encore gnidhal, c'est que c'est forcement optimisable. mais si tu te rappels bien. j'ai mis a disposition de la communauté assez rapidement tout le développement d'ecotax pour que chacun puisse intégrer cette "con nerie de loi" et ne pas se retrouver hors la loi.
depuis personne n'a réellement repris le code de base comme on le voit pour d'autres contribes.
de mon coté, j'ai laché le projet depuis un bon moment.

mais revenons en à frogger

pour moi il faut revoir l'intégration du categories.php... y a un problème de boucle mal positionné qui rappel ces fonctions X fois inutilement.
un acces ssh n'est-il pas obligatoire sur un serveur dédié? moi je vois pas comment je pourrais régler le mien si j'avais pas ssh... pas normal ca. tu ne peux pas voir ce qui sature sans...
et sur un dédié il y a plein de raisons qui peuvent ralentir ton serveur dans les réglages... config apache, mysql, php....
sans pour autant que ce soit le code qui ait un problème. (d'apres mon expérience.)

Écrit par : Gnidhal 29 Feb 2012, 09:44

Citation (paddybl @ 29 Feb 2012, 09:28) *
mais si tu te rappels bien. j'ai mis a disposition de la communauté assez rapidement tout le développement d'ecotax pour que chacun puisse intégrer cette "con nerie de loi" et ne pas se retrouver hors la loi.
depuis personne n'a réellement repris le code de base comme on le voit pour d'autres contribes.
de mon coté, j'ai laché le projet depuis un bon moment.

Oui je me souviens smile.gif et j'ai essayé de mettre le nez dans cette usine à gaz mais après renseignements auprès de plusieurs comptables, aucun ne m'ayant donné la même réponse sur les obligations légales et le système de calcul, j'ai lâché l'affaire avant de commencer. En réalité, je crois que les comptables ne savent pas, pour la plupart, comment on gère en pratique l'eco-participation.
Comme je le dis plus haut il me semble qu'il s'agit d'une taxe prélevée à la source (chez le fabricant) en fonction d'un barème par classe de produit qui vient se greffer sur le prix de base HT. Donc pas de calcul compliqué, le comptable connaît en principe le montant fixe par produit et le reporte dans une colonne. Mais il ne me semble pas qu'il ait de reversement par le vendeur, son obligation se limitant à l'affichage du prix avec la mention "dont eco-participation de xoxo€".
Si l'affichage est sollicité pour chaque produit je ne crois pas que la somme totale soit nécessaire sur la facture.
Enfin, c'est ce que j'ai retiré de mes discussions avec des comptables.
Donc ça pourrait aller simplement dans la description du produit sans jamais être comptabilisé.

Écrit par : paddybl 29 Feb 2012, 11:26

tient j'ai retrouvé ca en réponse à un courrier à la dgccrf:

Citation
DIRECTION GENERALE DE LA CONCURRENCE,
DE LA CONSOMMATION ET DE LA REPRESSION DES FRAUDES
59, BD VINCENT AURIOL TELEDOC
75703 PARIS CEDEX 13
PARIS, LE 9 NOVEMBRE 2006
Madame, Monsieur,
Vous avez fait état, à plusieurs reprises, de difficultés rencontrées par vos adhérents pour établir, à
partir du 15 novembre prochain, des factures conformes aux dispositions législatives et réglementaires
relatives au financement des DEEE ménagers.
L’entrée en vigueur des agréments des organismes environnementaux à cette date place les
professionnels devant l’obligation d’établir des factures conformes à un ensemble de prescriptions
relatives à la facturation (article L.441-3 du code de commerce) et à l’environnement (articles 17 et 25
du décret dit « DEEE » et article L.541-10-2 du code de l’environnement).
Elles doivent ainsi respecter :
- L’article L. 441-3 du code de commerce relatif à la facturation (il en est déduit que la
contribution environnementale ne peut faire l’objet ni d’une ligne séparée ni d’une colonne
séparée sur la facture) ;
- l’article 17 du décret 2005-829 dit « DEEE » qui prévoit une mention particulière figurant au
bas de la facture de vente, du coût correspondant à l’élimination des déchets électriques et
électroniques ménagers « historiques », c’est-à-dire mis sur le marché avant le 13 août 2005
(date d’entrée en vigueur de la directive référente) ;
- l’article 25 de ce même décret prévoyant des sanctions pénales si ce coût « unitaire » n’est pas
mentionné sur les factures ;
- l’article L. 541-10-2 du code de l’environnement adopté par la loi de finances rectificative du
31 décembre 2005, prévoyant que ces coûts unitaires ne peuvent faire l’objet de réfaction et
doivent être répercutés à l’identique jusqu’au consommateur final (de ce fait, les rabais,
remises, ristournes et escomptes ne peuvent leur être appliqués).


et ca directement dans le décret:
Citation
2.2.1 - Champ d’application
En application de l’article L.541-10-2 du code de l’environnement, les producteurs et les
distributeurs « font apparaître, en sus du prix hors taxe, en pied de factures de vente de
tout nouvel équipement électrique et électronique ménager, les coûts unitaires supportés
pour l'élimination de ces déchets ».
• Producteur
Selon l’article 3.1°du décret du 20 juillet 2005 « est considérée comme producteur toute
personne qui fabrique, importe ou introduit sur le marché national à titre professionnel des
équipements électriques et électroniques, sauf si ces équipements sont vendus sous la seule
marque d'un revendeur. Dans ce cas, le revendeur est considéré comme producteur ».
C’est le producteur ainsi défini, qui doit s’acquitter des obligations « d'enlever ou de faire
enlever, puis de traiter ou de faire traiter les déchets d'équipements électriques et
électroniques ménagers collectés sélectivement», soit en mettant en place un système
individuel, soit en adhérant à un organisme agréé auquel il verse une contribution financière.
L’organisme agréé établit une facture à partir du bordereau communiqué par le producteur
relatant les poids, les quantités, les catégories et les références des équipements électriques ou
électroniques ménagers mis sur le marché.
• Distributeur
Selon l’article 3.2° du décret du 20 juillet 2005 « est considérée comme distributeur toute
personne qui, quelle que soit la technique de distribution utilisée, y compris par
communication à distance, fournit à titre commercial des équipements électriques et
électroniques à celui qui va les utiliser».


un simple import fait de nous des producteurs... si on le place sous sa marque. c'est souvent le cas

et puis ca:
Citation
Informer les acheteurs du coût unitaire de l'élimination des déchets historiques :
Depuis le 15 novembre 2006, les revendeurs d'équipements électriques et électroniques ménagers
sont tenus d'informer leurs acheteurstdu montant de contribution visible dont les producteurs se
sont acquittés pour chaque équipement qu'ils mettent sur le marché et qui a déjà été répercutée
par les différents acteurs de la chaîne.
Le décret n02005-829 du 20 juillet 2005 prévoit en effet que les producteurs (fabricants, importateurs
ou distributeurs marques propres) assurent l'enlèvement et le traitement des DEEE ménagers
collectés sélectivement. Ils adhèrent pour cela à un organisme agréé qui organise cet enlèvement
et ce traitement et auquel ils versent, pour financer leurs obligations, une contribution par
équipement mis sur le marché. Le montant de cette contribution par équipement est la
contribution visible, également appelée éco-contribution, éco-participation, contribution
environnementale ou coût de l'élimination. Ce montant est répercuté à l'identique et de manière
visible jusqu'au consommateur final pendant une période transitoire. La contribution visible est un
élément du coût total de l'équipement et non une taxe.

Ce montant doit être indiqué par le fournisseur de l'équipement. C'est le producteur qui lui aura
lui-même transmis cette information. A défaut, il n'incombe pas au revendeur de déterminer luimême
le montant de la contribution, mais il convient toutefois de solliciter ses fournisseurs de
manière à ce que cette information lui soit transmise dans les meilleurs délais 3 les
distributeurs, en aval, soient informés du montant de la contribution à afficher.
Le montant de la contribution environnementale pourra être différent pour un même type de
produit, en fonction de I'organisme agréé auquel adhère le producteur de l'équipement

Par quels moyens ?

Le montant de la contribution environementale doit apparaÎtre au bas de la facture de vente
(autant de mentions en bas de facture que d'équipements vendus). Elle ne peut faire l'objet
d'aucune marge ou réfaction lors des négociations commerciales entre les différents revendeurs.

Écrit par : FoxP2 29 Feb 2012, 11:50

il y a une piste à explorer :
étant donné que le site est sur un dédié, je suppose que l'ensemble des fonction de programmation du SGBD (en l’occurrence mysql ici) est disponible.
il serait peut être opportun de déporter le code sql dans la partie cliente de l'application avec des procédures stockées déterministes et des user definition pour accélérer, voire optimiser le traitement des requêtes. si l'indexage est correctement effectué, les calculs mathématiques intégrés au moteur du sgbd seront bien meilleures, sachant que mysql s'en charge lui même.
en répartissant intelligemment la charge entre l'appli (php pour l'affichage) et mysql pour le crud, on peut fabriquer une ferrari.
je ne parle même pas de la lisibilité des fichiers qui s'en trouve forcément allégée.

Écrit par : paddybl 29 Feb 2012, 12:08

je dis pas le contraire fox... il étaient tout à fait possible de charger un array de toutes les ecotaxes en mémoire plutot que de le redemander à chaque fois.
mais perso de tout les sites qui on intégré ecotax personne ne m'avais rapporté un problème de surcharge jusqu'à aujourd'hui

et un array de plusieurs tables complétes avec tri, ca charge la mémoire quand même.. il est déjà limité à ce niveau...

et je le redis car j'en suis quazi sur, le problème de frogger74 vient d'une mauvaise intégration d'ecotax (ou autres contribes d'ailleurs) dans son fichier categories.php
le simple fait de cliquer sur modifier ne devrait pas générer autant de demande à la base de données

Écrit par : Gnidhal 29 Feb 2012, 12:37

@paddybl
Si je résume ce qui est dit dans les documents que tu fournis :
eco-participation != taxe
ne doit pas faire l'objet d'une ligne séparée dans la calcul de la facture
doit être mentionné pour tout équipement vendu

donc si dans le nom du produit tu as le prix et "dont eco-participation:xo" c'est suffisant (éventuellement montant calculé en fonction de la quantité).

La collecte de l'eco-participation est faite par le producteur (lire par là fabricant ou importateur direct) et est juste mentionnée par le revendeur final donc tout ce qui concerne le calcul et le coût de cette cotisation concerne uniquement la comptabilité du "producteur"
Cela sous-entends que tout ce qui est calcul de cette cotisation n'a rien à faire dans le calcul d'une boutique en ligne.
Si j'en juge de ce qui se fait chez certaines grandes enseignes, le prix fascial du produit contient ou non l'eco-partitipation (475€ soit 474.75€ + 0.25€ d'éco-part - fnac) (434.80€ + Eco Part : 0,25€ soit un total de 435,05€ - cdiscount)
Comme quoi pour paraitre moins cher sur des produits équivalents on peut faire du flanc à 25 centimes d'euros!
Le montant de l'eco-part n'est jamais indexé sur le prix mais selon une grille définie pour chaque article est n'est pas sensible aux remises ou autres variations de prix ponctuelles. Un champ supplémentaire de prix dans chaque produit précisant le montant de l'eco-part (qui sera alors multiplié par le nombre d'article) est largement suffisant.
sont impactées la table products et les classes shopping_cart et orders... plus ?

@foxP2
Je crains que ta méthodologie dépasse largement le champ applicable par les intervenants de ce post (moi y compris). Mais c'est vrai que si on change le moteur, on va ressentir de grands changements.

Écrit par : paddybl 29 Feb 2012, 12:54

tient j'ai retrouvé l'exemple de facture correcte que m'avait envoyé la répression des fraudes:



et au verso:



ca nécessitait pas mal de modif...


Écrit par : paddybl 29 Feb 2012, 15:30

frogger74 m'a envoyé sont fichier categories

difficile pour moi de le testé car il y tout un tas de champs que je n'ai pas dans ma base de données, de l'ajax attributes, etc...
apres une analyse du code j'ai pas vu d'erreur de boucle
mais en analysant le code j'ai retrouvé le pourquoi des 170 requètes d'ecotax
même si celà n'a jamais posé de soucis avant , j'explique le pourquoi:
il sagit donc de fabriquer un tableau "dynamique" en javascript qui va permettre le calcul ou re-calcul du ht et du ttc si on change les tarifs où l'eco-participation.
si vous voyez une autre solution moi pas de soucis.

comme je l'ai dit je n'ai jamais vu de ralentissement à cause de ca, même avec un serveur qui remontait à 2003 et seulement 2go de mémoire.

Code
<script type="text/javascript"><!--
var tax_rates = new Array();
<?php
    for ($i=0, $n=sizeof($tax_class_array); $i<$n; $i++) {
      if ($tax_class_array[$i]['id'] > 0) {
        echo 'tax_rates["' . $tax_class_array[$i]['id'] . '"] = ' . tep_get_tax_rate_value($tax_class_array[$i]['id']) . ';' . "\n";
      }
    }
?>
<!--debut modif by paddybl for ecotax-->
var ecotax_price = new Array();
var ecotax_rate = new Array();
<!--fin modif by paddybl for ecotax-->
<?php //debut modif by paddybl for ecotax
    for ($i=0, $n=sizeof($ecotax_price_array); $i<$n; $i++) {
      if ($ecotax_price_array[$i]['id'] > 0) {
        echo 'ecotax_price["' . $ecotax_price_array[$i]['id'] . '"] = ' . tep_get_ecotax_price_value($ecotax_price_array[$i]['id']) . ';' . "\n";
      }
    }
        for ($i=0, $n=sizeof($ecotax_price_array); $i<$n; $i++) {
      if ($ecotax_price_array[$i]['id'] > 0) {
        echo 'ecotax_rate["' . $ecotax_price_array[$i]['id'] . '"] = ' . tep_get_ecotax_rate_value($ecotax_price_array[$i]['id']) . ';' . "\n";
      }
    }//fin modif by paddybl for ecotax
?>
function doRound(x, places) {
  return Math.round(x * Math.pow(10, places)) / Math.pow(10, places);
}

function getTaxRate() {
  var selected_value = document.forms["new_product"].products_tax_class_id.selectedIndex;
  var parameterVal = document.forms["new_product"].products_tax_class_id[selected_value].value;

  if ( (parameterVal > 0) && (tax_rates[parameterVal] > 0) ) {
    return tax_rates[parameterVal];
  } else {
    return 0;
  }
}
<!--debut modif by paddybl for ecotax-->
function getEcoTaxPrice() {
  var selected_value = document.forms["new_product"].ecotax_rates_id.selectedIndex;
  var parameterVal = document.forms["new_product"].ecotax_rates_id[selected_value].value;

  if ( (parameterVal > 0) && (ecotax_price[parameterVal] > 0) ) {
    return ecotax_price[parameterVal];
  } else {
    return 0;
  }
}
function getEcoTaxRate() {
  var selected_value = document.forms["new_product"].ecotax_rates_id.selectedIndex;
  var parameterVal = document.forms["new_product"].ecotax_rates_id[selected_value].value;

  if ( (parameterVal > 0) && (ecotax_rate[parameterVal] > 0) ) {
    return ecotax_rate[parameterVal];
  } else {
    return 0;
  }
}
<!--fin modif by paddybl for ecotax-->
function updateGross() {
  var taxRate = getTaxRate();
  
  <!--debut modif by paddybl for ecotax-->
  var ecotaxPrice = getEcoTaxPrice();
  var ecotaxRate = getEcoTaxRate();
  <!--fin modif by paddybl for ecotax-->

  var grossValue = document.forms["new_product"].products_price.value;

  if (taxRate > 0) {
    grossValue = grossValue * ((taxRate / 100) + 1);
  }
    <!--debut modif by paddybl for ecotax-->
    
if (ecotaxPrice >0){

var ecotaxTTC = doRound(parseFloat(ecotaxPrice) * ((parseFloat(ecotaxRate) /100) + 1),4);
grossValue = parseFloat(grossValue) +ecotaxTTC;
}
  <!--fin modif by paddybl for ecotax-->

  document.forms["new_product"].products_price_gross.value = doRound(grossValue, 4);
}

function updateNet() {
  var taxRate = getTaxRate();
  
<!--debut modif by paddybl for ecotax-->
  var ecotaxPrice = getEcoTaxPrice();
  var ecotaxRate = getEcoTaxRate();
  <!--fin modif by paddybl for ecotax-->
  
  var netValue = document.forms["new_product"].products_price_gross.value;
  
  <!--debut modif by paddybl for ecotax-->  
if (ecotaxPrice >0){

var ecotaxTTC = doRound(parseFloat(ecotaxPrice) * ((parseFloat(ecotaxRate) /100) + 1),4);
netValue = parseFloat(netValue) - ecotaxTTC;
}
  <!--fin modif by paddybl for ecotax-->
  

  if (taxRate > 0) {
    netValue = netValue / ((taxRate / 100) + 1);
  }

  document.forms["new_product"].products_price.value = doRound(netValue, 4);
}

/*
COST MARGIN MOD
START OF CODE ADDITION
*/
function updateMargin() {
  var realValue = document.forms["new_product"].products_price.value;
  var costValue = document.forms["new_product"].products_cost.value;
marginValue = parseInt(-100 + (realValue/costValue)*100);
  document.getElementById('products_price_margins').innerHTML = marginValue + "%";
}
/*
COST MARGIN MOD
END OF CODE ADDITION
*/

//--></script>


petite précision le array $ecotax_price_array peu etre limiter en nombre de ligne en définissant une catégorie d'éco-participation à chaque catégorie
ce qui n'a pas été fait s'il parcourt l'ensemble des éco-participations
Code
    //debut modif by paddybl for ecotax
    $ecotax_price_array = array(array('id' => '0', 'text' => TEXT_NONE));
    if($pInfo->ecotax_class_id!=0){
    $ecotax_price_query = tep_db_query("select ecotax_rates_id, ecotax_price from " . TABLE_ECOTAX_RATES . " where ecotax_class_id='".$pInfo->ecotax_class_id."' order by ecotax_rates_id");}else{$ecotax_price_query = tep_db_query("select ecotax_rates_id, ecotax_price from " . TABLE_ECOTAX_RATES . " order by ecotax_class_id");}
    while ($ecotax_price = tep_db_fetch_array($ecotax_price_query)) {
      $ecotax_price_array[] = array('id' => $ecotax_price['ecotax_rates_id'],
                                 'text' => $ecotax_price['ecotax_price']);}
//fin modif by paddybl for ecotax


Écrit par : paddybl 29 Feb 2012, 16:01

bien je modifie moi même le code pour ne plus faire appel à la base de données.
mais attention ce n'est pas la même chose que la fonctionnalité d'origine!
en effet l'ancien système revérifait et recalculait la somme des écoparticipations en fonction des zones et pays qui pouvaient inclure plusieurs éco-participations par type de produit
comme en belgique si je dis pas de bétise. (comme le fait la tva pour ceux qui voit la fonction)
donc rechercher et remplacer

Code
<?php //debut modif by paddybl for ecotax
    for ($i=0, $n=sizeof($ecotax_price_array); $i<$n; $i++) {
      if ($ecotax_price_array[$i]['id'] > 0) {
        echo 'ecotax_price["' . $ecotax_price_array[$i]['id'] . '"] = ' . tep_get_ecotax_price_value($ecotax_price_array[$i]['id']) . ';' . "\n";
      }
    }
        for ($i=0, $n=sizeof($ecotax_price_array); $i<$n; $i++) {
      if ($ecotax_price_array[$i]['id'] > 0) {
        echo 'ecotax_rate["' . $ecotax_price_array[$i]['id'] . '"] = ' . tep_get_ecotax_rate_value($ecotax_price_array[$i]['id']) . ';' . "\n";
      }
    }//fin modif by paddybl for ecotax
?>

par
Code
<?php //debut modif by paddybl for ecotax
    for ($i=0, $n=sizeof($ecotax_price_array); $i<$n; $i++) {
      if ($ecotax_price_array[$i]['id'] > 0) {
        echo 'ecotax_price["' . $ecotax_price_array[$i]['id'] . '"] = ' . $ecotax_price_array[$i]['text'] . ';' . "\n";
      }
    }
        for ($i=0, $n=sizeof($ecotax_price_array); $i<$n; $i++) {
      if ($ecotax_price_array[$i]['id'] > 0) {
        echo 'ecotax_rate["' . $ecotax_price_array[$i]['id'] . '"] = ' . $ecotax_price_array[$i]['id'] . ';' . "\n";
      }
    }//fin modif by paddybl for ecotax
?>

Écrit par : Gnidhal 29 Feb 2012, 16:32

on peut toujours optimiser un peu : une façon de diviser par deux le nombre de requêtes sur cette portion

Code
<script type="text/javascript"><!--
var tax_rates = new Array();
<?php
    for ($i=0, $n=sizeof($tax_class_array); $i<$n; $i++) {
      if ($tax_class_array[$i]['id'] > 0) {
        echo 'tax_rates["' . $tax_class_array[$i]['id'] . '"] = ' . tep_get_tax_rate_value($tax_class_array[$i]['id']) . ';' . "\n";
      }
    }
?>
<!--debut modif by paddybl for ecotax-->
var ecotax_price = new Array();
var ecotax_rate = new Array();
<!--fin modif by paddybl for ecotax-->
<?php //debut modif by paddybl for ecotax
//     for ($i=0, $n=sizeof($ecotax_price_array); $i<$n; $i++) {
//       if ($ecotax_price_array[$i]['id'] > 0) {
//         echo 'ecotax_price["' . $ecotax_price_array[$i]['id'] . '"] = ' . tep_get_ecotax_price_value($ecotax_price_array[$i]['id']) . ';' . "\n";
//       }
//     }
//         for ($i=0, $n=sizeof($ecotax_price_array); $i<$n; $i++) {
//       if ($ecotax_price_array[$i]['id'] > 0) {
//         echo 'ecotax_rate["' . $ecotax_price_array[$i]['id'] . '"] = ' . tep_get_ecotax_rate_value($ecotax_price_array[$i]['id']) . ';' . "\n";
//       }
//     }//fin modif by paddybl for ecotax
    for ($i=0, $n=sizeof($ecotax_price_array); $i<$n; $i++) {
      if ($ecotax_price_array[$i]['id'] > 0) {
        $ecotax_values = tep_get_ecotax_values($ecotax_price_array[$i]['id']);
        echo 'ecotax_price["' . $ecotax_price_array[$i]['id'] . '"] = ' . $ecotax_values['price'] . ';' . "\n";
        echo 'ecotax_rate["' . $ecotax_price_array[$i]['id'] . '"] = ' . $ecotax_values['rate'] . ';' . "\n";
      }
    }//fin modif by paddybl for ecotax

?>
// suite du code javascript.....................................
j'ai commenté le code à remplacer et ajouté une portion qui regroupe les deux
puis avec l'ajout de la fonction qui va bien dans general.php
Code
  // ajout fonction dans general.php
    function tep_get_ecotax_values($class_id) {
     $ecotax_query = tep_db_query("select SUM(tax_rate) as ecotax_rate, SUM(ecotax_price) as ecotax_price from " . TABLE_ECOTAX_RATES . " where ecotax_rates_id = '" . (int)$class_id . "'");
     if (tep_db_num_rows($ecotax_query)) {
       $ecotax_price = 0;
       $ecotax_rate = 0;
       while ($ecotax = tep_db_fetch_array($ecotax_query)) {
         $ecotax_price += $ecotax['ecotax_price'];
         $ecotax_rate += $ecotax['ecotax_rate'];
       }
       return array('price'=>$ecotax_price, 'rate'=>$ecotax_rate);
     }
     return false;
   }

ça devrait rouler sauf erreur de syntaxe.
J'ai pas pas vérifié car je n'ai pas installé la contribution.

Écrit par : paddybl 29 Feb 2012, 17:29

pas béte en effet.
au final qu'en j'avais fait ce code y avait tellement a faire un peu partout que j'ai fait au plus polyvalent possible
et comme j'ai jamais eut de remarque sur le problème on oublie, si tu vois ce que je veux dire.

reste que la version sans requète va permettre de vérifier si vraiment celà accélère le site de frogger...
je ne pense pas... ou alors y a un sacres problème de réglage du serveur si ces simples boucles suffise à saturer son serveur

Écrit par : frogger74 8 Mar 2012, 09:50

Bonjour à tous!


Merci à vous et désolé de répondre tardivement, j'ai du faire des essais et recherche et avec l'aide d'un expert en PHP/MYSQL, il semblerais que nous ayont trouvé une solution, nous avons pris note de vos modifications dans le backoffice (categories.php), suite à nos recherches nous avons effectué des modifications sur le site:

BACKOFFICE
Le ralentissement de mon backoffice était en fait du à l'option "qtpro_doctor_investigate_product", nous l'avons désactivé et ... miracle le backoffice décole !!

FRONTOFFICE / BACKOFFICE
Ensuite les soucis de boucles, nous avons mis en cache le résultat des requêtes SQL répétitive, du coup il n'y à plus de boucles dans les logs.. (le cache se vide toute les heures...)

Voila je ne sais pas ce que vous en pensé.... j'attends de voir ce que cela va donner en production, mais j'ai encore des essais à faire et des choses à corriger.

_____________________________________________________________

Sinon je met le résultat des pages généré dans le backoffice quand ont modifie un produit intégrant une écotaxe (avec ou sans votre modification du categorie.php):

1/ Solution d'origine:
Page générée en 0.244382 secondes.

2/ Solutions du forum (paddybl, voir message #29)
Page générée en 0.085997 secondes.

3/ Solution du Forum (paddybl + gnidhal, voir message #30)
Page générée en 0.080455 secondes.

Sinon, une question, est ce vrai que votre solution pose un problème, car elle évite la recherche de ecotaxe par zone ?? si, non, y'a moyen de faire de même coté Front Office ?.
_____________________________________________________________

Ensuite je mettrait les détails des modifications (si besoin d'amélioration ou de conseils, je suis toujours preneur..), si cela peux améliorer la contribution de paddybl, mais en fait mon grand soucis à été le mauvais mariage avec SPPC à certains endroit.... mais j'y travail. avec des PRO ! smile.gif

Merci à eux smile.gif

Écrit par : davas 1 Nov 2012, 10:52

Bonjour,

Merci à tous pour tous vos contributions et la lecture de ce post m'a parmis d'y voir plus clair sur l'ensemble des soucis et des moyens d'optimisation.

Neanmoins, pour rebondir sur le dernier message, je n'ai pas trouvé, comment désactiver le fameux qtpro_doctor_investigate ? C'est dans l'admin, dans le php ??

Merci pour cette dernière précision.

David

Propulsé par Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)