Google Analytics Measurement Protocole Ou Google Analytics Côté Serveur

Introduction au Measurement Protocol ou comment faire du Google Analytics côté serveur

Google analytic est un outil pour mesurer le trafic Web sur votre site web. Il nécessite de mettre un bout de code pour traquer les visites des internautes

Mais il est aussi possible d'envoyer les informations vers google analytics sans passer par un navigateur. Vous pouvez donc depuis un script côté serveur envoyer des informations vers Google analytic pour qu'il enregistre des informations
Pour ce faire nous devons utiliser une API qui s'appelle Measurement Protocol. Le principe est simple, il faut faire une requête de type POST vers le serveur de Google Analytics point

Je vais vous expliquer pourquoi connaître cet aspect de Google Analytics avec important, c'est relatif au tracking des achats sur votre site web. Dans le cas où le paiement s'effectue sur le site de la banque, et que le client revient sur votre site web, l'achat et suivi. Mais dans le cas où le paiement se finit et que la personne ne reviens pas sur votre site web, vous ne pouvez pas suivre les conversions.

Measurement protocol nous permet donc d'envoyer l'information comme quoi là ça a été réussi même si l'internat ne reviens pas sur votre site web après avoir payé sur le site de la carte bancaire

Le principe est simple, vous allez envoyer une requête vers le serveur de Google Analytics avec des paramètres bien défini, les paramètres doivent être au complet, sinon la requête échoue. Mais Google vous fournit à d'outils pour simuler et valider vos requêtes. cet outil c'est le Hitbuilder.

Mais d'abord nous allons voir un exemple très simple pour simuler une première requête vers le serveur de Google Analytics.

 

Il y a énormément de paramètres à envoyer car vous pouvez construire les mêmes requêtes que le script de Google Analytics sur le site web
Il vous faut vous référer à la page de documentation sur les paramètres pour voir la liste complète
Mais sans plus attendre faisant de notre première requête vers le serveur de Google Analytics
Il y a 4 paramètres obligatoire le premier paramètre concerne la version vous pouvez mettre ça n'a pas d'importance, le deuxième paramètre et le paramètre qui concerne le type de requêtes que vous allez vous allez faire , le plus simple c'est la pageview.
Le troisième paramètre est l'identifiant de votre compte Google Analytics et le dernier paramètres concerne le type de campagne pour simplifier nous allons mettre direct.

Voyons d'abord dans le HitBuilder comment nous allons construire à cette requête, dans un premier temps on construit les paramètres, en fait c'est la chaîne de paramètres que vous avez envoyer, ensuite vous allez cliquer sur le bouton Valider pour valider l'intégrité de cette requête et si tout se passe bien vous pouvez envoyer grâce à un bouton vers google Analytics la requête.

Pour visualiser le résultat de cette requête, basculer dans la vue temps réel de Google Analytics, vous aurez un retour immédiatement

Construire requêtes dans le Hitbuiler et cliquer sur Validate Hit

 

 

 

Allez ensuite sur votre interface Google Analytics dans le raport temps réel pour voir le résultat.

 

Étant donné que vous avez envoyé vraiment une requête vers votre serveur Google Analytics virgule les données Google Analytics de votre site de production seront affectés. Mais en développement vous pouvez vous permettre d'envoyer quelques données de test sont vraiment pollué les données de votre analytique.



Maintenant que l'on a réussi à envoyer une requête et à la visualiser grâce au graphique trafic temps réel de Google Analytics, on va essayer de faire une requête maintenant avec un script côté serveur. Attention, il y a un paramètre qui ne faut pas omettre et qui est le paramètre dp comme document path, je ne l'ai pas fait la première fois et aucune donnée n'a été envoyée,  ce n'est pas évident car si vous en mettez ce paramètre dans le tuto le HitBuilder, il va dire que la chaîne de requête est valide alors que aucune donnée n'a été envoyée, alors que dans la documentation de référence il est bien dit que dp et dh sont obligatoires dh étant le Host (nom de domaine).

Requêtes dans le Hitbuilder de type transactionnelle

Bien que cet exemple soit très simple, le plus simple possible, il nous faut quand même 6 paramètres pour compléter la requête. Avant d'aller plus loin vers les scripts côté serveur, regardons quand même comment est fait une requête de type e-commerce et transactionnelle puisque c'est le but de cet article c'est-à-dire qu'on voudrait identifier les transactions e-commerce grâce à un script côté serveur.

