WordPress 7.1 Beta 3 includes a fix for long animated GIF uploads that could hang. A green Media Library tile does not prove the full path is healthy. The request may time out while PHP continues, image processing may stop after the original file, or a retry may create a second attachment. Testing needs fixed fixtures, resource measurements, generated-file inventory, and a duplicate check.
Use this on staging when a site accepts animated product previews, tutorials, advertising creative, or user uploads. Test through the real CDN, web server, PHP worker, storage mount, and image library because local development can hide gateway and memory limits.
Quick answer
Prepare small, medium, and long animated GIF fixtures with known dimensions, frame counts, duration, and file size. Upload each once with a unique marker while recording browser timing, web server status, PHP peak memory, image library logs, attachment ID, generated files, and animation behavior. Repeat the long case once after cleanup and once without cleanup to prove retries do not create hidden duplicates.
What to check first
- Record upload_max_filesize, post_max_size, memory_limit, max_execution_time, proxy timeout, image library, object storage, and thumbnail settings.
- Hash each GIF and note dimensions, frames, duration, file size, color profile, and whether the original animation is expected to remain intact.
- Capture the upload request status, time to first and last byte, PHP worker duration, peak memory, temporary files, and every generated derivative.
- Verify one attachment row, one original file, expected sub-sizes, correct MIME type, usable alt text, and animation on the intended rendition.
- Cancel or retry one controlled upload and inspect orphaned files, duplicate attachments, background tasks, and error logs.
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 |
| Build and hash controlled GIF fixtures | Record upload_max_filesize, post_max_size, memory_limit, max_execution_time, proxy timeout, image library, object storage, and thumbnail settings. | All fixtures have repeatable timings and resource measurements. |
| Measure the complete upload path | Hash each GIF and note dimensions, frames, duration, file size, color profile, and whether the original animation is expected to remain intact. | The long fixture creates exactly one attachment and the expected files. |
| Inventory attachment and derivative output | Capture the upload request status, time to first and last byte, PHP worker duration, peak memory, temporary files, and every generated derivative. | No PHP fatal, gateway timeout, orphaned temporary file, or stalled task remains. |
| Exercise cancel and retry behavior | Verify one attachment row, one original file, expected sub-sizes, correct MIME type, usable alt text, and animation on the intended rendition. | The original and intended displayed rendition preserve animation. |
Why this usually happens
- Animated GIF decoding cost depends on frame count and dimensions, not only compressed file size.
- A gateway can stop waiting before WordPress or the image library stops processing.
- Retries may create another attachment after the first request completed late.
- Optimization or offload plugins can add derivative and transfer work inside the request.
- A generated static thumbnail can make the upload look successful while the intended animated rendition is broken.
Useful command or data shape
Adapt paths, IDs, and privacy handling to the site before running commands or storing data on production.
test_id: WP71B3-GIF-12
fixture_sha256: recorded
size_mb: 18.4
frames: 640
duration_seconds: 42
http_status: 201
request_seconds: 16.8
php_peak_mb: 286
attachment_count: 1
derivatives_expected: 4
derivatives_found: 4
animation_check: 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.
- Build and hash controlled GIF fixtures
- Measure the complete upload path
- Inventory attachment and derivative output
- Exercise cancel and retry behavior
- Retest with extensions isolated if evidence differs
Decision rule
Pass when the request finishes within documented limits, exactly one attachment is created, expected files are complete, the intended rendition animates, and retry behavior does not leave duplicate or orphaned records. Raise limits only after proving processing cost is legitimate and bounded.
What to tell the client or owner
Give the site owner the affected version, 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
- All fixtures have repeatable timings and resource measurements.
- The long fixture creates exactly one attachment and the expected files.
- No PHP fatal, gateway timeout, orphaned temporary file, or stalled task remains.
- The original and intended displayed rendition preserve animation.
Mistakes to avoid
- Do not test with an unknown GIF downloaded from a chat thread.
- Do not raise every timeout before collecting a baseline.
- Do not assume a static thumbnail means the original animation failed.
- Do not leave large test fixtures in production storage.
Questions teams ask during testing
Why can a modest GIF use so much memory?
The image library may hold many decoded full-size frames in memory. Compressed file size does not represent decoded processing cost.
Should WordPress generate animated thumbnails?
Behavior depends on the image stack and plugins. Define which rendition must animate, then verify that exact URL and use case.
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 timeout.
Related HandL WP guides
Use these related guides when the same issue touches tracking, security, checkout, or crawler visibility.
Helpful references