PHP Session Performance & Locking
Also Known As
session performance PHP
session locking
session file lock
TL;DR
PHP's file-based sessions acquire an exclusive lock per request — blocking concurrent requests from the same user until the lock is released.
Explanation
By default PHP stores sessions as files and acquires an exclusive flock() lock when session_start() is called. This serialises all concurrent requests from the same user — an AJAX-heavy page making 5 simultaneous requests will queue them, each waiting for the previous to call session_write_close(). Fixes: call session_write_close() as early as possible once session data is no longer needed; use session_start(['read_and_close' => true]) for read-only requests; switch to a Redis or Memcached session handler (configurable via session.save_handler) which supports more granular locking or lock-free read operations. Redis sessions also enable horizontal scaling across multiple PHP-FPM servers without sticky sessions.
Common Misconception
✗ PHP sessions have no impact on concurrent request performance. PHP's default file-based sessions use exclusive file locking — concurrent requests from the same user are serialised, not parallelised. Call session_write_close() as early as possible or switch to a non-locking session handler.
Why It Matters
PHP file-based sessions create a lock per session — concurrent requests from the same user block each other waiting for the lock to release, serialising what should be parallel AJAX calls.
Common Mistakes
- Using file-based sessions for applications with concurrent AJAX requests — each request waits for the session lock.
- Not calling session_write_close() early when session data is no longer needed in a long request.
- Storing large objects in sessions — every request deserialises the entire session payload.
- Not using Redis or Memcached sessions for multi-server deployments — file sessions are per-server.
Code Examples
✗ Vulnerable
session_start(); // lock held for entire request
$data = $_SESSION['user'];
expensiveOperation(); // session locked while this runs
✓ Fixed
session_start();
$data = $_SESSION['user'];
session_write_close(); // release lock immediately
expensiveOperation();
Tags
🤝 Adopt this term
£79/year · your link shown here
Added
15 Mar 2026
Edited
22 Mar 2026
Views
20
🤖 AI Guestbook educational data only
|
|
Last 30 days
Agents 1
No pings yesterday
Amazonbot 7
Perplexity 5
Google 2
Unknown AI 2
Ahrefs 1
Also referenced
How they use it
crawler 15
crawler_json 1
pre-tracking 1
Related categories
⚡
DEV INTEL
Tools & Severity
🟠 High
⚙ Fix effort: Low
⚡ Quick Fix
Switch session storage from files to Redis — file-based sessions require filesystem locks that block concurrent requests from the same user; Redis sessions are atomic and don't block
📦 Applies To
PHP 5.0+
web
🔗 Prerequisites
🔍 Detection Hints
File-based sessions with concurrent AJAX requests causing serialised execution; session_start() blocking; session files in /tmp on high-traffic server
Auto-detectable:
✗ No
blackfire
strace
⚠ Related Problems
🤖 AI Agent
Confidence: Medium
False Positives: Medium
✓ Auto-fixable
Fix: Low
Context: File