DEV Community

Cover image for FetchPHP 2.0: An Update To Bring Javascript's Fetch & True Async To PHP (Now With Superpowers!)
Jerome Thayananthajothy
Jerome Thayananthajothy

Posted on

FetchPHP 2.0: An Update To Bring Javascript's Fetch & True Async To PHP (Now With Superpowers!)

Hey there, PHP enthusiasts! πŸ‘‹ Remember that time you were coding late at night, wrestling with HTTP requests in PHP, and thought, "If only this was as easy as JavaScript's fetch"? Well, grab your coffee and get ready for some exciting news, because FetchPHP 2.0 is here, and it's about to make your PHP HTTP requests smoother than a well-oiled machine!

The Origin Story: From Fetch to Superpowered Fetch

Picture this: It's 2023, and I'm sitting in my favorite coffee shop, sipping on an extra-large latte... Nah, just kidding. I was actually at home, knee-deep in an Elden Ring session, when suddenly, inspiration struck. "What if," I thought, "we could bring the simplicity of JavaScript's fetch to the PHP world?" And just like that, FetchPHP was born. (Don't worry, I finished that boss fight first.)

But here's the thing about inspiration – it doesn't stop at version 1.0. As I watched developers embrace FetchPHP, I realized we could push the envelope even further. So, I locked myself in my coding cave (okay, it was just my home office, but it felt like a cave after a while), fueled by an unhealthy amount of energy drinks, and emerged with FetchPHP 2.0.

What's New in FetchPHP 2.0?

Buckle up, because this update is packed with more features than a Swiss Army knife! Here's what's cooking in version 2.0:

  1. True Asynchronous Superpowers: Remember when async in PHP felt like trying to run a marathon in flip-flops? Those days are gone! FetchPHP 2.0 leverages PHP Fibers (thanks to our sibling package, Matrix) to deliver true non-blocking concurrency. It's like giving your code a pair of rocket boots! Matrix, a package I built myself, simplifies async task management by utilizing PHP Fibers. With Matrix, FetchPHP can run asynchronous tasks like never before.

  2. JavaScript Developers, Feel Right at Home: We've introduced an async()/await-like syntax that'll make JavaScript developers feel like they never left home. It's so familiar, you might forget you're writing PHP!

  3. Fluent API for the Win: Building requests is now smoother than your favorite barista's latte art. Chain methods together with our new fluent API, inspired by Laravel's HTTP client. It's so elegant, it practically writes itself!

  4. Error Handling on Steroids: With our new customizable ErrorHandler, managing errors is no longer a nightmare. Pause, resume, retry, or cancel tasks on the fly. It's like having a time machine for your HTTP requests!

  5. Guzzle Who?: While we still tip our hats to Guzzle (it's powering our synchronous requests under the hood), FetchPHP 2.0 takes things to a whole new level. It's like we took Guzzle to the gym, fed it some spinach, and taught it new tricks!

But Wait, There's More

Remember how in version 1.0, we were all excited about making simple requests? Well, hold onto your keyboards, because FetchPHP 2.0 is ready to handle complex scenarios like a pro. Let's look at a few examples that'll make you want to rewrite all your HTTP logic (don't worry, we won't judge if you do):

// Async request with all the bells and whistles
async(fn () => fetch()
    ->baseUri('https://api.coolstartup.com')
    ->withHeaders(['X-API-Key' => 'supersecret'])
    ->withBody(json_encode(['feature' => 'awesome']))
    ->withProxy('tcp://localhost:8080')
    ->timeout(5)
    ->retry(3, 1000)
    ->post('/unicorns'))
    ->then(fn ($response) => processUnicornData($response->json()))
    ->catch(fn ($e) => logUnicornError($e));
Enter fullscreen mode Exit fullscreen mode

Look at that beauty! It's handling proxies, retries, timeouts, and more, all while staying asynchronous and looking gorgeous.

FetchPHP vs Guzzle: The Showdown You've Been Waiting For

Now, I know what you're thinking. "But I've been using Guzzle for years! Why should I switch?" Well, buckle up, because we're about to dive into why FetchPHP 2.0 is the new heavyweight champion of PHP HTTP clients.

1. True Asynchronous Powers

  • Guzzle: Uses Promises for async operations. It's like sending a carrier pigeon and hoping it comes back.
  • FetchPHP: Leverages PHP Fibers for true non-blocking concurrency. It's like having a team of supersonic jets at your disposal, thanks to the power of my Matrix package!

2. Syntax That Feels Like Home

  • Guzzle: Traditional PHP syntax. It's familiar, but can get verbose.
  • FetchPHP: JavaScript-like async/await syntax. It's so intuitive, you'll think you're writing frontend code (but with all the power of PHP).

3. Fluent API

  • Guzzle: Offers a decent API, but can feel a bit rigid for complex operations.
  • FetchPHP: Chainable methods that make even the most complex requests read like a beautiful poem.

4. Error Handling and Task Management

  • Guzzle: Basic Promise-based error handling.
  • FetchPHP: Advanced error handling with customizable ErrorHandler. Pause, resume, retry, or cancel tasks on the fly. It's like having a magic wand for your HTTP requests.

5. Learning Curve

  • Guzzle: Steeper learning curve, especially for complex async operations.
  • FetchPHP: If you know JavaScript's fetch, you're already halfway there. If you don't, you'll pick it up faster than you can say "asynchronous."

6. Performance

  • Guzzle: Good performance for synchronous requests, decent for async.
  • FetchPHP: Optimized for both synchronous and asynchronous requests. It's like upgrading from a bicycle to a rocket ship.

Here's a quick comparison to drive the point home:

// Guzzle
$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$promise->then(
    function ($response) {
        echo 'I completed! ' . $response->getBody();
    },
    function ($exception) {
        echo 'I failed! ' . $exception->getMessage();
    }
);

// FetchPHP

// using async/await syntax
async(fn () => fetch('http://httpbin.org/get'))
    ->then(fn ($response) => echo 'I completed! ' . $response->body())
    ->catch(fn ($e) => echo 'I failed! ' . $e->getMessage());

// or directly using the ClientHandler class
use Fetch\Http\ClientHandler;

(new ClientHandler())
    ->async()
    ->get('http://httpbin.org/get');
Enter fullscreen mode Exit fullscreen mode

See the difference? FetchPHP brings the elegance of modern JavaScript to the PHP world, all while maintaining the power and flexibility you need for complex applications.

Why FetchPHP 2.0 Will Make You Question Everything

Imagine you're a conductor, and your HTTP requests are your orchestra. With Guzzle, you're doing a great job, but you're limited to playing one instrument at a time. FetchPHP 2.0? It turns you into a maestro, conducting a full symphony of asynchronous requests, with each one playing in perfect harmony.

Here's why FetchPHP 2.0 is the HTTP client you never knew you needed:

  1. True Async: We're not just faking it with promises. This is the real deal, powered by PHP Fibers and Matrix.
  2. Familiar Syntax: JavaScript developers will feel right at home, and PHP developers will wonder why it wasn't always this easy.
  3. Flexible Error Handling: Retry, pause, resume, or cancel requests on the fly. It's like having a remote control for your HTTP requests.
  4. Powerful, Yet Simple: Complex operations are now as easy as ordering a pizza (maybe even easier, depending on your local pizzeria).

The Future is Bright (and Asynchronous)

FetchPHP 2.0 isn't just an update; it's a revolution in how we handle HTTP requests in PHP. Whether you're building a small API or a large-scale system that needs to handle thousands of concurrent requests, FetchPHP 2.0 has got your back.

So, are you ready to join the async revolution? Head over to our GitHub repository, give us a star (we love those!), and start making your PHP applications faster, more efficient, and, dare I say, more fun to work with!

Remember, in the world of FetchPHP 2.0, the only limit is your imagination (and maybe your server's resources, but that's a problem for another day).

Happy coding, and may your requests be ever asynchronous! πŸš€βœ¨


P.S. If you run into any issues or have ideas for making FetchPHP even more awesome, don't hesitate to open an issue or submit a pull request. Let's make the PHP world a better place, one request at a time!

Top comments (0)