Scripts bin/
Point d’entrée en ligne de commande de Hydrogen. Trois familles :
- Crons / workers — à planifier (Task Scheduler en local, cron en prod). Ils vidangent des tampons, recalculent des agrégats ou régénèrent des fichiers statiques.
- Opérations ponctuelles — déploiement, bundling des migrations, application des réglages Meilisearch. Lancés à la main au moment voulu.
- Outils de dev / debug — harnais de test et diagnostic, jamais en prod.
Invocation PHP. Le binaire n’est pas dans le
PATHsur la machine de dev : utiliser le chemin complet, p. ex./c/laragon/bin/php/php-8.4.4-nts-Win32-vs17-x64/php.exe bin/<script>.php. Sur le serveur,php bin/<script>.phpsuffit.
Tous les scripts chargent .env via Hydrogen\Config\Env::load() puis
construisent le conteneur PHP-DI (useAutowiring(true) + useAttributes(true)),
sauf robots-generate.php (pas besoin du conteneur).
Convention de codes de sortie : 0 succès · 1 échec de bootstrap / IO ·
2 échec d’exécution (worker à relancer) ou arguments invalides.
Crons / workers
Section titled “Crons / workers”À cadencer périodiquement. Sauf mention contraire, un seul worker suffit : les tampons sont vidangés FIFO par id auto-incrémenté et chaque lot est commité atomiquement, donc deux workers concurrents ne feraient que se disputer les mêmes lignes (le perdant noop).
notifications-flush.php
Section titled “notifications-flush.php”Pousse les notifications en file vers OneSignal (1 ligne → 1 push, N lignes → un digest par destinataire).
php bin/notifications-flush.php- Cadence :
NOTIFICATION_DIGEST_INTERVAL_MINUTES(2 en dev, 5 en prod). - Sortie :
recipients,pushed,skipped,failed. - Service :
NotificationFlushService.
media-counters-flush.php
Section titled “media-counters-flush.php”Vidange le tampon de compteurs média, met à jour media_stats + media_view_daily,
puis GC la table de déduplication.
php bin/media-counters-flush.php- Cadence :
MEDIA_COUNTERS_FLUSH_TICK_SECONDS(défaut 30 s en prod). - Sortie :
drained,bumped,deletedEvents,gcRows. - Service :
MediaCountersFlushService.
user-counters-flush.php
Section titled “user-counters-flush.php”Identique au précédent pour les profils utilisateur : user_stats +
user_view_daily.
php bin/user-counters-flush.php- Cadence :
USER_COUNTERS_FLUSH_TICK_SECONDS(défaut 30 s en prod). - Sortie :
drained,bumped,deletedEvents,gcRows. - Service :
UserCountersFlushService.
tracking-flush.php
Section titled “tracking-flush.php”Vidange le tampon de clics (tracking_event) et met à jour tracking_stats +
tracking_daily. Les conversions ne passent pas par ici (écrites en synchrone
par l’endpoint postback admin).
php bin/tracking-flush.php- Cadence :
TRACKING_FLUSH_TICK_SECONDS(défaut 30 s en prod). - Sortie :
drained,bumped,deletedEvents. - Service :
TrackingFlushService.
account-purge.php
Section titled “account-purge.php”Efface irréversiblement les comptes dont la fenêtre de grâce RGPD est écoulée :
suppression des médias possédés (fichiers + DB + index), anonymisation de la ligne
user, retrait du document de recherche et du token de suppression.
php bin/account-purge.php [limit]- Argument :
limitplafonne le nombre de comptes traités ce tick (défautACCOUNT_PURGE_BATCH_SIZE, fallback 50). - Cadence : quotidienne. Idempotent — un crash retente au tick suivant.
- Sortie :
purgedUsers,erasedMedias. - Service :
AccountPurgeService.
platform-metrics-rollup.php
Section titled “platform-metrics-rollup.php”Recalcule le rollup KPI quotidien (hxa_bo.platform_metric_daily) lu par les
dashboards de tendances du back-office.
php bin/platform-metrics-rollup.php- Cadence : une fois par jour, hors pointe (p. ex. 03:00). La fenêtre
PLATFORM_METRICS_LOOKBACK_DAYS(défaut 7) re-plie les derniers jours pour corriger les lignes arrivées en retard. UPSERT → rattrapage manuel sûr. - Sortie :
days,flowRows,snapshotRows,countryRows. - Service :
PlatformMetricsRollupService.
sitemap-generate.php
Section titled “sitemap-generate.php”Régénère public/sitemap.xml à partir des providers de sitemap enregistrés.
Écriture atomique (.tmp + rename()) pour qu’un crawler ne voie jamais un
document à moitié écrit.
php bin/sitemap-generate.php- Cadence : périodique, pour rester en phase avec le catalogue (nouveaux pays indexés, nouvelles pages du registry…).
- Sortie : nombre d’URLs, octets, durée.
- Fichier statique : servi directement par le serveur web, hors hot path PHP.
robots-generate.php
Section titled “robots-generate.php”Régénère public/robots.txt à partir de APP_URL. Même écriture atomique.
php bin/robots-generate.php- Cadence : à chaque changement de
APP_URL(typiquement au déploiement) ou dans le même tick quesitemap-generate.php. - Prérequis :
APP_URLnon vide (sinon code1). - Sortie :
Disallow: /api/+/admin/, ligneSitemap:verssitemap.xml.
Opérations ponctuelles
Section titled “Opérations ponctuelles”deploy.php
Section titled “deploy.php”Déploiement FTP/FTPS à la demande, push du delta uniquement (cf. docs/deploy.md pour la configuration et les détails).
php bin/deploy.php [--config=PATH] [--dry-run] [--mirror] [--help]php bin/deploy.php --rollback [--backup=ID] [--dry-run] [--config=PATH]| Option | Effet |
|---|---|
--config=PATH | Chemin du fichier de config (défaut ./deploy.config.php). |
--dry-run | Affiche le plan sans contacter le serveur. |
--mirror | Supprime aussi les fichiers distants absents en local. |
--rollback | Annule le dernier déploiement depuis sa sauvegarde. |
--backup=ID | Sauvegarde précise à restaurer (défaut : la plus récente). |
--help | Affiche l’aide. |
- Codes :
0ok / dry-run ·1config ou transfert ·2arguments invalides.
migrations-bundle.php
Section titled “migrations-bundle.php”Regroupe les migrations SQL non encore déployées en un fichier par base
(database/deploy/<clé>.sql), à exécuter sur le serveur puis supprimer. Pas de
runner automatique : le schéma est appliqué à la main.
php bin/migrations-bundle.php # génère les bundles (sûr, relançable)php bin/migrations-bundle.php --dry-run # liste le delta sans écrirephp bin/migrations-bundle.php --mark # avance le watermark (APRÈS un déploiement réussi)- Delta = migrations dont le préfixe
YYYY_MM_DD_HHMMSSest supérieur au watermark dedatabase/migrations/.bundle-state.json. - Base cible = directive d’en-tête
-- @database: <clé>sur sa propre ligne. Clés :main(défaut →DB_NAME),bo(BO_DB_NAME),work(WORK_DB_NAME). Le fichier généré n’émet pas deUSE: l’opérateur choisit la base à l’exécution. - Flux : générer → exécuter les
.sql→--mark→ supprimerdatabase/deploy/. - Codes :
0ok ·1IO ·2arguments invalides.
media-meili-apply-settings.php
Section titled “media-meili-apply-settings.php”Pousse les réglages d’index média + synonymes dont dépend le pipeline hashtags.
Idempotent (updateSettings / updateSynonyms sont des upserts côté serveur).
php bin/media-meili-apply-settings.phpÀ lancer :
-
après le premier déploiement (l’index refuse les filtres
hashtags=et lesfacetSearchtant quefilterableAttributesne liste pashashtags), -
après édition de
config/hashtag_synonyms.php(Meili remplace la map en entier), -
après modification de la forme des réglages dans
MeilisearchMediaSync::applySettings(). -
Sortie : confirmation settings + nombre de synonymes.
-
Codes :
0ok ·1settings KO ·2settings ok mais synonymes KO (relance sûre).
Outils de dev / debug
Section titled “Outils de dev / debug”Non destinés à la production. Ces scripts écrivent en base et sur disque ; ne jamais les lancer sur un environnement réel.
debug_google_token.php
Section titled “debug_google_token.php”Diagnostique pourquoi un id_token Google échoue à la vérification : header JOSE
décodé (kid, alg), payload non vérifié (iss, aud, exp, email…), puis résultat de
la vraie vérification signature + claims.
php bin/debug_google_token.php "<id_token>"test-media-upload.php · test-media-http.php · test-media-glide.php · test-media-crud.php
Section titled “test-media-upload.php · test-media-http.php · test-media-glide.php · test-media-crud.php”Harnais de test ad-hoc du pipeline média. Ils fabriquent un JPEG synthétique via Imagick, ciblent le premier utilisateur confirmé trouvé en base, et exercent respectivement :
test-media-upload.php— l’upload via le service domaine (pHash, etc.).test-media-http.php— l’upload via une requête PSR-7 (3 slots de fichier).test-media-glide.php— l’upload puis la transformation Glide.test-media-crud.php— le cycle CRUD complet, y compris le cas interdit (média d’un autre utilisateur). ⚠️ Purge les médias existants de l’utilisateur de test pour être déterministe.
php bin/test-media-crud.phpAucun argument ni flag — tout est câblé en dur dans le script.