IA éditeur : appel asynchrone via worker — ne plus bloquer PHP-FPM #101
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problème
Actuellement, cliquer sur « Analyser et proposer » dans l'éditeur déclenche :
Un seul appel IA monopolise un worker PHP-FPM pendant toute la durée de l'appel API. Sur un pool de taille modeste (8–16 workers), une poignée d'appels simultanés suffit à rendre le site indisponible pour les autres visiteurs. Le timeout est actuellement fixé à 90 s (
AiService.php).Solution : pattern enqueue + worker + poll
Le worker tourne en dehors du cycle requête/réponse HTTP. PHP-FPM est libéré dès le retour du
job_id.Infrastructure existante à réutiliser
src/Infrastructure/Database.php→Database::get()database/migration_015_mail_queue.sql+src/Service/MailQueue.phpMailQueue::reserveBatch()migration_017_ai_jobs.sqlAiServicesrc/Service/AiService.php1. Migration
database/migration_017_ai_jobs.sqlLe champ
expires_at(1 h) permet un nettoyage périodique des résultats lus.contentpeut être long (jusqu'à 8 000 caractères) — utiliserTEXTsans limite.2. Worker CLI
scripts/ai_worker.phpScript PHP autonome, appelé avec l'UUID du job :
3. Routes dans
public/index.phpPOST /?action=ai_enqueueRemplace
ai_query. Insère le job en DB et spawne le worker détaché :GET /?action=ai_poll&job_id=xxxRetourne le statut courant :
4. Mise à jour de
ai-editor.jsRemplacer le
fetchbloquant par un cycle enqueue → poll :5. Nettoyage des jobs expirés
Ajouter dans
scripts/ai_worker.php, après chaque exécution :Pas besoin de cron dédié : le nettoyage se fait à chaque invocation du worker.
6. Sécurité
ai_enqueueetai_pollnécessitentrequireAuth()(déjà le cas pourai_query)job_idest un UUID v4 généré par PostgreSQL (gen_random_uuid()) — non prédictibleai_pollne retourne le résultat qu'à l'utilisateur authentifié, sans vérifier que le job lui appartient (mono-user dans Folio). Si Folio devient multi-auteur, ajouter un champowner_emailet vérifiercurrentUserEmail().contentest tronqué à 8 000 caractères dansAiService— la validation existe déjà.Fichiers à créer / modifier
database/migration_017_ai_jobs.sqlai_jobsscripts/ai_worker.phppublic/index.phpai_enqueue+ai_poll, retirer ou garderai_querypublic/assets/js/ai-editor.jsCritères d'acceptation
job_iden < 100 ms (aucun appel IA synchrone)/ai_polltoutes les 2 sdoneerrorrequireAuth()sur les deux routes