Description.
Fonctionnalité qui serait vraiment très intéressante.
Via un tag en PHP, collé après ou avant le tag javascript (et non pas dans le noscript car ce noscript n'est pas exécuté par tous les moteurs de recherche !!), on enregistre les logs des visiteurs détectés comme étant des moteurs de recherche. Liste des moteurs connus disponibles sur robots.net/robots.txt ou semblant.
Faire une liste des moteurs assez exhaustive tant que possible, sans bien sûr prendre en compte les robots qui ne sont pas des moteurs de recherche (toutes saloperies diverses :))
Une fois les logs des robots enregistrés (forme des logs à déterminer), avec le plus d'informations possibles (que nous fournit PHP donc, car les infos JavaScript ne sont pas dispos), on crée des rapports sur la visite des robots qui sont intégrés à phpMyVisites. 
Pour créer les rapports il faut bien sûr faire un archivage dans le même esprit que celui de phpmyvisites. On parcourt les logs pour enregistrer toutes les données sous forme préformatées, la plupart du temps sous forme de tableaux PHP sérialisés.
On profite alors de toute l'architecture de base de l'appli. Ce module serait accessible via un nouveau menu « Moteurs ».
Présentation contenu à déterminer.
Les stats disponibles pourraient être (à compléter par de bonnes idées)
Au niveau logs, calculs, archivages : il faut à mon avis internaliser le process à phpmyvisites directement.
Les robots ont a mon avis une propre table d'archivage spécifique.
Les pages qu'ils ont vues sont caractérisées par des ID reliées aux URL dans une table crée et alimentée lors de l'archivage.
On utilise le même principe de nommage des pages, sauf que en plus de la variable javascript pagename qui contient le nom de la page, on assigne également une variable php $namepage qui sera utilisée à la place de l'URL pour savoir quelles pages ont visitées les robots. Si ce nom n'est pas renseigné, on utilise l'url brute, mais ça peut faire mal si le site a 10000 urls différentes (de Mo de textes en base qui font mal).
Allure du code PHP.
 <?php
 $pagename = "; // valeur a remplir, sinon l'URL sera utilisée
 include "http://www.site.com/phpmyvisites/searchengines.php";
 <?php
 $pagename = "; // valeur a remplir, sinon l'URL sera utilisée
 include "/data/members/paid/l/e/monsite.com/htdocs/www/phpmyvisites/searchengines.php";
 <?php
 $pagename = "; // valeur a remplir, sinon l'URL sera utilisée
 print("<img src=\"http://site.com/phpmv/searchengines.php?para1=TOTO&param2=".$_SERVER['truc']");;
Voila un tag qui devrait fonctionner :
 <?php
 $pagename = "; // valeur a remplir, sinon l'URL sera utilisée
 $_SERVER = $HTTP_SERVER_VARS; // ligne inutile !
 $url = $_SERVER['REQUEST_URI'];
 $url = urlencode($url); // mettre les urlencode directement au dessus urlencode($_SERVER['REQUEST_URI']);
 $ip = $_SERVER['REMOTE_ADDR'];
 $agent = $_SERVER['HTTP_USER_AGENT'];
 $agent = urlencode($agent);
 print("<img src=http://www.site.com/phpmv/searchengines.php?url=$url&ip=$ip&agent=$agent>");
Je suis en train de le tester.-- 23 jul 2005 à 16:11 (UTC)
Pour la requête HTTP, à partir du code de Marco j'ai testé ça :
Je n'ai pas d'affichage de "probleme", donc à priori la connection se fait,
le echo"$ligne"; me donne :
mais rien ne se passe (pas de prise en compte de la visite), pourquoi? 
Si je le met sur une page de mon site ça marche, mais par contre si je le met sur un site hébergé sur un autre serveur (Multimania dans ce cas) ça ne marche pas. Quelqu'un a une idée?
Je crains donc qu'il n'y ai pas de solution universelle, peut-être il faudra proposer plusieurs forme de tag...
Au niveau des fonctionnalités il faut voir ce que font les outils du marché : 
pour prendre leurs bonnes idées.
On peut ajouter http://www.php-tools.de/site.php (patSpiderizer) en GPL
Mais attention cette solution exige que le serveur audité comprenne le php et que phpMyVisites soit sur le même serveur. C'est contraignant et limitatif, prévoir une option pour que ce ne soit pas actif. Voir aussi quelles sont les limitations de noscript, ça peut être suffisant.

Matomo/CodingStandard
Pourquoi adopter un style commun ?
Extrait de http://www-portal-stage.oracle.com/technology/tech/opensource/PHP_Coding_Standard.htm
 Good Points
 When a project tries to adhere to common standards a few good things happen:
 * programmers can go into any code and figure out what's going on
 * new people can get up to speed quickly
 * people new to PHP are spared the need to develop a personal style and defend it to the death
 * people new to PHP are spared making the same mistakes over and over again
 * people make fewer mistakes in consistent environments
 * programmers have a common enemy :-) 
 Bad Points
 Now the bad:
 * the standard is usually stupid because it was made by someone who doesn't understand PHP
 * the standard is usually stupid because it's not what I do
 * standards reduce creativity
 * standards are unnecessary as long as people are consistent
 * standards enforce too much structure
 * people ignore standards anyway 
