---
title: "Moteur de Recherche Européen B2B d'Objets Publicitaires (European Sourcing)"
description: "Moteur de recherche B2B faisant office de salon en ligne pour les revendeurs d'objets publicitaires en Europe - précurseur des marketplaces actuelles."
locale: "fr"
canonical: "https://portfolio.josedacosta.info/fr/realisations/moteur-de-recherche-europeen-b2b-objets-publicitaires"
source: "https://portfolio.josedacosta.info/fr/realisations/moteur-de-recherche-europeen-b2b-objets-publicitaires.md"
html_source: "https://portfolio.josedacosta.info/fr/realisations/moteur-de-recherche-europeen-b2b-objets-publicitaires"
author: "José DA COSTA"
date: "2010"
type: "achievement"
slug: "moteur-de-recherche-europeen-b2b-objets-publicitaires"
tags: ["PHP 5.x", "Symfony 2/3", "MySQL", "Elasticsearch", "AngularJS", "Propel/Doctrine ORM", "Memcache", "RabbitMQ", "Apache", "Proxmox VE", "AWS SES", "PhoneGap/Cordova"]
generated_at: "2026-04-23T15:47:56.842Z"
---

# Moteur de Recherche Européen B2B d'Objets Publicitaires (European Sourcing)

Moteur de recherche B2B faisant office de salon en ligne pour les revendeurs d'objets publicitaires en Europe - précurseur des marketplaces actuelles.

**Date:** 2010 - 2016  
**Duration:** ~6 ans  
**Role:** Software Engineer puis Senior Software Engineer  
**Technologies:** PHP 5.x, Symfony 2/3, MySQL, Elasticsearch, AngularJS, Propel/Doctrine ORM, Memcache, RabbitMQ, Apache, Proxmox VE, AWS SES, PhoneGap/Cordova

### Key Metrics

- Lignes de code: **-** - PHP, JS, Twig, CSS, HTML
- Tables en base: **-** - MySQL (master-slave)
- Sous-applications: **-** - Écosystème microservices
- Langues supportées: **-** - FR, EN, DE, ES, IT, NL, PT
- Serveurs dédiés: **-** - OVH Proxmox VE
- Connecteurs fournisseurs: **-** - Import automatisé de données
- Entrees de versioning: **-** - 836 Git + 398 SVN
- Sites revendeurs: **-** - CMS hébergé MyEasyWeb

## Présentation et définition du projet

_Une quinzaine de sous-applications interconnectées, quatre générations de moteurs de recherche, 8 ans de développement_

### Domain

Communication par l'objet B2B - mise en relation des fournisseurs, revendeurs et agences européens dans l'industrie de l'objet promotionnel.

### Target Users

