{
    "type": "tag",
    "title": "PHP",
    "canonical": "https://www.dealmobile.co.uk/writing/tag/php",
    "path": "/writing/tag/php",
    "url": "https://www.dealmobile.co.uk/writing/tag/php",
    "markdown": "https://www.dealmobile.co.uk/writing/tag/php.md",
    "json": "https://www.dealmobile.co.uk/writing/tag/php.json",
    "feed": "https://www.dealmobile.co.uk/writing/tag/php.rss",
    "items": [
        {
            "type": "article",
            "title": "Testing an API client without the network",
            "url": "https://www.dealmobile.co.uk/writing/testing-an-api-client-without-the-network",
            "markdown": "https://www.dealmobile.co.uk/writing/testing-an-api-client-without-the-network.md",
            "json": "https://www.dealmobile.co.uk/writing/testing-an-api-client-without-the-network.json",
            "summary": "How the Puzzler PHP SDK signs its requests and turns HTTP errors into exceptions, and how one protected method lets the tests check both with no credentials and no connection.",
            "published": "2026-10-21"
        },
        {
            "type": "article",
            "title": "Rewriting an old PHP scraper around curl_multi",
            "url": "https://www.dealmobile.co.uk/writing/rewriting-an-old-scraper-around-curl-multi",
            "markdown": "https://www.dealmobile.co.uk/writing/rewriting-an-old-scraper-around-curl-multi.md",
            "json": "https://www.dealmobile.co.uk/writing/rewriting-an-old-scraper-around-curl-multi.json",
            "summary": "How Scrape’s download loop went from one file at a time to a pool of parallel cURL transfers, and what the rewrite lost from the older code that read directory listings.",
            "published": "2026-10-21"
        },
        {
            "type": "article",
            "title": "One JSON shape for RSS, Atom and RDF feeds",
            "url": "https://www.dealmobile.co.uk/writing/one-json-shape-for-rss-atom-and-rdf",
            "markdown": "https://www.dealmobile.co.uk/writing/one-json-shape-for-rss-atom-and-rdf.md",
            "json": "https://www.dealmobile.co.uk/writing/one-json-shape-for-rss-atom-and-rdf.json",
            "summary": "How RSS to JSON turns three feed formats into one predictable array, and the namespace cases that took two attempts to get right.",
            "published": "2026-10-21"
        },
        {
            "type": "article",
            "title": "Live coverage on Apple News from PHP",
            "url": "https://www.dealmobile.co.uk/writing/live-coverage-on-apple-news-from-php",
            "markdown": "https://www.dealmobile.co.uk/writing/live-coverage-on-apple-news-from-php.md",
            "json": "https://www.dealmobile.co.uk/writing/live-coverage-on-apple-news-from-php.json",
            "summary": "How the Apple News API library builds Live Coverage articles, the rules it checks before Apple does, and the request metadata that starts and ends the coverage.",
            "published": "2026-10-21"
        },
        {
            "type": "article",
            "title": "Writing down an upload protocol and testing servers against it",
            "url": "https://www.dealmobile.co.uk/writing/testing-servers-against-an-upload-protocol",
            "markdown": "https://www.dealmobile.co.uk/writing/testing-servers-against-an-upload-protocol.md",
            "json": "https://www.dealmobile.co.uk/writing/testing-servers-against-an-upload-protocol.json",
            "summary": "How TurboPush’s chunked upload protocol is written down in PROTOCOL.md, how a small Node suite checks any server against it over HTTP, and the two bugs it found in my own PHP endpoint.",
            "published": "2026-10-20"
        },
        {
            "type": "article",
            "title": "Fetching a feed from a URL you don’t trust",
            "url": "https://www.dealmobile.co.uk/writing/fetching-feeds-from-untrusted-urls",
            "markdown": "https://www.dealmobile.co.uk/writing/fetching-feeds-from-untrusted-urls.md",
            "json": "https://www.dealmobile.co.uk/writing/fetching-feeds-from-untrusted-urls.json",
            "summary": "How RSS to JSON stops a feed URL from reaching private addresses on the server’s own network, by checking every address a host resolves to, pinning the connection to the one it checked, and checking every redirect again.",
            "published": "2026-10-20"
        },
        {
            "type": "article",
            "title": "One source of truth behind a static app",
            "url": "https://www.dealmobile.co.uk/writing/one-source-of-truth-behind-a-static-app",
            "markdown": "https://www.dealmobile.co.uk/writing/one-source-of-truth-behind-a-static-app.md",
            "json": "https://www.dealmobile.co.uk/writing/one-source-of-truth-behind-a-static-app.json",
            "summary": "How the second version of Where Should I Live keeps its data in a headless CMS, ships it as static JSON, and refuses to build if the data has drifted.",
            "published": "2026-10-19"
        },
        {
            "type": "article",
            "title": "Making large uploads resumable with TurboPush",
            "url": "https://www.dealmobile.co.uk/writing/making-large-uploads-resumable",
            "markdown": "https://www.dealmobile.co.uk/writing/making-large-uploads-resumable.md",
            "json": "https://www.dealmobile.co.uk/writing/making-large-uploads-resumable.json",
            "summary": "How TurboPush splits big files into chunks, retries the ones that fail, carries on after a page reload, and keeps the PHP side safe when chunks arrive twice or all at once.",
            "published": "2026-10-19"
        },
        {
            "type": "article",
            "title": "Publishing to Apple News from PHP",
            "url": "https://www.dealmobile.co.uk/writing/publishing-to-apple-news-from-php",
            "markdown": "https://www.dealmobile.co.uk/writing/publishing-to-apple-news-from-php.md",
            "json": "https://www.dealmobile.co.uk/writing/publishing-to-apple-news-from-php.json",
            "summary": "What it takes to publish an article to Apple News from PHP, from signing requests and building multipart uploads to the JSON details Apple’s format is strict about.",
            "published": "2026-03-21"
        }
    ]
}