Queues
Also Known As
FIFO
SplQueue
dequeue
circular queue
TL;DR
A FIFO (First In, First Out) data structure — the first element enqueued is the first dequeued. Used for BFS traversal, job queues, rate limiting, and buffer management.
Explanation
A queue supports enqueue (add to rear) and dequeue (remove from front), both O(1) with a doubly linked list. PHP's SplQueue implements this. Circular queues reuse space efficiently in fixed-size buffers. Priority queues extend queues by serving the highest-priority element first (SplMinHeap/SplMaxHeap). The distinction matters practically: array_shift() on a large PHP array is O(n) because it reindexes — use SplQueue for O(1) FIFO operations.
Diagram
flowchart LR
subgraph Queue_FIFO
ENQUEUE[enqueue - add to rear] --> REAR[REAR - newest]
REAR --> E3Q[Element C]
E3Q --> E2Q[Element B]
E2Q --> FRONT[FRONT - oldest]
FRONT --> DEQUEUE[dequeue - remove from front]
end
subgraph Applications
BFS3[BFS traversal]
JOBS[Job queue workers]
PRINT[Print spooler]
BUFFER[IO buffering]
end
subgraph PHP
SPLQ[SplQueue O of 1 both ops]
ARRAY_BAD[array_shift is O of n<br/>avoid for large queues]
end
style FRONT fill:#238636,color:#fff
style SPLQ fill:#238636,color:#fff
style ARRAY_BAD fill:#f85149,color:#fff
Common Misconception
✗ A PHP array with array_push/array_shift is an efficient queue — array_shift() reindexes every element, making it O(n); SplQueue or a linked list gives O(1) dequeue.
Why It Matters
Job queues (Redis, SQS, RabbitMQ) are real-world queues — understanding FIFO ordering explains why jobs process in submission order and why priority queues require special handling.
Common Mistakes
- array_shift() for dequeue in a loop — O(n²) total for n dequeues; use SplQueue.
- Treating a priority queue like a FIFO queue — priority queues are not ordered by insertion time.
- Not handling the empty queue case — dequeue on an empty queue throws RuntimeException.
- Using a stack (LIFO) when FIFO order is required — results processed in reverse order.
Code Examples
✗ Vulnerable
// O(n²) — array_shift reindexes entire array each call:
$queue = [];
for ($i = 0; $i < 10000; $i++) $queue[] = $i;
while ($queue) {
$item = array_shift($queue); // O(n) per call — 10000 calls = O(n²)
process($item);
}
✓ Fixed
// SplQueue — O(1) per operation:
$queue = new SplQueue();
for ($i = 0; $i < 10000; $i++) $queue->enqueue($i);
while (!$queue->isEmpty()) {
$item = $queue->dequeue(); // O(1)
process($item);
}
Tags
🤝 Adopt this term
£79/year · your link shown here
Added
16 Mar 2026
Edited
22 Mar 2026
Views
20
🤖 AI Guestbook educational data only
|
|
Last 30 days
Agents 0
No pings yet today
No pings yesterday
Amazonbot 6
Perplexity 6
Google 1
Ahrefs 1
Also referenced
How they use it
crawler 14
Related categories
⚡
DEV INTEL
Tools & Severity
🟢 Low
⚙ Fix effort: Low
⚡ Quick Fix
Use SplQueue for in-memory queues (O(1) enqueue/dequeue) instead of array_shift() which is O(n) — for distributed queues use Redis lists or SQS
📦 Applies To
PHP 5.3+
web
cli
queue-worker
🔗 Prerequisites
🔍 Detection Hints
array_shift() as dequeue on large arrays O(n); breadth-first search using array with shift instead of SplQueue
Auto-detectable:
✗ No
blackfire
⚠ Related Problems
🤖 AI Agent
Confidence: Low
False Positives: High
✗ Manual fix
Fix: Low
Context: Function