Professionnels B2B a travers l'Europe - agences de communication par l'objet, distributeurs, et exemples de fournisseurs européens intégrés (Midocean, PF Concept, BIC, Paul Stricker, SOL'S, TopTex, Topico, Inspirion, Makito, Xindao, Clipper, Cybernecard, Pixika, Delta, Passot, Lm, Boomerang, Axpol, Goya, GetImpressed, Giving, Lensen Toppoint, Cottel, Eljte, Frezal, Imbretex).

**Content:** European Sourcing est un **moteur de recherche B2B d'objets publicitaires** faisant office de salon professionnel permanent en ligne a l'échelle européenne - un **précurseur de ce qu'on appelle aujourd'hui les marketplaces**, destiné a tous les revendeurs d'objets publicitaires en Europe. Le projet constitue un **écosystème applicatif complet** compose d'une quinzaine de sous-applications interconnectées, developpees sur une periode de plus de 6 ans (2010-2017).

La plateforme met en relation trois types d'acteurs du marche de l'objet publicitaire :
- **Les fournisseurs** (fabricants/grossistes) qui référencent leurs catalogues produits → **B2B**
- **Les revendeurs/distributeurs** (agences de communication par l'objet) qui recherchent des produits pour leurs clients → **B2B**
- **Les visiteurs** qui consultent le catalogue en ligne sur les sites revendeurs (clients finaux) → **B2C**

Le système fonctionne comme un **salon professionnel permanent en ligne**, offrant aux fournisseurs une vitrine multicanal (catalogue en ligne, newsletters, bannieres publicitaires, guidebook annuel, Google Ads) et aux revendeurs un moteur de recherche produits multilingue couvrant 7 langues européennes.

**Domain:** Domaine métier

**Target Users:** Utilisateurs cibles

**Functional Scope:** Périmètre fonctionnel

**Scope Catalog:** Catalogue produits multilingue (7 langues)

**Scope Search:** Recherche full-text (Elasticsearch)

**Scope Extranet:** Back-office fournisseurs/revendeurs

**Scope Flux:** Import automatisé de données fournisseurs (26+ connecteurs)

**Scope Api:** API REST avec authentification WSSE

**Scope Translate:** Système de traduction centralisé

**Scope Payment:** Paiement en ligne (Sogenactif)

**Scope Mew:** CMS mini-sites revendeurs (MyEasyWeb)

**Scope Mobile:** Applications mobiles (PhoneGap/Cordova)

**Scope Stats:** Statistiques de consultation (vues, recherches, clics)

**Scope Export:** Export de données (CSV + images produits)

**Scope Seo:** Back-office SEO / Marketing

## Objectifs, contexte, enjeux et risques

_Digitaliser le marche européen de l'objet publicitaire_

### Context

Le projet initial (v1/v2) a été développé par **SQLI**, une ESN française, avec un framework PHP custom et des templates Smarty. Le code legacy contenait 398 revisions SVN couvrant la periode 2010-2013.

A mon arrivée chez SQLI, **5 développeurs PHP étaient dédiés à plein temps** au projet. Au fil du temps, j'ai pris en charge une part croissante du périmètre technique, jusqu'à assurer seul **l'essentiel des évolutions** - un rôle qui a naturellement évolué avec mon expertise grandissante et l'autonomie que me conférait l'environnement PME. Après avoir couvert seul le périmètre pendant un certain temps, j'ai demandé du renfort et obtenu l'embauche d'un second développeur.

A partir de 2014-2016, **notre nouvelle équipe Medialeads** a entrepris une **réécriture complète** de la plateforme, migrant progressivement du framework custom vers **Symfony 2/3** tout en maintenant le site public sur un framework MVC custom plus leger.

La plateforme était **multilingue** (7 langues), **multi-pays**, avec une forte volumetrie de données produits, et la nécessite de maintenir la compatibilité avec les flux de données fournisseurs existants - **le tout hébergé sur des serveurs dédiés OVH entièrement autogérés : nous faisions absolument tout nous-mêmes, de la configuration système aux déploiements**.

### Stake Business

Revenus des abonnements fournisseurs (240-288 EUR/an) et des services publicitaires (bannieres, newsletters, guidebook, Google Ads, mediaplanning).

### Stake Position

European Sourcing se positionnait comme la référence du sourcing d'objets publicitaires en ligne en Europe - un précurseur des marketplaces B2B actuelles, remplaçant les catalogues papier et salons physiques traditionnels.

### Stake Ecosystem

La société opérait egalement TendanceObjet.com, Kadobjet.fr, FranceObjet.com, Omyague.com, GourmetOnline.pro, Recherche-Publicitaire.com, GraphicSourcing.com, CPrint-Sourcing.com, WineSpiritSourcing.com, Tradexpo-Online.fr - chaque marque ciblant un segment spécifique du marche.

- Positionner la plateforme comme **la référence européenne** du sourcing B2B d'objets publicitaires en ligne, en remplacement des catalogues papier et salons physiques
- Proposer un **catalogue produits multilingue** agregeant **plusieurs millions de produits et variantes** provenant de dizaines de fournisseurs
- Fournir aux revendeurs un **moteur de recherche avance** avec filtres par categorie, marque, prix, attributs, marquage
- Automatiser l'**import des flux de données** fournisseurs (prix, stocks, docs, descriptions) de 26+ fournisseurs
- Offrir aux revendeurs une solution **clé en main de mini-sites e-commerce** (MyEasyWeb) avec leur propre vitrine brandée connectée au catalogue central
- Générer des **statistiques de consultation** détaillées pour les fournisseurs (vues produits, recherches, clics)

**Objectives:** Objectifs

**Context:** Contexte

**Stakes:** Enjeux

**Stake Business:** Modèle economique

**Stake Position:** Position stratégique

**Stake Ecosystem:** Écosystème de marques

**Risks:** Risques identifiés

**Risk1 Title:** Dette technique

**Risk1 Desc:** Migration progressive d'un framework custom vers Symfony, coexistence de deux architectures (SVN legacy + Git moderne), hachage MD5 des mots de passe avec une seule iteration et sans salt - cohérent avec l'état de l'art PHP de la décennie 2008-2014, avant que bcrypt ne devienne le standard par défaut.

**Risk2 Title:** Complexité d'intégration

**Risk2 Desc:** Les flux de données fournisseurs étaient hétérogènes (CSV, XML, API), nécessitant un adaptateur spécifique par fournisseur, tous maintenus dans flux.europeansourcing.com.

**Risk3 Title:** Dépendance a l'infrastructure

**Risk3 Desc:** 9 serveurs dédiés OVH avec virtualisation Proxmox, replication MySQL master/slave, déploiements manuels via svn up - reflet des contraintes techniques de l'époque, avant la démocratisation de Docker et des pipelines CI/CD modernes.

**Risk4 Title:** Bus factor

**Risk4 Desc:** Seulement 3 développeurs principaux pour l'ensemble de l'écosystème de 38 sous-projets et 9 serveurs.

## Les étapes - Ce que j'ai fait

_Du monolithe SQLI a l'architecture microservices distribuee_

**Phase1 Name:** Phase 1

**Phase1 Title:** Développement SQLI et legacy SVN (2008-2013)

**Phase1 Period:** 2008 - 2013

**Phase2 Name:** Phase 2

**Phase2 Title:** Reprise interne et microservices (2014-2016)

**Phase2 Period:** Jan 2016 - Dec 2016

**Phase3 Name:** Phase 3

**Phase3 Title:** Modernisation architecturale (2016-2017)

**Phase3 Period:** Mar 2016 - Nov 2016

## Les acteurs - Les interactions

_Collaboration au sein d'une équipe réduite mais hautement productive_

### Équipe de développement

3 a 5 développeurs actifs selon les periodes, avec une répartition claire des responsabilites :

### Workflow de développement

Organisation GitHub medialeads (Bordeaux), branches par développeur (jose, fancyweb, wamania), documentation interne DokuWiki. Pas de processus formel de Pull Requests identifié - l'équipe s'appuyait sur des merges directs de branches et des zones de code attribuees a chaque développeur.

## Les résultats

_Impact mesurable pour l'entreprise et pour ma carriere_

### Pour moi

- **Gestion massive de données et optimisation SQL** : maîtrise des **formes normales SQL** (1NF, 2NF, 3NF, BCNF), de tous les **types de jointures** (INNER/LEFT/RIGHT/CROSS/SELF), de l'**indexation avancée** (index B-tree, composites, covering), de l'analyse constante des plans d'exécution avec **`EXPLAIN ANALYZE`**, de la **réplication MySQL master-slave** et du **cache Memcache**. **Batchs nocturnes de plusieurs heures** pour recalculer stocks, prix et promotions sur l'ensemble du catalogue - à cette échelle, un index manquant pouvait transformer une requête de 50 ms en timeout de 30 secondes, donc chaque milliseconde gagnée par requête se multipliait sur des millions d'exécutions.
- **Moteurs de recherche et indexation** : passage pratique par **quatre générations** de moteurs - (1) **MySQL LIKE / FULLTEXT** (MyISAM/InnoDB), (2) **recherche full-text PostgreSQL** avec `tsvector`/`tsquery`, **index GIN** et fonctions `to_tsvector`/`ts_rank`, (3) **Apache Solr** indexant des centaines de milliers de produits avec facettage avancé (catégories, couleurs, prix, fournisseurs), suggestions, correction orthographique et scoring de pertinence personnalisé, (4) **Elasticsearch** avec inverted index, analyzers multilingues (stemming, tokenization, normalisation), scoring TF-IDF, agrégations et facettes. Apprentissage des différences profondes entre un moteur relationnel et un moteur de recherche dédié.
- **Algorithmes et règles métier complexes** : conception et implémentation de **nombreux algorithmes** et de **règles métier très complexes** - par exemple le calcul de toutes les combinaisons possibles de prix, de variantes produit et de disponibilité (**produit cartésien / explosion combinatoire** pouvant générer des milliers de combinaisons par produit entre tailles, coloris, quantités, types de marquage, zones de marquage et finitions). Maîtrise de la modélisation de règles de pricing dynamiques et de moteurs de décision métier.
- Maîtrise de l'**écosystème Symfony 2/3** en production à grande échelle (Propel, Doctrine, bundles, services, sécurité, WSSE)
- Développement de compétences solides en **migration de code legacy** - transition du monolithe SVN vers les microservices Git sans interruption de service
- Acquisition de connaissances métier en **marché B2B de l'objet publicitaire**, automatisation de flux de données et e-commerce multi-pays
- Apprentissage de la coordination au sein d'une petite équipe où chaque développeur possède des portions significatives du code

**Delivered Features:** **Fonctionnalites clés livrées :**
- Catalogue produits multilingue avec index Elasticsearch dédiés et scoring de pertinence personnalisé
- API REST avec authentification WSSE stateless (nonce + timestamp + digest)
- Connecteurs d'import automatisé gérant des flux hétérogènes CSV / XML / API
- Back-office fournisseurs/revendeurs avec gestion complète des produits
- Dashboard fournisseurs SPA (AngularJS 1.2 + CoffeeScript + Grunt + Bower)
- CMS mini-sites revendeurs (MyEasyWeb) avec vitrines brandées connectées au catalogue central
- Intégration paiement en ligne (Sogenactif, Société Générale)
- Back-office SEO / marketing (Zend Framework + ExtJS + crawler web)
- Applications mobiles hybrides (jQuery Mobile + PhoneGap/Cordova)

## Les lendemains du projet

_Ce qui s'est passe après mon départ du projet_

**Content:** **J'ai quitté le projet en novembre 2016**, en laissant une plateforme en ordre de marche. L'équipe a continué d'exploiter et de faire évoluer European Sourcing - **le projet n'a pas été interrompu**, il a simplement continué sans moi. La phase finale de consolidation autour de bundles Symfony partagés, que j'avais initiée, a été menée à terme par l'équipe.

Avec le recul, les choix architecturaux de la Phase 2 se sont révélés **pertinents et modernes pour leur époque** : l'approche orientée services avec sous-domaines dédiés, l'authentification WSSE stateless inter-services, l'architecture du moteur de recherche et l'infrastructure de connecteurs fournisseurs automatisés sont restés techniquement impressionnants bien après mon départ.

## Mon regard critique

_Rétrospective honnete sur 8 ans de développement_

### Would Do Differently

Avec les standards et le recul d'aujourd'hui, quelques choix auraient pu être différents - chaque décision avait du sens dans les contraintes de son époque :
- **Adopter un framework unique** dès le départ plutôt que de maintenir un framework PHP custom en parallèle de Symfony, même si le contexte historique justifiait cette coexistence pendant la migration.
- **Mettre en place une CI/CD** dès la migration vers GitHub (janvier 2016) - GitHub Actions n'existait pas encore, mais Jenkins, Travis CI ou GitLab CI étaient disponibles.
- **Utiliser Docker** pour les environnements dev et déploiement, même si Proxmox restait le standard de virtualisation mature pour les PME PHP à l'époque.
- **Centraliser l'accès aux données** via une seule API plutôt que de connecter chaque service directement à la base MySQL - un pattern qui ne s'est généralisé qu'après 2017.

**Strengths:** Points forts

**Improvements:** Points d'amélioration

**Would Do Differently:** Ce que j'aurais fait différemment

**Lessons:** Enseignements durables
