{"componentChunkName":"component---src-templates-post-js","path":"/async-php-benchmark/","result":{"data":{"markdownRemark":{"html":"<p>A few weeks ago I published a post about <a href=\"https://accesto.com/blog/long-running-php-websocket-server/\">our ReactPHP WebSocket server that's been running in production since 2019</a>. While writing it, I realized something: the async PHP ecosystem has matured to the point where it's genuinely easy to adopt — yet almost nobody uses it in regular application code.</p>\n<p>Most PHP developers still reach for async only when they \"have to\" — real-time features, WebSockets, heavy background processing. But there's a much more common case where it would help: any endpoint that fans out to multiple data sources. Fetch five things from the database. Call three external APIs. You're paying for sequential I/O even though the operations have nothing to do with each other.</p>\n<p>I wanted to know: <strong>which async approach is actually worth using, and for which problem?</strong> So we ran benchmarks.</p>\n<h2>The scenario</h2>\n<p>We simulated generating a sales report — a realistic case that mixes database queries and external API calls:</p>\n<ul>\n<li>4 regional DB queries — <code class=\"language-text\">SELECT COUNT(*), SUM(amount) FROM orders WHERE region = ?</code> with 200ms simulated I/O each</li>\n<li>1 summary DB query — 150ms</li>\n<li>3 exchange rate API calls — 250ms each</li>\n<li>2 partner pricing API calls — 250ms each</li>\n</ul>\n<p>Sequential total: <strong>~2.4 seconds</strong>. Fully concurrent: <strong>~260ms</strong> (bounded by the slowest single call).</p>\n<p>Latency is simulated with <code class=\"language-text\">SLEEP()</code> in MySQL and <code class=\"language-text\">usleep()</code> in a mock API server. That's intentional — it isolates I/O wait, which is exactly what async PHP is designed to address.</p>\n<h2>Part 1: HTTP-only — Guzzle is already enough</h2>\n<p>If your bottleneck is parallel HTTP calls only — no database — Guzzle's async API handles it cleanly. No extra dependencies, no event loop, no new mental model.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token variable\">$client</span>   <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Client</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token variable\">$promises</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">foreach</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$endpoints</span> <span class=\"token keyword\">as</span> <span class=\"token variable\">$key</span> <span class=\"token operator\">=></span> <span class=\"token variable\">$url</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token variable\">$promises</span><span class=\"token punctuation\">[</span><span class=\"token variable\">$key</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$client</span><span class=\"token operator\">-></span><span class=\"token function\">getAsync</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$url</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token variable\">$responses</span> <span class=\"token operator\">=</span> <span class=\"token class-name static-context\">Utils</span><span class=\"token operator\">::</span><span class=\"token function\">unwrap</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$promises</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><code class=\"language-text\">Utils::unwrap()</code> fires all requests concurrently via <code class=\"language-text\">curl_multi</code> and blocks until they all settle. For pure HTTP fan-out, this is all you need.</p>\n<p>The numbers confirm it:</p>\n<table>\n<thead>\n<tr>\n<th>Approach</th>\n<th>Time (ms)</th>\n<th>Speedup</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Sequential (Guzzle sync)</td>\n<td>1272</td>\n<td>1.0x</td>\n</tr>\n<tr>\n<td><strong>Guzzle async</strong></td>\n<td><strong>260</strong></td>\n<td><strong>4.9x</strong></td>\n</tr>\n<tr>\n<td>amphp/http-client</td>\n<td>272</td>\n<td>4.7x</td>\n</tr>\n<tr>\n<td>Swoole coroutines</td>\n<td>255</td>\n<td>5.0x</td>\n</tr>\n</tbody>\n</table>\n<p>All three async approaches land at ~260ms. Guzzle is just as fast as amphp and Swoole for HTTP-only work. If this is your use case, adding a heavier dependency would solve a problem you don't have.</p>\n<h2>Part 2: Add database queries — Guzzle can't help anymore</h2>\n<p>Now add the five database queries. Guzzle's async model only covers HTTP — PDO is synchronous, and there's no way around it with Guzzle alone.</p>\n<table>\n<thead>\n<tr>\n<th>Approach</th>\n<th>Time (ms)</th>\n<th>Speedup</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Sequential (PDO + Guzzle sync)</td>\n<td>2390</td>\n<td>1.0x</td>\n</tr>\n<tr>\n<td><strong>Guzzle async (HTTP only, DB sequential)</strong></td>\n<td><strong>1318</strong></td>\n<td><strong>1.8x</strong></td>\n</tr>\n<tr>\n<td>amphp full (DB + HTTP concurrent)</td>\n<td>283</td>\n<td>8.4x</td>\n</tr>\n<tr>\n<td>Swoole full (DB + HTTP concurrent)</td>\n<td>260</td>\n<td>9.2x</td>\n</tr>\n</tbody>\n</table>\n<p>Guzzle gets you from 2.4s to 1.3s — a real improvement, but you're still paying for five sequential database queries. amphp and Swoole both hit ~260ms by running everything concurrently: DB queries and HTTP calls in parallel, same scheduler.</p>\n<p>The 1.3s Guzzle row is the important one. It shows what \"partial async\" looks like in practice. A lot of teams would call that a win and stop there, not realizing they're still at 55% of the sequential time.</p>\n<h2>amphp: no extension required</h2>\n<p>amphp v3 is built on PHP Fibers (8.1+) and the Revolt event loop. No PECL extension, no special PHP build — <code class=\"language-text\">composer require amphp/mysql amphp/http-client</code> and you're done.</p>\n<p>The same <code class=\"language-text\">async()</code>/<code class=\"language-text\">await()</code> pattern works for both database queries and HTTP calls:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token variable\">$pool</span>       <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">MysqlConnectionPool</span><span class=\"token punctuation\">(</span><span class=\"token class-name static-context\">MysqlConfig</span><span class=\"token operator\">::</span><span class=\"token function\">fromString</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'host=mysql;user=root;password=secret;db=app'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token variable\">$httpClient</span> <span class=\"token operator\">=</span> <span class=\"token class-name static-context\">HttpClientBuilder</span><span class=\"token operator\">::</span><span class=\"token function\">buildDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token variable\">$futures</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">foreach</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$queries</span> <span class=\"token keyword\">as</span> <span class=\"token variable\">$region</span> <span class=\"token operator\">=></span> <span class=\"token variable\">$sql</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token variable\">$futures</span><span class=\"token punctuation\">[</span><span class=\"token string double-quoted-string\">\"db_<span class=\"token interpolation\"><span class=\"token variable\">$region</span></span>\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">async</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token variable\">$pool</span><span class=\"token operator\">-></span><span class=\"token function\">query</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$sql</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span><span class=\"token function\">fetchRow</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">foreach</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$endpoints</span> <span class=\"token keyword\">as</span> <span class=\"token variable\">$key</span> <span class=\"token operator\">=></span> <span class=\"token variable\">$url</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token variable\">$futures</span><span class=\"token punctuation\">[</span><span class=\"token variable\">$key</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">async</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">json_decode</span><span class=\"token punctuation\">(</span>\n        <span class=\"token variable\">$httpClient</span><span class=\"token operator\">-></span><span class=\"token function\">request</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Request</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$url</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span><span class=\"token function\">getBody</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span><span class=\"token function\">buffer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token constant boolean\">true</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token variable\">$results</span> <span class=\"token operator\">=</span> <span class=\"token function\">await</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$futures</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// all 10 operations running in parallel</span></code></pre></div>\n<p>Once you learn the concurrency model, it applies everywhere. That's the real value — not the library, but the unified mental model for any I/O.</p>\n<h2>Swoole: C-level hooks, ~8% faster</h2>\n<p>Swoole is a C++ extension that patches PHP's I/O layer at runtime. With <code class=\"language-text\">SWOOLE_HOOK_ALL</code>, standard PDO becomes non-blocking transparently — no code changes required to your queries. The coroutine model uses <code class=\"language-text\">WaitGroup</code>, which will feel familiar if you've used Go:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token function\">Co<span class=\"token punctuation\">\\</span>run</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">static</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span> <span class=\"token keyword return-type\">void</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token variable\">$wg</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name class-name-fully-qualified\">Swoole<span class=\"token punctuation\">\\</span>Coroutine<span class=\"token punctuation\">\\</span>WaitGroup</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">foreach</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$queries</span> <span class=\"token keyword\">as</span> <span class=\"token variable\">$region</span> <span class=\"token operator\">=></span> <span class=\"token variable\">$sql</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token variable\">$wg</span><span class=\"token operator\">-></span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">go</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">use</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$region</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$sql</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span><span class=\"token variable\">$results</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$wg</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span> <span class=\"token keyword return-type\">void</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token variable\">$pdo</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PDO</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'mysql:host=mysql;dbname=app'</span><span class=\"token punctuation\">,</span> <span class=\"token string single-quoted-string\">'root'</span><span class=\"token punctuation\">,</span> <span class=\"token string single-quoted-string\">'secret'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token variable\">$results</span><span class=\"token punctuation\">[</span><span class=\"token string double-quoted-string\">\"db_<span class=\"token interpolation\"><span class=\"token variable\">$region</span></span>\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$pdo</span><span class=\"token operator\">-></span><span class=\"token function\">query</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$sql</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span><span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span> <span class=\"token keyword\">finally</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token variable\">$wg</span><span class=\"token operator\">-></span><span class=\"token function\">done</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// always release, even on exception</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token variable\">$wg</span><span class=\"token operator\">-></span><span class=\"token function\">wait</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">SWOOLE_HOOK_ALL</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The 8% gap between Swoole (260ms) and amphp (283ms) comes from C-level coroutine suspension overhead vs. userland Fibers. In practice, the gap will be smaller on real queries that do actual work beyond sleeping.</p>\n<p>The trade-off is operational: Swoole is a C++ extension that needs to be compiled and deployed, which adds complexity to your Docker images and CI pipeline. For most teams, amphp's \"composer install and done\" is the right call. Swoole makes sense when you need every millisecond and have the infrastructure discipline to manage it.</p>\n<h2>When to use what</h2>\n<ul>\n<li><strong>Guzzle async</strong> — HTTP fan-out, no DB, zero new dependencies. Start here.</li>\n<li><strong>amphp</strong> — mixed DB + HTTP concurrency, no extension required. The right default for most PHP teams.</li>\n<li><strong>Swoole</strong> — when you need maximum throughput and have the ops capacity for a C extension. Also the right choice if you're already running a Swoole-based server.</li>\n<li><strong>None of the above</strong> — if your endpoint does one query and one HTTP call, the added code complexity isn't worth it. Async helps when you have multiple independent I/O operations.</li>\n</ul>\n<h2>One thing the benchmarks don't show: long-running processes</h2>\n<p>If you go beyond request-scoped async — running a persistent event loop process — you'll hit a different class of problems that have nothing to do with concurrency.</p>\n<p>Our WebSocket server has been running continuously since 2019. Over six years, the operational lessons were harder than the async code itself. One that surprised us recently: after a PHP upgrade, the process memory started growing by <strong>50MB every five minutes</strong>.</p>\n<p>The culprit was Symfony's deprecation error handler — it collects deprecation notices in memory, and after the upgrade, one of our dependencies triggered thousands of deprecation warnings per request cycle. The handler was doing its job correctly; we just hadn't noticed the cost until the upgrade changed the volume.</p>\n<p>Memory leaks in long-running PHP processes are rarely \"real\" leaks. They're usually accumulation — event listeners that aren't removed, log buffers that aren't flushed, error handlers collecting data you forgot about. The fix is to audit what your framework is holding onto, not just your own code. In this case, disabling the deprecation handler in the production process resolved it immediately, with the proper fix being to update the library causing the deprecations.</p>\n<p>The monitoring and restart setup matters as much as the code. We use watchdog timers with memory thresholds that trigger graceful restarts before things go wrong — better than finding out at 3am.</p>\n<p>Are you using any of these in production? I'm curious whether teams are reaching for amphp or Swoole — or still leaving the DB queries sequential. Let me know in the comments.</p>","timeToRead":6,"frontmatter":{"title":"Async PHP in 2026: Guzzle, amphp, or Swoole? We benchmarked all three.","tags":["php","software-development","performance"],"author":"mkurzeja","categories":["for-developers"],"dateUpdated":null,"customTopics":[["Long-Running PHP WebSocket Server","/long-running-php-websocket-server","blog"],["PHP Performance Tuning","/php-performance-tuning","blog"],["PHP OpCode Caching","/php-opcode-caching","blog"],["PHP Modernization","https://accesto.com/services/php-refactoring-services/","services"]],"customCTA":["Need help with PHP architecture?","https://accesto.com/contact/","Talk to us"],"customContactCTA":["Need help with PHP architecture?","We work on mature PHP systems — performance, modernization, and architecture. Free code review included.","Talk to us","https://accesto.com/contact/"],"customContactCTAIcon":null,"heroImage":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAACE0lEQVQoz21SSW/TQBj1Gdo4XiYLXRBNUZImTZvFSQuJGyd2U1RaHLK2hVhU4kBVqRSE2MSBsl9QJZC4ILEdKiFx4AwXjtz5P4/PdmIC4vD03rwZvZn5vo8T5SpEuQKHWR/yAHofA9/WBiRmYMSnur7k+rYnMh2cyCr/BBgus6FA7yLDQ7ZgYTJSx1RlE/KYDl6ki8jn7CCJkuVAlaC7mhmeJ3ma9gI213D8WBH3Xn7B4cdvqLVvYjpnYi5tQhCr4OzDvKDB5y9jlNccPcovwSeUySP2a462PUHS4aMzidwlWI8+4emH73h19AOP33zFqQndfaFfKiM2U8fcfBtZZQPRuOlwItlAOttBMtVEYraB/MImpqMmmESB9N313We4ev819l4c4fnnnyhou1TXEjheVJFKN6FqFpRCFxmlg9JSD0X1ssPpbBuZXBtn1R4CQQ0T8xuY3TpA1NjGwto19K4/wdbttzitXKHfFMEJ1BQpWAUL6bC1THqwlkOkqY6CrCF88jzixRYmzTvIvP+FzOo+WosFRDId5Gs30LQeUH01u8t2EMEZjb5mVWftecQsvIypGROxUhfj6S7OnbkAa+ch6rfeYf/uIZbX96jGTuDQ/Nkj9Nf6DwSaVT81LDi2glRyDYv5BkLKDlrbB4jELjpNC56o9efQgzaEyn80hdIrJOaOmMAXMcKrzjSEx1cQT7bwG+8DP78MJmaPAAAAAElFTkSuQmCC","aspectRatio":1.9867549668874172,"src":"/blog/static/d9fc1f858725eaf7399041dc2741047c/f3583/async-php-benchmark.png","srcSet":"/blog/static/d9fc1f858725eaf7399041dc2741047c/630fb/async-php-benchmark.png 300w,\n/blog/static/d9fc1f858725eaf7399041dc2741047c/2a4de/async-php-benchmark.png 600w,\n/blog/static/d9fc1f858725eaf7399041dc2741047c/f3583/async-php-benchmark.png 1200w,\n/blog/static/d9fc1f858725eaf7399041dc2741047c/bbee5/async-php-benchmark.png 1800w,\n/blog/static/d9fc1f858725eaf7399041dc2741047c/0ef64/async-php-benchmark.png 2400w,\n/blog/static/d9fc1f858725eaf7399041dc2741047c/ac1ca/async-php-benchmark.png 2912w","sizes":"(max-width: 1200px) 100vw, 1200px"}},"publicURL":"/blog/static/d9fc1f858725eaf7399041dc2741047c/async-php-benchmark.png"}},"fields":{"date":"2026-04-03"}},"authorImage":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAQF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgAB/9oADAMBAAIQAxAAAAHakshK0gjHKMUiz//EABoQAAMBAAMAAAAAAAAAAAAAAAECAwARMTL/2gAIAQEAAQUCckBGqtM/mTBq6rnnphRt/8QAFxEBAAMAAAAAAAAAAAAAAAAAEAExQf/aAAgBAwEBPwHCaP/EABYRAQEBAAAAAAAAAAAAAAAAABABMf/aAAgBAgEBPwEmn//EABwQAAEEAwEAAAAAAAAAAAAAAAEAAhAhESIxQf/aAAgBAQAGPwLXqAe4OBgryMKqj//EABsQAQADAAMBAAAAAAAAAAAAAAEAESEQMUFh/9oACAEBAAE/Ic+01vkwePhVcd5LCVcbG48BRwlDpF8lLxn/2gAMAwEAAgADAAAAEJvPAv/EABcRAQEBAQAAAAAAAAAAAAAAAAERABD/2gAIAQMBAT8QAp4msLN//8QAFxEBAQEBAAAAAAAAAAAAAAAAAREAEP/aAAgBAgEBPxBW8BGQu//EABwQAQEAAgIDAAAAAAAAAAAAAAERADEQIVFhcf/aAAgBAQABPxAjFiOnTbiUxdk5b864nqAqeTBq5t2poOECEYpvWIZpWmVm8PK+xM//2Q==","aspectRatio":1,"src":"/blog/static/e68dd4372e7cd1a7a108492da7836f1a/ea649/mkurzeja.jpg","srcSet":"/blog/static/e68dd4372e7cd1a7a108492da7836f1a/b1092/mkurzeja.jpg 11w,\n/blog/static/e68dd4372e7cd1a7a108492da7836f1a/1d7ec/mkurzeja.jpg 21w,\n/blog/static/e68dd4372e7cd1a7a108492da7836f1a/ea649/mkurzeja.jpg 42w,\n/blog/static/e68dd4372e7cd1a7a108492da7836f1a/1c2ab/mkurzeja.jpg 63w,\n/blog/static/e68dd4372e7cd1a7a108492da7836f1a/567fa/mkurzeja.jpg 84w,\n/blog/static/e68dd4372e7cd1a7a108492da7836f1a/79880/mkurzeja.jpg 412w","sizes":"(max-width: 42px) 100vw, 42px"}}}},"pageContext":{"slug":"/async-php-benchmark/","authorImagePath":"mkurzeja.jpg"}},"staticQueryHashes":["1607616503","473848531"]}