Je prendrai l'exemple du logiciel de e-commerce PrestaShop. dans le logiciel Prestashop les transactions sont identifiées par le numéro de commande (et non le numéro de panier), par exemple pour une commande dont le numéro de panier est 3012, le numéro de transaction est 3012.

Dans Google Analytics, vous pouvez voir les transaction dans Conversion > Transaction.

Envoi d'une transaction

 ti : transaction id

ta : transaction affiliation, ou le nom de la boutique

tr : transaction revenue,

ts : transaction shipping, frais de port

tt : transaction tax

cu : currency

Envoi d'un item

ti : transaction id, bien sûr si vous voulez que l'on sache dans quelle transaction cet item a été acheté !

in : item name

ip: item price

iq : item quantity

ic : item code (la référence de l'article)

iv : item category

cu : currency

 Lorsqu'on envoie vers google analytics un item, il faut spécifier bien sûr le numéro de la transaction à laquelle il est associé vous spécifiez un sous-total, mais attention il faut que lorsque vous envoyez les items du panier, le total des items doit être cohérent avec le montant de la transaction, je vous laisse faire ça à côté serveur, tout ceci pour vous dire que vous pouvez avoir une incohérence entre la transaction le montant de la transaction est le total des items du palier, le système vous le permet.

Measurement Protocol Validation Server

 

Url de validation :
https://www.google-analytics.com/debug/collect?tid=fake&v=1
Elle ne diffère de la véritable url que de /debug/
Url d'envoi de requêtes :
https://www.google-analytics.com/collect?tid=fake&v=1

Lorsque vous forger une requête et de vous envoyer vers le serveur de Google analytic même si elle échoue n'aurait pas de message d'erreur en retour.
C'est pour cela que Google Analytics vous propose une adresse pour tester vos requêtes.

Attention j'ai noté que même si une requête est bien formatée et qu'elle ne retourne pas d'erreur en mode débogage, ceci ne veut pas dire que vous avez réussi votre requête. J'ai eu le cas où j'ai essayé pour une première fois d'envoyer une requête transaction où je n'ai pas inclu tous les paramètres "optionnels" , la requête n'a rien donné, j'ai vérifié en mode débogage j'ai eu un retour ok mais je n'avais toujours rien dans le rapport de Google Analytics.


Finalement j'ai relu la documentation j'ai pris l'exemple et j'ai réussi ma requête comme quoi il faut toujours se reporter à la documentation et bien la lire.

 

Beaucoup d'exemples de la documentation officielle pour aide mémoire des différentes type de requêtes.

Measurement protocol n'est pas limité au web, les applications Android peuvent utiliser l'API de Measurement Protocol. Les requêtes en  POST ainsi que GET peuvent être utilisées.

J'espère vous avoir aidé dans votre quêtes du tracking intégrale de toutes les transactions, en particulier les transaction de clients pressé (souvent en BtoB) qui ne reviennent même pas vers le site d'origine, tellement ils ont confiance en leur fournisseur.

Il est absolument important de pouvoir tracker toutes les conversion afin de mesurer le retour sur investissement des campagnes de marketing. Sans mesure on ne peut rien améliorer.

 

Cliquer sur le bouton vert pour envoyer la requêteEnvoi d'une transactionEnvoi d'un item de transaction

2017-05-14 14:05:52 0 Commentaires

Un Truc En PHP 5.3 Que Vous Ne Pouvez Plus Faire En PHP 5.4 Multi Define De La Même Constante

EN travaillant sur un script ecommerce ultra pourri mais qui est en prod et que je dois migrer vers un serveur avec une version PHP 5.4, je me suis aperçu qu'il y avait une erreur loggée dans error_log : il y avait deux définitions de la même constante. Et le scrit ne tournait donc pas sur le serveur, puisque après un test, avec un script php où je définissait deux fois la même constante, sur 5.3 ça tournait sans problème, la constante était aussi (presque) malléable qu'une variable, voici le script :

<?php
define('TO', "bonjour");
echo TO;
define('TO',"au revoir");
echo TO;
?>

sous PHP 5.3

$ php test.php
bonjourbonjour

Bien que la constante puisse être redéfinie, sa valeur  ne change pas.

sous PHP 5.4

$ php test.php
bonjourPHP Notice:  Constant TO already defined in /home/user/test.php on line 4
PHP Stack trace:
PHP   1. {main}() /home/user/test.php:0
PHP   2. define('TO', 'au revoir') /home/user/test.php:4

On voit que le premier echo est exécuté, mais que le second déclenche une notice (ça peut être une erreur fatale).

Je pense que c'est une bonne chose (absolument !), soyons logique une constante ne peut être changée alors pourquoi autoriser la redéclaration? Heureusement que ça a changé et que PHP soit un langage plus rigoureux.

 

Bonus :

En PHP 5.3 vous pouvez utiliser un index d'un tableau qui n'existe pas sans qu'il vous geule dessus,

ainsi :

<?php
echo $p[0];

ne vous avertira rien.

 

 

 

 

 

 

 

 

2017-05-12 07:05:12 0 Commentaires

Magento : Enlever Le Index.php De L'url

Par défaut, si lors de l'installation de Magento, vous n'avez pas coché l'option rewrite_url, vos urls auront "index.php" juste après le nom de domaine. Pour l'enlever, car ce n'est pas très beau, il faut au préalable que mod_rewrite (un module Apache pour réécrire les urls) soit installé.

Une fois ce prérequis rempli, vous allez dans System > Configuration, puis sous Genral > Web, dans la section Search Engine Optimization, pour la dropdown list mettez sur 'Yes'. Rafraichissez votre page administration et frontend.

2017-02-15 13:02:03 0 Commentaires

Magento Désinstaller Un Module Manuellement

Il existe peu d'information pour désinstaller un module dans Magento, or il est préférable de la faire proprement.

Désintaller un module consiste à désactiver dans un premier temps le module et ensuite effacer les fichiers php, et les tables qui sont créée s'il y en a.

Commencez par désactiver le module

Regardez s'il n'a pas un script de création de table (il existe alors un répertoire sql au même niveau que /Helper ou /controllers)

Enlevez donc les tables correspondantes

la table Magento native core_resource peut contenir des informations des modules.

Effacer les fichiers dans app/code et app/design, /skin, /js

 

Par rapport à Prestashop, c'est vraiment pas top, Prestashop permet de désinstaller programmatiquement, inutile de s'emmerder avec toutes ces manipulations.

2017-02-14 10:02:20 0 Commentaires

Magento Comment Mettre Des Produits Sur La Homepage

A la différence des autres logiciels de ecommerce, avec Magento vous allez avoir du mal à mettre votre produit en page d'accueil, sans faire une manipulation bien particulière.

Afficher des produits d'une catégorie sur la page d'accueil

Allez sur la catégorie qui vous intéresse et regardez son ID vous en aurez besoin pour la suite.

Allez dans CMS > Pages > Home

Allez dans l'onglet Content et collez le bout de code suivant :

{{block  type="catalog/product_list" category_id="4"  template="catalog/product/list.phtml"}}

 Update  !

Due à une mise à jour de sécurité, vous ne pouvez plus adopter cette méthode (plus exactement la SUPEE-6788), il faut toucher au xml du layout directement, donc dans la section Design de la page CMS, vous collez le bout de code suivant :

 

 

 

2017-02-13 08:02:56 0 Commentaires

Optimiser Mysql Avec Mysqltuner

Une installation de base de Mysql n'est pas optimisé pour votre ou vos sites web.

Aussi après un certains temps de fonctionnement, une heure par exemple, vous devez commencer à régler les paramètres de Mysql pour que Mysql aille plus vite.

Nous allons nous aider d'un programme en Perl Mysqltuner, que vous allez télécharger depuis votre shell via la commande suivante :

$ wget http://mysqltuner.pl/ -O mysqltuner.pl

$ perl mysqltuner.pl

Au bout de quelques instants Mysqltuner va vous sortir un rapport avec des recommandation. Ce sont de réglages à faire dans votre fichier my.cnf qui est le fichier de configuration de Mysql.

Voici un exemple de rapport généré :

[!!] User '@localhost' is an anonymous account.
[!!] User '@ns35.ovh.net' is an anonymous account.
[!!] User '@localhost' has no password set.
[!!] User '@ns35.ovh.net' has no password set.
[!!] User 'root@127.0.0.1' has no password set.
[!!] User 'root@ns35.ovh.net' has no password set.
[!!] User '@localhost' has user name as password.
[!!] User '@ns35.ovh.net' has user name as password.
[!!] There is no basic password file list!

-------- CVE Security Recommendations --------------------------------------------------------------
[--] Skipped due to --cvefile option undefined

-------- Performance Metrics -----------------------------------------------------------------------
[--] Up for: 4d 12h 12m 30s (89M q [228.694 qps], 20M conn, TX: 582G, RX: 4G)
[--] Reads / Writes: 78% / 22%
[--] Binary logging is disabled
[--] Physical Memory     : 1.9G
[--] Max MySQL memory    : 449.2M
[--] Other process memory: 518.0M
[--] Total buffers: 34.0M global + 2.7M per thread (151 max threads)
[--] P_S Max memory usage: 0B
[--] Galera GCache Max memory usage: 0B
[OK] Maximum reached memory usage: 141.2M (7.12% of installed RAM)
[OK] Maximum possible memory usage: 449.2M (22.64% of installed RAM)
[OK] Overall possible memory usage with other process is compatible with memory available
[OK] Slow queries: 0% (22/89M)
[OK] Highest usage of available connections: 25% (39/151)
[OK] Aborted connections: 0.00%  (65/20403660)
[!!] name resolution is active : a reverse name resolution is made for each new connection and can reduce performance
[!!] Query cache is disabled
[OK] Sorts requiring temporary tables: 0% (1K temp sorts / 4M sorts)
[!!] Joins performed without indexes: 296569
[OK] Temporary tables created on disk: 9% (90K on disk / 958K total)
[!!] Thread cache is disabled
[!!] Table cache hit rate: 0% (64 open / 299K opened)
[OK] Open file limit used: 12% (127/1K)
[OK] Table locks acquired immediately: 99% (32M immediate / 32M locks)

 

  Remove Anonymous User accounts - there are 2 anonymous accounts.
    Set up a Password for user with the following SQL statement ( SET PASSWORD FOR 'user'@'SpecificDNSorIp' = PASSWORD('secure_password'); )
    Set up a Secure Password for user@host ( SET PASSWORD FOR 'user'@'SpecificDNSorIp' = PASSWORD('secure_password'); )
    Enable the slow query log to troubleshoot bad queries
    Configure your accounts with ip or subnets only, then update your configuration with skip-name-resolve=1
    Adjust your join queries to always utilize indexes
    Set thread_cache_size to 4 as a starting value
    Increase table_open_cache gradually to avoid file descriptor limits
    Read this before increasing table_open_cache over 64: http://bit.ly/1mi7c4C
    Beware that open_files_limit (1024) variable
    should be greater than table_open_cache (64)
Variables to adjust:
    query_cache_size (>= 8M)
    join_buffer_size (> 128.0K, or always use indexes with joins)
    thread_cache_size (start at 4)
    table_open_cache (> 64)
    innodb_file_per_table=ON
    innodb_log_file_size should be equals to 1/4 of buffer pool size (=2M) if possible.


Regardez les point d'exclamations, ce sont les point à travailler ! Mais tous les point n'ont pa s la même importance selon ce que vous recherchez. Moi je cherche la performance, voici ce que je regarde de ce rapport :

Ce qui saute aux yeux c'est query cache qui n'est pas activé !! Le cache stocke les requêtes qui sont les plus utilisée, afin de ne pas taper dans le moteur de base de données Mysql, mais sur un résultat déjà calculé donc on gagne du temps.

Voyons comment on peut soigner ce point :

Vous aurez remarqué qu'une des recommandations est de logger les requêtes lents via le slow query log. Pour ce faire, on va mettre en action le slow query log .

Ensuite nous allons donner une taille au cache de 8 Mo comme suggéré.

D'abord il faut se connecter à Mysql en ligne de commande.

Ensuite pour connaitre l'existence d'un query cache :

mysql > SHOW VARIABLES LIKE 'have_query_cache';

+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+

Selon la documentation officielle ce n'est pas parce que c'est à YES qu'il existe !

mysql> SHOW VARIABLES LIKE 'query_cache_size';

+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| query_cache_size | 0     |
+------------------+-------+

Enfin il existe mais est à zéro. Donnons lui une taille :

mysql> SET GLOBAL query_cache_size = 8000000;

 


+------------------+---------+
| Variable_name    | Value   |
+------------------+---------+
| query_cache_size | 7999488 |
+------------------+---------+

voilà c'est en place ! Attendre un petit peu suivant le traffic de votre site web.

 

Attention ! ceci est à faire dans le fichier my.cnf, sinon quand vous allez redémarrer mysql, ça va disparaitre. Voilci quelques valeur recommandées :

query_cache_type = 1 // pour activer le cache
query_cache_size = 256M
query_cache_limit = 2M
query_cache_strip_comments =1

 

 

 

 

2017-02-02 14:02:34 0 Commentaires