Documentatie · Technische documentatie
Afbeeldingen-importer en wachtrij
Dit document beschrijft hoe de ADP Car Market Hub-plugin voertuigafbeeldingen downloadt, ontdubbelt en koppelt, en hoe de asynchrone afbeeldingenwachtrij langdurige afbeeldingstaken buiten het synchrone importtraject houdt.
Wanneer u dit document moet gebruiken
Lees dit document als u het volgende wilt doen:
- Begrijpen welke afbeeldingen in de WordPress Media Library terechtkomen en welke worden hergebruikt of overgeslagen.
- Ontbrekende, verouderde of dubbele voertuigafbeeldingen diagnosticeren.
- WebP-conversie of opslagcapaciteit plannen voor een grote catalogus.
- De verwerking van afbeeldingen in cron-modus afstemmen op trage of beperkte hosting.
Zie Import Engine voor de omliggende importstroom. Zie Cron Events And Scheduler voor de planning aan de cron-zijde.
Overzicht
Twee klassen delen de verantwoordelijkheid voor de verwerking van afbeeldingen:
AS24CI\Image_Importer— downloadt een lijst met afbeeldings-URL's, converteert deze optioneel naar WebP, koppelt ze aan een voertuigbericht viamedia_handle_sideload()en registreert de bron-URL in de attachment-postmeta voor ontdubbeling.AS24CI\Scheduler— is eigenaar van de asynchrone afbeeldingenwachtrij. De worker-hookas24ci_image_queue_processverwerkt openstaande items in batches met een eigen tijdelijke vergrendeling (transient lock) en tijdsbudget.
De importer (Import Engine) beslist of afbeeldingen synchroon worden geïmporteerd of dat het merendeel ervan naar de wachtrij wordt uitgesteld, op basis van de cron-modus van de huidige run.
Bron van waarheid voor afbeeldingen
Voor elk geïmporteerd bijlagebestand is de canonieke markering "waar komt dit vandaan?" de _as24ci_source_url-postmeta op het bijlage-bericht (attachment post). De plugin gebruikt deze markering om:
- Downloads te ontdubbelen — als er al een bijlage met dezelfde bron-URL bestaat, hergebruikt de plugin deze in plaats van deze opnieuw te downloaden.
- De
_as24ci_image_ids-lijst van het voertuig op gezaghebbende wijze opnieuw op te bouwen nadat de wachtrij-worker klaar is, door onderliggende bijlagen met deze metasleutel op te vragen.
Twee postmeta-sleutels op het voertuig-bericht volgen geïmporteerde afbeeldingen:
_as24ci_image_ids— array van WordPress-bijlage-ID's die behoren tot de galerij van de importer._as24ci_images_hash— MD5-hash van de bronafbeeldingenlijst. Kan de sentinel'pending_queue'bevatten zolang er nog items in de wachtrij staan. De volgende import behandelt'pending_queue'als een mismatch, zodat de afbeeldingenlijst altijd opnieuw wordt geëvalueerd totdat deze volledig is geïmporteerd.
Handmatig toegevoegde galerijbijlagen worden apart bijgehouden in _as24ci_manual_image_ids en worden nooit door de plugin verwijderd.
Synchrone afbeeldingenimport
Image_Importer::import_images( int $post_id, array $images, string
$listing_id ) voert het synchrone werk uit:
- Laadt op luie wijze (lazy load) de WordPress-mediabeheerbestanden (
wp-admin/includes/media.php,file.php,image.php). - Past defensief de
as24ci_max_images-limiet opnieuw toe. - Haalt de bekende bron-URL's van het bericht eenmalig vooraf op via
prefetch_known_urls_for_post()om N afzonderlijke databasequery's per afbeelding te voorkomen. - Voor elke afbeelding (tekenreeks-URL of array met de sleutels
url/src/href/original/imageUrl): - Hergebruikt een bestaande bijlage als de bron-URL al bekend is (eerst in-memory map, daarna een_as24ci_source_url-postmeta-zoekopdracht). - Roept andersdownload_url( $url, 30 )aan (time-out van 30 seconden), converteert optioneel naar WebP en roeptmedia_handle_sideload()aan om de bijlage te maken. - Schrijft_as24ci_source_urlop de nieuwe bijlage en voegt deze toe aan de in-memory ontdubbelingsmap. - Logt fouten (downloadfouten, sideloadfouten) en gaat door naar de volgende afbeelding. - Voegt de nieuwe bijlage-ID's samen in
_as24ci_image_ids(waarbij eerder geïmporteerde items behouden blijven) en stelt de uitgelichte afbeelding (post thumbnail) in op de eerste bijlage als het bericht er nog geen heeft.
Bestaande ID's worden samengevoegd in plaats van overschreven, zodat aanroepen van de wachtrij-worker bijlagen voor hetzelfde bericht over meerdere runs verzamelen.
WebP-conversie
Wanneer as24ci_convert_to_webp op 1 staat, probeert de importer elke gedownloade afbeelding naar WebP te converteren voordat deze via sideloading wordt toegevoegd:
- De kwaliteit wordt gelezen uit
as24ci_webp_quality(standaard80indien niet ingesteld) en begrensd tot het bereik1–100. Het filteras24ci_webp_qualitykan de waarde overschrijven. - GD's
imagewebp()wordt eerst geprobeerd; Imagick wordt gebruikt als fallback. - Als geen van beide extensies beschikbaar is, wordt de conversie overgeslagen en wordt de originele afbeelding via sideloading toegevoegd. Er wordt een logregel gegenereerd.
- Als de conversie een leeg bestand oplevert of mislukt, wordt het tijdelijke bestand opgeschoond en wordt de originele afbeelding gebruikt.
Het geconverteerde bestand erft de originele bestandsnaam waarbij de extensie is vervangen door .webp.
Import in cron-modus (wachtrij)
Wanneer de planner een import uitvoert (cron of REST), stelt deze Importer::set_cron_image_queue( true ) in als as24ci_cron_image_queue op 1 staat (de standaardinstelling). Voor elk voertuig met meer dan één afbeelding doet de importer het volgende:
- Downloadt alleen de eerste afbeelding onmiddellijk via het synchrone pad, zodat het voertuig een uitgelichte afbeelding heeft.
- Controleert vooraf of elke resterende afbeelding al is gekoppeld (via de ontdubbelingsmap). Zo ja, dan wordt er geen wachtrij-item gemaakt en wordt de definitieve
_as24ci_images_hashonmiddellijk weggeschreven. - Roept anders
enqueue_remaining_images()aan om items in de vorm{ post_id, listing_id, url, images_hash }toe te voegen aan de optieas24ci_image_queue. De_as24ci_images_hashvan het voertuig wordt ingesteld op de sentinel'pending_queue', zodat toekomstige imports blijven herwaarderen totdat de wachtrij is voltooid.
De wachtrij is hard begrensd op Scheduler::IMAGE_QUEUE_SIZE_LIMIT items. Nieuwe items worden genegeerd wanneer de limiet is bereikt en er wordt een logregel gegenereerd.
Wachtrij-worker
AS24CI\Scheduler::run_image_queue() is gekoppeld aan de cron-hook as24ci_image_queue_process en voert de daadwerkelijke uitgestelde downloads uit:
- Roept
set_time_limit(300)aan (onderhevig aan hostbeperkingen). - Verkrijgt de tijdelijke vergrendeling
as24ci_image_queue_running(transient lock) met de TTLScheduler::IMAGE_QUEUE_LOCK_TTL. Een verouderde vergrendeling (ouder dan de TTL) wordt automatisch gewist. - Laadt de wachtrij uit de optie
as24ci_image_queue. - Verwerkt items in batches van
Scheduler::IMAGE_QUEUE_BATCH_SIZEzolang de wachtrij niet leeg is en het tijdsbudget (IMAGE_QUEUE_LOCK_TTL − 60s) niet is uitgeput. - Roept voor elk item
Image_Importer::import_images()aan voor de afzonderlijke URL. Fouten worden opgevangen en gelogd; het item wordt verwijderd om een oneindige foutlus (poison-pill loop) te voorkomen. - Slaat de resterende wachtrij op en schrijft statistieken per run naar
as24ci_image_queue_last_run({ processed, failed, remaining, timestamp }). - Bouwt voor elk bericht dat tijdens deze run volledig uit de wachtrij is verwerkt,
_as24ci_image_idsgezaghebbend opnieuw op uit de werkelijke onderliggende bijlagen die zijn getagd met_as24ci_source_urlen slaat de definitieve_as24ci_images_hashop. Dit garandeert dat de meta compleet en consistent is, zelfs als individuele wachtrij-items zijn mislukt. - Plant de volgende run via
maybe_schedule_image_queue_worker()als er nog items over zijn.
De images_hash-waarde van de worker wordt vóór gebruik gevalideerd als een 32-tekens lange lowercase MD5-tekenreeks. Beschadigde items worden als afwezig behandeld, zodat de hash van het bericht niet wordt afgerond op basis van onjuiste gegevens.
Configuratiereferentie
| Optie / constante | Effect | Standaard |
|---|---|---|
as24ci_import_images | Hoofdschakelaar voor het importeren van afbeeldingen. | (schakelaar in beheer) |
as24ci_max_images | Limiet aan de plugin-zijde per voertuig. Afgedwongen door zowel de importer als de afbeeldingen-importer. | 30 |
as24ci_convert_to_webp | Geconverteerde gedownloade afbeeldingen naar WebP converteren indien mogelijk. | 0 |
as24ci_webp_quality | WebP-kwaliteit (1–100). Filter: as24ci_webp_quality. | 80 |
as24ci_cron_image_queue | Gebruik de afbeeldingenwachtrij tijdens cron-/REST-imports. | 1 |
as24ci_image_queue (optie) | Persistente openstaande payload van de afbeeldingenwachtrij. | (lege array) |
as24ci_image_queue_last_run (optie) | Statistieken van de laatste run van de wachtrij-worker. | (leeg) |
as24ci_image_queue_running (transient) | Run-vergrendeling voor de wachtrij-worker. | n.v.t. |
Scheduler::IMAGE_QUEUE_HOOK | Cron-hook voor de wachtrij-worker (as24ci_image_queue_process). | n.v.t. |
Scheduler::IMAGE_QUEUE_LOCK_TTL | TTL voor worker-vergrendeling (wist automatisch een verouderde vergrendeling). | (constante in code) |
Scheduler::IMAGE_QUEUE_BATCH_SIZE | Items verwerkt per interne batch. | (constante in code) |
Scheduler::IMAGE_QUEUE_SIZE_LIMIT | Harde limiet voor de wachtrijgrootte. | (constante in code) |
De exacte waarden van IMAGE_QUEUE_LOCK_TTL, IMAGE_QUEUE_BATCH_SIZE en IMAGE_QUEUE_SIZE_LIMIT zijn gedefinieerd als constanten op AS24CI\Scheduler en kunnen tussen plugin-versies veranderen. Controleer ze in de huidige broncode als u een specifieke belasting wilt plannen.
Operationele opmerkingen
- WP-Cron is de standaard trigger. Overweeg op websites met weinig verkeer een server-side cron / systeem-cron die verwijst naar
wp-cron.php(metDISABLE_WP_CRONingesteld optrue), zodat de wachtrij voorspelbaar leegloopt. - Downloads van afbeeldingen worden uitgevoerd via
download_url(), dat gebruikmaakt van de HTTP-API van WordPress. Hosts die uitgaand HTTP-verkeer blokkeren, moeten de AutoScout24-afbeeldingshosts op de whitelist zetten. - Ontdubbeling van afbeeldingen is gebaseerd op de exacte bron-URL. URL's die alleen verschillen in de query-string of handtekeningparameters worden behandeld als afzonderlijke bronnen en apart gedownload.
- Handmatige galerijbijlagen die worden bijgehouden in
_as24ci_manual_image_idsworden nooit overschreven of verwijderd door de importer of de wachtrij-worker. - De wachtrij-worker bouwt
_as24ci_image_idsaan het einde van elk volledig verwerkt bericht opnieuw op uit de werkelijke onderliggende bijlagen; als u de meta rechtstreeks tussen worker-runs manipuleert, kunnen uw wijzigingen ongedaan worden gemaakt.
Problemen oplossen
- Voertuigen verschijnen zonder afbeeldingen. Controleer of
as24ci_import_imagesis ingeschakeld. Controleer ofas24ci_max_imagesniet op nul staat waar dat de bedoeling is. In cron-modus wordt de primaire afbeelding synchroon geïmporteerd; als er helemaal geen afbeeldingen verschijnen, controleer dan het plugin-logboek op downloadfouten. - Alleen de eerste afbeelding is aanwezig na een cron-import. Dit is verwacht tijdens imports in cron-modus totdat de
as24ci_image_queue_process-worker klaar is. Controleeras24ci_image_queue_last_runvoor de voortgang en de wachtrijgrootte. - De wachtrij groeit maar loopt nooit leeg. Controleer of WP-Cron actief is (of dat een server-cron
wp-cron.phptriggert). Controleer op een vastgelopenas24ci_image_queue_running-transient die ouder is dan de TTL van de worker. De worker wist automatisch verouderde vergrendelingen bij de volgende run. - WebP-conversie vindt niet plaats. Zorg ervoor dat
as24ci_convert_to_webpop1staat en dat ofwel GD met WebP-ondersteuning (imagewebp) of Imagick is geïnstalleerd. De plugin logt de reden wanneer conversie wordt overgeslagen. - Er verschijnen dubbel uitziende afbeeldingen in de galerij. De ontdubbelingssleutel is de exacte bron-URL. CDN's die unieke queryparameters per verzoek toevoegen, omzeilen de ontdubbeling. Controleer de URL's in de API-payload via gedetailleerde logboekregistratie (verbose logging).
- Afbeeldingen zijn verdwenen na het verwijderen van een voertuig. De
Vehicle_Deleterverwijdert bijlagen die worden bijgehouden in_as24ci_image_ids. Handmatige galerijbijlagen (_as24ci_manual_image_ids) blijven behouden. Controleer in welke lijst de betreffende bijlage-ID stond.