Pourquoi Piwik n'impose pas un coding style 'standard' ?
Nous pensons que les coding guidelines sont trop parfois trop restrictives, et parfois incomplètes. Nous préférons donc faire un résumé de ce qui nous semble indispensable et important. Nous avons pour cela utilisé plusieurs guides différents (5 au total) et fait un résumé bilan des meilleures idées et concepts, pour présenter l'ensemble des règles suivantes.
"Les points non soulignés sont donc laissées à la liberté d'expression du développeur !"
Introduction.
Quelques notions introductives :
Général.
Commentaires généraux sur le style de codage à utiliser obligatoirement
 if (condition)
 ...
 else
 ...
et
 if (condition) {
 } else if (condition) {
 } else {
La première semble plus claire et est conseillée !
Moi je conseille la deuxième, beaucoup plus simple à lire et plus concise :-P !
 $a = 'hello';
 $bbbb = 'world';
 $cccccccc = 'foobar';
 if ((condition1 && condition2)
 || (condition3 && condition4)
 ||!(condition5 && condition6)) 
 doSomethingAboutIt();
 $i_toto = 1;
 $i_tata = 2;
 SELECT S.first_name, S.last_name 
 FROM students S
 WHERE S.email = " 
 ORDER BY S.last_name";
 Exemples :
 $foo = $assoc_array[blah]; IS WRONG
 $foo = $assoc_array['blah']; IS OK
Commentaires.
 // ici le commentaire
 /* ici
 * un 
 * commentaire
 * what the function does in one line.
 * more detailed description on 0-n lines, if needed.
 * @access [public|static|pseudostatic]
 * @param [string|int|double|bool|array|object|mixed] $paramName1 desc
 * @param [string|int|double|bool|array|object|mixed] $paramName2 desc
 * @param [string|int|double|bool|array|object|mixed] $paramNameN desc
 * @return datatype description
 * @throws not until PHP 5
 * @see some_function()
 * @todo description
 * @since ATutor version, PHP version (comma separated list)
 * @status stable|experimental (if not set then considered stable)
 * @pattern singleton|factory|mvc|observer|facade|...
 * @author description (comma separated list)
 function something() 
 ...
Conventions de nommage.
Cette partie est très importante et doit être scupuleusement suivie !
 Exemples :
 $currentuser is WRONG
 $current_user is WRONG
 $currentUser is OK
 $isLogged
 $setParamsOn
 Exemples :
 getToto()
 loadFoo()
 sellMs()
 phpmvRocks()
 cocoricoDeBonMatin()
 Exemples :
 L'utilisateur est il loggué ?
 isUserLogged()
 Piwik est il puissant ?
 isPhpmvPowerfull() 
 class DatabaseLayer
 class BrowserDetection
 a_ : tableau (array)
 s_ : chaîne (string)
 i_ : entier (integer)
 b_ : booleen (boolean)
 g_ : globale (global)
Programmation.
 $a_t = array();
 $s_t = ';
 switch ($x) {
 case 'hello':
 return TRUE;
 break;
 Exemple :
 // le sizeof() est appelé à chaque itération de la boucle : MAUVAIS !
 for ($i = 0; $i < sizeof($post_data); $i++)
 doSomething();