The WordPress 7.1 Beta 3 animated GIF fix addresses long processing hangs, but an offload stack adds temporary disk, object transfer, metadata replacement, and cleanup. A gateway timeout can trigger a retry while the first worker is still copying derivatives, creating duplicate attachments or incomplete object families.
Use this for sites with S3-compatible media offload, NFS, CDN origin pull, asynchronous optimization, or containers with small ephemeral disks. Test through the same proxy and worker limits as production.
Quick answer
Hash a long animated GIF and upload it once with a correlation ID. Measure decode time separately from each object write, then interrupt before and after metadata commit. Verify one attachment, complete objects, correct animation, no temporary files, and safe retry behavior.
What to check first
- Record GIF dimensions, frames, duration and hash plus PHP limits, image library, temporary directory capacity, offload mode, bucket region, multipart settings, and proxy timeout.
- Capture upload request timing, PHP peak memory, temporary files, each generated derivative, object key, checksum, transfer time, attachment ID, and metadata update.
- Terminate the request during image processing, during object transfer, and after objects exist but before local cleanup.
- Retry the same browser action while the first worker is delayed and inspect attachment rows, object versions, orphan records, and background queues.
- Fetch the original and intended animated rendition through origin and CDN, then compare MIME type, size, checksum, frame behavior, and cache headers.
Diagnostic table
Use this table to keep the work practical. It connects the symptom to evidence and a verification step.
| Action | Evidence to collect | How to verify |
| Profile the fixture and infrastructure | Record GIF dimensions, frames, duration and hash plus PHP limits, image library, temporary directory capacity, offload mode, bucket region, multipart settings, and proxy timeout. | Processing and object-transfer timings are separately recorded. |
| Trace processing and transfer separately | Capture upload request timing, PHP peak memory, temporary files, each generated derivative, object key, checksum, transfer time, attachment ID, and metadata update. | Expected object checksums match attachment metadata. |
| Inject failures at commit boundaries | Terminate the request during image processing, during object transfer, and after objects exist but before local cleanup. | Interrupted and retried uploads leave no duplicate rows or orphan objects. |
| Reconcile attachments, objects, and temp files | Retry the same browser action while the first worker is delayed and inspect attachment rows, object versions, orphan records, and background queues. | Origin and CDN return the intended animated rendition. |
Why this usually happens
- Decoded animation cost can exceed what compressed file size suggests.
- An HTTP timeout does not always stop the PHP worker or storage transfer.
- Offload plugins differ on whether metadata or object creation is committed first.
- A retry can race with delayed cleanup from the first request.
Useful command or data shape
Adapt paths, IDs, and privacy handling to the site before running commands or storing data on production.
upload_id: gif-20260725-07
fixture_sha256: recorded
frames: 720
php_seconds: 12.6
object_write_seconds: 4.7
attachment_ids: [9421]
expected_objects: 5
objects_found: 5
orphan_temp_files: 0
retry_duplicate_count: 0
cdn_animation: pass
Safe fix order
Do the work in a sequence that makes each result easy to prove. Stop if a step produces new evidence that changes the incident scope.
- Profile the fixture and infrastructure
- Trace processing and transfer separately
- Inject failures at commit boundaries
- Reconcile attachments, objects, and temp files
- Retest retry and CDN behavior
Decision rule
Pass when one completed user action creates one attachment family, every expected object is durable and readable, retries do not duplicate work, cleanup is complete, and the intended CDN rendition still animates.
What to tell the client or owner
Give the owner the affected versions, exact workflow, observed result, business impact, evidence location, temporary control, named owner, and next review time. Remove credentials and personal data from shared screenshots and logs.
Production verification checklist
- Processing and object-transfer timings are separately recorded.
- Expected object checksums match attachment metadata.
- Interrupted and retried uploads leave no duplicate rows or orphan objects.
- Origin and CDN return the intended animated rendition.
Mistakes to avoid
- Do not change several plugins, cache rules, or infrastructure settings before preserving a baseline.
- Do not treat one successful test as proof for retries, alternate clients, or delayed background work.
- Do not paste secrets, personal data, or complete production payloads into tickets or screenshots.
- Do not close the test until the final user-visible state and server-side evidence agree.
Questions teams ask during testing
Should offload happen inside the upload request?
That depends on the plugin, but the commit order and retry behavior must be documented. Asynchronous transfer still needs an observable pending state.
Can increasing the timeout solve this?
It may hide one symptom. Measure decode, transfer, and cleanup first so the limit change addresses a bounded operation rather than a race.
When HandL WP should help
Bring in HandL WP when this affects a production site, paid lead flow, checkout, email delivery, or a managed fleet. We can preserve evidence, isolate the failing layer, make the smallest corrective change, and verify the result across WordPress, the external service, logs, and the user journey.
If this is active on a production site, diagnose a WordPress media offload timeout.
Related HandL WP guides
Use these related guides when the same issue touches tracking, security, checkout, or crawler visibility.
Helpful references