Configuration / Integration Settings

Outbound TCP

Drupal reaches TCP through Drupal\drupflare\Network\CfwTcp, which declares a whole exchange and reads the answer on a later invocation. src/ops/tcp.ts runs it between PHP invocations, over edgeport. It shares the deferred HTTP tier's queue, cache and retry budget.

var default what it does
REDIS_URL none redis://user:pass@host:6379/0, or rediss:// for TLS
SYSLOG_URL none syslog://collector:514, or syslogs:// for RFC 5425
SYSLOG_APP_NAME drupal APP-NAME on every record this site ships

Both carry credentials, so both are secrets and neither is a vars entry, and neither can be set from KV. A KV writer who could set REDIS_URL would receive whatever the site writes to it.

The endpoint belongs to the deployment, and never to the caller. Module code names a protocol and an operation; the host supplies the host, port and credentials. Arbitrary host:port TCP behind any code that can call a host function would be a port scanner and a protocol-smuggling surface. Administrative Redis commands (FLUSHALL, CONFIG, EVAL, SCRIPT, SHUTDOWN and the rest of the list in src/ops/tcp.ts) are refused before anything is dialled.

A Redis cache backend cannot be built on this tier, and it is served by a second one. A cache get has to answer inside the request that asked, and a deferred exchange always misses the first time. What this tier reaches is the deferrable half: a publish, a counter, a write nobody blocks on, or a read a later request can use.

syslog is the shape this tier serves without compromise, because syslog over TCP never replies.

The Parked Tier

drupal/redis works unmodified, over a second mechanism. A trapped socket call freezes PHP where it stands, the Worker performs the exchange, and the call returns with the answer inside the same request. Predis speaks RESP over stream_socket_client, and that is the shape the park suspends under.

It arms only when REDIS_URL is set, and it dials that endpoint and no other: the host and port the module asks for are checked for shape and then discarded, so a module that can build a string cannot choose a destination. A request naming a port other than the configured one is refused. Any stream the Worker did not open is handed back to PHP untouched, so arming does not disturb file writes in a render.

The Durable Object's own SQLite is still the faster cache backend and the recommended one. A parked get is a network round trip; a SQLite read is local. Measured from a Durable Object, a round trip is 1 ms to a same-region server and 53 ms to a distant one, and every cache operation pays one. Redis is here for a deployment that already has a server and wants Drupal pointed at it, not because it is quicker. The status report says so on any site that enables the module.

A blocking outbound call over HTTP is served by replacing the transport rather than trapping it. PHP reaches HTTPS through a stream wrapper the runtime invokes from inside a C frame, and a park under one cannot resume, so Guzzle and Symfony's HTTP client are given a handler that yields from userland instead. drupal/openid_connect completes a login through its own client that way. A call made from inside an internal function such as array_map cannot park; it falls back to the deferred transport rather than failing.

var default what it does
PARK on whether the park may arm at all; anything but 1 routes renders around it
SLEEP_BUDGET_MS 2,000 total ms PHP may wait through the park per request; an alarm gets 15x

sleep(), usleep() and a Guzzle delay park for real, up to the budget. Past it, a sleep returns at once and records how much it was short, so a retry loop never holds a visitor longer than a slow render.