Scott Keck-Warren

Scott Keck-Warren

@scott.keck-warren.com

Director of Technology at WeCare Connect, published author, podcast host, conference speaker, consultant, and producer of education content for web application developers. He's been a professional PHP developer, DevOps engineer, and team lead.

243 followers45 following520 posts

Paul Conroy calls the server side of agentic commerce "as deterministic as it gets." You check whether payment arrived and branch on it, with no LLM in your backend. #PHP #AI #API

#PHPC tip: add `#[\SensitiveParameter]` and your API keys stop showing up in stack traces. The trace shows `Object(SensitiveParameterValue)` instead of the token. PHP 8.2+. #PHP #Security #PHP82

Paul Conroy's warning: charge 15 cents per API call through Stripe and you're "underwater on every transaction." Card minimums still apply, so micro-pricing belongs on stablecoin rails. #PHP #API #Stripe

An agent hits your paid route with no credentials, so you reply with headers spelling out the price and how to pay. Then the agent decides whether you fit its budget and its allowed merchants. #API #PHP #AI

Writing my php[architect] column this month, I realized my mental model of PHP was years out of date. LAMP stack, Apache, done. The language kept moving while my mind didn't. What assumption about your stack turned out to be out of date? #PHP #CareerGrowth #SoftwareEngineering

The working group reserved HTTP 402 Payment Required in 1997, and most of us have sent one by typo-ing a 403. 29 years later, Stripe's Machine Payments Protocol gave it a job. #HTTP #PHP #WebDev

#Laravel tip: `abort_unless()` turns a three-line guard into one. abort_unless($request->user()->hasCredits(), 402, 'Out of credits'); abort_if($post->isLocked(), 423); #PHP #Laravel #CleanCode

Think of Stripe's shared payment token as a gift voucher on your credit card with a $10 cap and a two-day expiry, locked to one merchant. A data broker trying to charge $500 gets rejected. #Stripe #AI #PHP

"I paid money to find this thing doesn't exist." Paul Conroy's Laravel payment middleware charged before the controller ran the lookup, so a missing match still cost money. #Laravel #PHP #API

#Laravel tip: `withoutOverlapping()` holds its lock for 24 hours by default. If the server dies mid-run, the task skips until the lock expires. `php artisan schedule:clear-cache` clears a stuck lock now. #PHP #Laravel #PHPC

"The PHP community is meant to be very large and embracing and supportive." That's why Len Woodward anonymizes names when he covers internals debates about AI-written replies. #PHP #OpenSource

When does your AI coding tool's usage limit catch you? Mine used to land late morning, halfway through a refactor, every time. Morning, after lunch, late night, or never? #AI #ClaudeCode #PHPC

The weeks I ship the most are the weeks the work was on my calendar before Monday started. Pick one thing you keep meaning to do every week, give it a fixed slot, and stop deciding each week whether you feel like it. #CareerDev #Productivity #PHPC

I was told not to subscribe to PHP internals unless I wanted a part-time job. Len Woodward reads 12 to 36 threads a week and turns them into a ~10 minute show. #PHP #PHPInternals

#PHPC tip: PHP 8.4's `#[\Deprecated]` attribute works on your own code. Calling it emits a real deprecation notice, which a docblock `@deprecated` never did. #PHP #PHP84 #CleanCode

Tim Düsterhus reviewed Len Woodward's first scripts for This Week in PHP Internals, and Larry Garfield still flags wrong names (with a smiley face). #PHP #PHPInternals

This Week in PHP Internals began when Len Woodward gave Claude Cowork his inbox. It's great at summarizing, but he won't let it write anything unmonitored. #PHP #AI

My #ClaudeCode limit kept running out at 11 AM with a 3 PM reset, right in the middle of a refactor. The 5-hour window starts with your first message. Now a scheduled "Hi" goes out before I start work, and the reset lands at lunch. #AI #DevProductivity

Brent Roose wondered why nobody was covering PHP internals. Len Woodward had the gear, and "the only thing stopping me... is hitting the record button." #PHP #PHPInternals

#PHPC tip: PHP 8.4 added `array_find()` and `array_any()`, so the `foreach` + `break` loop can go. `array_find()` returns `null` when nothing matches. `array_all()` covers the "every item" check. #PHP #PHP84 #CleanCode

FFmpeg is miserable to work with from PHP, so Len Woodward's team built a PHP extension with FFmpeg bindings and they're teaching it at least once a week. #PHP #FFmpeg

PHP 8.6 lands November 19. How are you trying it before then without breaking the setup you work in every day? Docker, Herd, phpenv, Homebrew, a throwaway VM, or "I'll wait for the release"? I'm using Docker. Curious what everyone else does. #PHP #PHP86 #PHPC

I run every code sample before it goes in a video, a post, or a PR description. I learned this from comments pointing out the ones I didn't run. Each broken example costs a little trust, and people remember the broken one longer than the ten that worked. #CareerDev #PHP #PHPC

Non-native speakers on PHP internals translate replies with an LLM, and the LLM starts arguing for them. Len Woodward's fix: use Google Translate and attach your original message. #PHP #OpenSource #AI

#PHPC tip: on the PHP 8.6 beta, this is false: version_compare(PHP_VERSION, '8.6.0', '>='); // "8.6.0beta2" < "8.6.0" `version_compare()` ranks beta below the release. Gate on the integer instead: if (PHP_VERSION_ID >= 80600) { $page = clamp($page, 1, $totalPages); } #PHP #PHP86 #phparch

Myth: magic methods make code easier to maintain because there's less of it. It's shorter code, but your IDE, PHPStan, and the next developer can't see what exists. Make sure you declare the properties. #PHP #CleanCode #PHPC