Looking for more information on how to do PHP the right way? Check out PHP: The Right Way

Community News:
Latest PECL Releases (10.27.2026)
Oct 27, 2026 @ 08:05:25

Latest PECL Releases:

  • brotli 0.21.1
    - update: build-in brotli library to v1.2.1

  • gRPC 1.85.0
    - gRPC Core 1.85.0 update
  • PAM 3.0.1
    fix out of sources tree build - #21
  • PAM 3.0.0
    PHP 8.0+ modernization and composer.json file Drop support for PHP 7 Test infrastructure setup
  • swoole 6.1.11
    - Build fix for platforms without futex: Changed sw_usleep to the standard usleep to fix compilation failure on that platform. - WebSocket decoding validation: The decoder rejects CLOSE/PING/PONG control frames with RSV1 set before unmasking, preventing compressed control frames from entering the receive path. - WebSocket encoding validation: The encoder rejects fragmented control frames or control frames with payloads exceeding 125 bytes, and makes ping() return false and set SWOOLE_ERROR_WEBSOCKET_PACK_FAILED when encoding fails. - Thread stdio fd leak: After a thread exits, manually close the STDIN/STDOUT/STDERR file descriptors that were not released due to PHP_STREAM_FLAG_NO_CLOSE. - Reactor unregistered fd lookup: When looking up an unregistered fd, return null instead of inserting an empty entry into the socket map, and change the accessor to const. - SOCKS5 target host length validation: The DNS tunnel now validates that the target host length does not exceed 255 bytes, and returns an error as a handshake failure when it is too long. - Thread scheduling policy preservation: When no policy is specified in Thread::setPriority(), first read the current scheduling policy before setting the priority, fixing the issue of using the invalid -1 policy. - Buffered stream read fix: Under PHP 8.3, when the stream already has buffered data, use the non-waiting receive path so that hooked streams directly return buffered data without waiting for new events. - Atomic wait on systems without futex: Implement an atomic wait registry based on a shared-memory hash table, replace the mutex with a spinlock, and add timeout, generation notification, and entry reuse mechanisms. - Stream write timeout reporting: When fwrite encounters ETIMEDOUT, no longer print an error notice, preserve the timed_out metadata and do not set eof; only set eof for genuine write errors. - Stream read timeout error preservation: When fread encounters ETIMEDOUT, return failure (false) instead of 0 so callers can identify the timeout through metadata, and do not mistakenly set eof. - Poll dispatch socket identity preservation: The Poll reactor additionally stores the Socket pointer corresponding to each pollfd during set_events, and directly uses that pointer during dispatch, avoiding events being dispatched to the wrong socket after the fd is reused in a handler. - Process pool message bus reuse: start() no longer recreates the message bus when it already exists, allowing the same process pool to be shut down and started again and still deliver messages normally. - BASE event pool resource release: A multi-worker BASE server destroys the event process pool after the manager ends and reuses the message boxes already allocated by create(), fixing resource leaks. - TCP listener rebindability: make_server_socket() enables SO_REUSEADDR only for TCP listeners, avoiding TIME_WAIT preventing immediate restart while not affecting Unix and UDP socket behavior. - ProcessPool truncated packet handling: The stream/task protocol requires both the length prefix and the packet body to be read exactly in full; a short read is treated as an incomplete packet and the connection is closed, and old data in the reused buffer is no longer passed to the callback as a valid payload. - Message queue key range validation: The Process, ProcessPool, and Server entry points validate the range before narrowing a PHP integer to key_t; keys outside the representable range of key_t are rejected, while unsigned 32-bit boundaries are still accepted. - Multipart upload temporary file error: When a temporary file cannot be created for a multipart upload, mark UPLOAD_ERR_NO_TMP_DIR in the file information, avoiding handing an empty upload to the handler as a successful file. - Support HTTP QUERY method: Add QUERY to the HTTP/1 method table and let URL-encoded form bodies go through the existing request parsing path, keeping parsing consistent between normal servers and coroutine servers. - Apply stream timeout to hooked write operations: When stream_set_timeout() sets a timeout, also update both the read and write coroutine socket deadlines, so that a blocking fwrite() no longer exceeds the configured stream timeout. - Coroutine HTTP client socket initialization: Initialize the internal socket zval to null at construction so that calling close() before connecting is safe and returns SWOOLE_ERROR_CLIENT_NO_CONNECTION. - Pass null for DNS when there is no service: getaddrinfo() passes a null pointer instead of an empty string when no service is specified, fixing the issue on musl (Alpine Linux) where EAI_SERVICE caused resolution to always fail. - Ignore external interrupts when preemption is disabled: Apply the scheduling deadline only when the preemptive scheduling thread is running, preventing signal interrupts triggered by other extensions from switching coroutines using stale context state when preemption is off. - CPU affinity ID validation: Each affinity entry is converted only once and used for validation, diagnostics, and CPU_SET; negative IDs and IDs exceeding CPU_SETSIZE are rejected, and Thread::setAffinity() treats any nonzero return value from pthread_setaffinity_np as failure. - Validate affinity IDs by CPU count: On top of the previous commit, change the upper limit to SW_CPU_NUM (also not exceeding CPU_SETSIZE), rejecting IDs outside the available CPU range before Linux silently trims the invalid mask. - Prevent workers from executing manager-only signal handling: In signal handling, first verify that the current process PID equals the manager PID, avoiding a newly forked worker briefly inheriting the manager's signal handler and then repeatedly broadcasting SIGWINCH to itself. - Preserve native coroutine socket errors: After a socket call fails, immediately read errno and store it in a local variable; shutdown() and check_liveness() no longer depend on the C runtime errno that may be overwritten. - Initialize PHP hook after switching hooks: When switching from the native hook to the PHP hook, add the missing function cache initialization so that subsequent calls go through the swoole_* PHP functions instead of an empty cache. - Redis server packet receive buffer handling: Check the length before reading the trailing CRLF, expand only when the buffer is full, and perform the expansion calculation without narrowing and within package_max_length, fixing fragmented request parsing. - Preserve package length limit for partial settings: When set() on a coroutine socket does not provide package_max_length, no longer reset it to the default value, preserving the current limit. - Crash when initiating PHP requests in non-Swoole threads: sw_is_main_thread() now uses the ZTS check, and all reads and writes of the task temporary directory are protected by sw_thread_lock, avoiding crashes in threads not created by Swoole. - Coroutine HTTP server request boundaries and 100 Continue: When the chunked request buffer is full, expand it to the limit and return 413 if exceeded; use llhttp completion events to precisely determine request end and preserve pipeline bytes, and send a 100 Continue once before waiting for the request body. - HTTP/1.0 ignores 100-continue: Send the 100 Continue interim response only for HTTP/1.1 (version 101) requests; HTTP/1.0 clients do not recognize informational responses, so wait directly for the request body. - Reject overly long HTTP Upgrade values: Accumulate the Upgrade header length across multiple parsing fragments, and return a parse error when it exceeds the thread temporary buffer capacity, avoiding out-of-bounds writes and heap corruption. - Server SSL context initialization: Always initialize the main context and register the SNI callback even when only SNI certificates are configured without a default certificate, and make SSLContext::create() return failure and release the incompletely initialized context when certificate loading fails. - Preserve request fields across parse calls: Standalone Request::parse() now performs llhttp parsing of appended ranges on retained request storage, and rebuilds URL and header field spans across fragments, avoiding fragments being treated as complete fields or referencing freed pointers. - Reject repeated calls to native resource constructors: The constructors of coroutine HTTP/HTTP2 clients, coroutine HTTP servers, Process Pool, Cookie, and Thread report an error on the second call, protecting the original native resources and object state from being replaced. - Server cpu_affinity_ignore handling: First validate that the option must be an array, then compute candidate CPUs based on the process's actual affinity mask, ignore invalid IDs, report an error when all available CPUs are excluded, and free that memory when the Server is destructed. - Terminate chunked responses after clearing trailers: Always append the trailing CRLF even if the public trailer property is empty or null, ensuring wire format integrity and connection reusability. - RSHUTDOWN cleanup of PHP timers: Use std::vector and a timer ID list instead of a pointer array allocated with emalloc, look up each one again before deleting it, avoiding timers remaining until swoole_clean() due to a fatal error when request heap memory is exhausted. - Register after-fork hook during MINIT: Move the registration of the after-fork hook from RINIT to MINIT, avoiding repeated mounting when requests are started and shut down repeatedly in thread mode. - curl multi preserves select readiness state: curl_multi_exec is driven by curl_multi_socket_action, and select is only responsible for waiting and recording readiness, covering polling, callback timing, removal, and reuse scenarios. - HTTP/1 trailer completion fix: Determine whether sending is needed using the actual length of the built trailer buffer, preserve the trailing CRLF even for trailers containing only null values, and make end() return false when trailer sending fails instead of being overwritten by a success result. - Preserve incomplete packets on receive timeout: Under the length protocol, no longer clear the read buffer on timeout and do not set offset to the packet length, allowing subsequent reads to continue assembling the complete packet from the interruption point; HTTP/2 and socket fragmentation tests cover this behavior. - Recognize PHP sockaddr length macros on BSD: Change the compilation condition for address traversal to HAVE_SOCKADDR_SA_LEN or HAVE_STRUCT_SOCKADDR_SA_LEN, fixing the check on BSD platforms. - Coroutine exception delivery in SPL directory iteration: Save EG(opline_before_exception) and the interrupt opline for each PHP coroutine, and restore the suspended user code through Zend's normal exception path on external cancellation; also support throw-style self-cancellation and reject non-coroutine main contexts. - Reject global HTTP response headers in coroutines: At coroutine runtime, replace http_get_last_response_headers() with a handler that indicates it is unsupported, and restore the native handler after runtime stops, avoiding request-level global headers polluting each other across coroutines. - CPU affinity for worker application configuration: Extract cpu_affinity_ignore validation into a separate helper function, and select CPU binding for event/task workers based on the actual allowed affinity mask before the worker startup callback; in THREAD mode bind the current pthread, and keep the master mask unchanged. - Out-of-bounds read on empty PDO pgsql error message: _pdo_pgsql_trim_message() first checks whether the length is 0 and directly returns an empty string, avoiding strlen - 1 underflowing to SIZE_MAX and then reading bytes before the buffer. - Do not lose signals during signal handling: The sigaction fallback path fills sa_mask for non-safe handlers to block other signals, so that signals arriving during handling remain pending and are delivered after handling returns, fixing the issue where the master's SIGTERM is lost during SIGCHLD handling. - Enforce EOF packet length limit: Immediately report SW_ERROR_PACKAGE_LENGTH_TOO_LARGE when the first complete EOF packet exceeds package_max_length, or when an unterminated buffer reaches/exceeds the limit; coroutine sockets, synchronous/asynchronous clients, split mode, and server protocols enforce this uniformly, preserving packets exactly equal to the limit and valid first packets in merged reads. - Validate WebSocket handshake response headers: The coroutine HTTP client validates Upgrade: websocket, Connection: Upgrade, and Sec-WebSocket-Accept in the 101 response (recomputed and compared using the request key); if invalid, the handshake fails and the connection is closed. - UNIX datagram address ownership: When recvfrom has no peer address, clear the cached sun_path; during destruction, first refresh its own bound address with getsockname before unlinking, avoiding mistakenly deleting the peer socket file when releasing the receiver or exposing the previous peer address to PHP. - write_func receives decompressed response body: Compressed responses are decompressed before being handed to write_func; the callback receives plaintext chunks and the internal body buffer is cleared; covers gzip/deflate/br and compressed SSE streams. - Safe buffer expansion for WebSocket compressed output: Z_SYNC_FLUSH output may exceed deflateBound(); change to extend first when bytes_written + max_length exceeds capacity, and accumulate length according to the write position, avoiding out-of-bounds and length loss; add regression tests for incompressible payloads and control frames. - Shared settings array isolation: Each set() performs SEPARATE_ARRAY on the setting property array before merging, avoiding in-place modification of a copy-on-write shared array, so that previously taken snapshots and caller-provided arrays remain unchanged; also remove the erroneous extra reference to the port object when inheriting settings across multiple ports. - Preserve reload initiated in worker callbacks: The wait loop no longer deletes reload tasks during the reload_init phase, and instead waits until the next initialization round fills in the worker snapshot before checking completion, avoiding reloads requested in callbacks being discarded prematurely. - Backport adaptation for pending reload and regression cases: When there is already a pending reload in the queue, use wait_process with WNOHANG to avoid blocking, and fix the pid is less than or equal to 0 check; on the test side, reap child processes, drain accepted HTTP connections before closing listeners, and adapt the test runner's output limit handling. - Free captured HTTP/1 Content-Type: Move the freeing of content_type out of the branch that only matches compressed types, so that it is also freed when Content-Encoding is set and compression is disabled due to a mismatch, fixing a memory leak of about 1 KiB per request.
  • swoole 6.2.4
    - Build fix for platforms without futex: Changed `sw_usleep` to the standard `usleep` to fix compilation failure on that platform. - WebSocket decoding validation: The decoder rejects CLOSE/PING/PONG control frames with RSV1 set before unmasking, preventing compressed control frames from entering the receive path. - WebSocket encoding validation: The encoder rejects fragmented control frames or control frames with payloads exceeding 125 bytes, and makes `ping()` return false and set `SWOOLE_ERROR_WEBSOCKET_PACK_FAILED` when encoding fails. - Thread stdio fd leak: After a thread exits, manually close the STDIN/STDOUT/STDERR file descriptors that were not released due to `PHP_STREAM_FLAG_NO_CLOSE`. - Reactor unregistered fd lookup: When looking up an unregistered fd, return null instead of inserting an empty entry into the socket map, and change the accessor to const. - SOCKS5 target host length validation: The DNS tunnel now validates that the target host length does not exceed 255 bytes, and returns an error as a handshake failure when it is too long. - Thread scheduling policy preservation: When no policy is specified in `Thread::setPriority()`, first read the current scheduling policy before setting the priority, fixing the issue of using the invalid `-1` policy. - Buffered stream read fix: Under PHP 8.3, when the stream already has buffered data, use the non-waiting receive path so that hooked streams directly return buffered data without waiting for new events. - Atomic wait on systems without futex: Implement an atomic wait registry based on a shared-memory hash table, replace the mutex with a spinlock, and add timeout, generation notification, and entry reuse mechanisms. - Stream write timeout reporting: When `fwrite` encounters ETIMEDOUT, no longer print an error notice, preserve the `timed_out` metadata and do not set `eof`; only set eof for genuine write errors. - Stream read timeout error preservation: When `fread` encounters ETIMEDOUT, return failure (false) instead of 0 so callers can identify the timeout through metadata, and do not mistakenly set eof. - Poll dispatch socket identity preservation: The Poll reactor additionally stores the Socket pointer corresponding to each pollfd during `set_events`, and directly uses that pointer during dispatch, avoiding events being dispatched to the wrong socket after the fd is reused in a handler. - Process pool message bus reuse: `start()` no longer recreates the message bus when it already exists, allowing the same process pool to be shut down and started again and still deliver messages normally. - BASE event pool resource release: A multi-worker BASE server destroys the event process pool after the manager ends and reuses the message boxes already allocated by `create()`, fixing resource leaks. - TCP listener rebindability: `make_server_socket()` enables `SO_REUSEADDR` only for TCP listeners, avoiding TIME_WAIT preventing immediate restart while not affecting Unix and UDP socket behavior. - ProcessPool truncated packet handling: The stream/task protocol requires both the length prefix and the packet body to be read exactly in full; a short read is treated as an incomplete packet and the connection is closed, and old data in the reused buffer is no longer passed to the callback as a valid payload. - Message queue key range validation: The Process, ProcessPool, and Server entry points validate the range before narrowing a PHP integer to `key_t`; keys outside the representable range of `key_t` are rejected, while unsigned 32-bit boundaries are still accepted. - Multipart upload temporary file error: When a temporary file cannot be created for a multipart upload, mark `UPLOAD_ERR_NO_TMP_DIR` in the file information, avoiding handing an empty upload to the handler as a successful file. - Support HTTP QUERY method: Add QUERY to the HTTP/1 method table and let URL-encoded form bodies go through the existing request parsing path, keeping parsing consistent between normal servers and coroutine servers. - Apply stream timeout to hooked write operations: When `stream_set_timeout()` sets a timeout, also update both the read and write coroutine socket deadlines, so that a blocking `fwrite()` no longer exceeds the configured stream timeout. - Coroutine HTTP client socket initialization: Initialize the internal socket zval to null at construction so that calling `close()` before connecting is safe and returns `SWOOLE_ERROR_CLIENT_NO_CONNECTION`. - Pass null for DNS when there is no service: `getaddrinfo()` passes a null pointer instead of an empty string when no service is specified, fixing the issue on musl (Alpine Linux) where EAI_SERVICE caused resolution to always fail. - Ignore external interrupts when preemption is disabled: Apply the scheduling deadline only when the preemptive scheduling thread is running, preventing signal interrupts triggered by other extensions from switching coroutines using stale context state when preemption is off. - CPU affinity ID validation: Each affinity entry is converted only once and used for validation, diagnostics, and `CPU_SET`; negative IDs and IDs exceeding `CPU_SETSIZE` are rejected, and `Thread::setAffinity()` treats any nonzero return value from `pthread_setaffinity_np` as failure. - Validate affinity IDs by CPU count: On top of the previous commit, change the upper limit to `SW_CPU_NUM` (also not exceeding `CPU_SETSIZE`), rejecting IDs outside the available CPU range before Linux silently trims the invalid mask. - Prevent workers from executing manager-only signal handling: In signal handling, first verify that the current process PID equals the manager PID, avoiding a newly forked worker briefly inheriting the manager's signal handler and then repeatedly broadcasting SIGWINCH to itself. - Preserve native coroutine socket errors: After a socket call fails, immediately read errno and store it in a local variable; `shutdown()` and `check_liveness()` no longer depend on the C runtime errno that may be overwritten. - Initialize PHP hook after switching hooks: When switching from the native hook to the PHP hook, add the missing function cache initialization so that subsequent calls go through the `swoole_*` PHP functions instead of an empty cache. - Redis server packet receive buffer handling: Check the length before reading the trailing CRLF, expand only when the buffer is full, and perform the expansion calculation without narrowing and within `package_max_length`, fixing fragmented request parsing. - Preserve package length limit for partial settings: When `set()` on a coroutine socket does not provide `package_max_length`, no longer reset it to the default value, preserving the current limit. - Crash when initiating PHP requests in non-Swoole threads: `sw_is_main_thread()` now uses the `ZTS` check, and all reads and writes of the task temporary directory are protected by `sw_thread_lock`, avoiding crashes in threads not created by Swoole. - Coroutine HTTP server request boundaries and 100 Continue: When the chunked request buffer is full, expand it to the limit and return 413 if exceeded; use llhttp completion events to precisely determine request end and preserve pipeline bytes, and send a 100 Continue once before waiting for the request body. - HTTP/1.0 ignores 100-continue: Send the 100 Continue interim response only for HTTP/1.1 (version 101) requests; HTTP/1.0 clients do not recognize informational responses, so wait directly for the request body. - Reject overly long HTTP Upgrade values: Accumulate the Upgrade header length across multiple parsing fragments, and return a parse error when it exceeds the thread temporary buffer capacity, avoiding out-of-bounds writes and heap corruption. - Server SSL context initialization: Always initialize the main context and register the SNI callback even when only SNI certificates are configured without a default certificate, and make `SSLContext::create()` return failure and release the incompletely initialized context when certificate loading fails. - Preserve request fields across parse calls: Standalone `Request::parse()` now performs llhttp parsing of appended ranges on retained request storage, and rebuilds URL and header field spans across fragments, avoiding fragments being treated as complete fields or referencing freed pointers. - Reject repeated calls to native resource constructors: The constructors of coroutine HTTP/HTTP2 clients, coroutine HTTP servers, Process Pool, Cookie, and Thread report an error on the second call, protecting the original native resources and object state from being replaced. - Server cpu_affinity_ignore handling: First validate that the option must be an array, then compute candidate CPUs based on the process's actual affinity mask, ignore invalid IDs, report an error when all available CPUs are excluded, and free that memory when the Server is destructed. - Terminate chunked responses after clearing trailers: Always append the trailing CRLF even if the public trailer property is empty or null, ensuring wire format integrity and connection reusability. - RSHUTDOWN cleanup of PHP timers: Use `std::vector` and a timer ID list instead of a pointer array allocated with `emalloc`, look up each one again before deleting it, avoiding timers remaining until `swoole_clean()` due to a fatal error when request heap memory is exhausted. - Register after-fork hook during MINIT: Move the registration of the after-fork hook from RINIT to MINIT, avoiding repeated mounting when requests are started and shut down repeatedly in thread mode. - curl multi preserves select readiness state: `curl_multi_exec` is driven by `curl_multi_socket_action`, and `select` is only responsible for waiting and recording readiness, covering polling, callback timing, removal, and reuse scenarios. - HTTP/1 trailer completion fix: Determine whether sending is needed using the actual length of the built trailer buffer, preserve the trailing CRLF even for trailers containing only null values, and make `end()` return false when trailer sending fails instead of being overwritten by a success result. - Preserve incomplete packets on receive timeout: Under the length protocol, no longer clear the read buffer on timeout and do not set `offset` to the packet length, allowing subsequent reads to continue assembling the complete packet from the interruption point; HTTP/2 and socket fragmentation tests cover this behavior. - Recognize PHP sockaddr length macros on BSD: Change the compilation condition for address traversal to `HAVE_SOCKADDR_SA_LEN` or `HAVE_STRUCT_SOCKADDR_SA_LEN`, fixing the check on BSD platforms. - Coroutine exception delivery in SPL directory iteration: Save `EG(opline_before_exception)` and the interrupt opline for each PHP coroutine, and restore the suspended user code through Zend's normal exception path on external cancellation; also support throw-style self-cancellation and reject non-coroutine main contexts. - Reject global HTTP response headers in coroutines: At coroutine runtime, replace `http_get_last_response_headers()` with a handler that indicates it is unsupported, and restore the native handler after runtime stops, avoiding request-level global headers polluting each other across coroutines. - CPU affinity for worker application configuration: Extract `cpu_affinity_ignore` validation into a separate helper function, and select CPU binding for event/task workers based on the actual allowed affinity mask before the worker startup callback; in THREAD mode bind the current pthread, and keep the master mask unchanged. - Out-of-bounds read on empty PDO pgsql error message: `_pdo_pgsql_trim_message()` first checks whether the length is 0 and directly returns an empty string, avoiding `strlen - 1` underflowing to `SIZE_MAX` and then reading bytes before the buffer. - Do not lose signals during signal handling: The sigaction fallback path fills `sa_mask` for non-safe handlers to block other signals, so that signals arriving during handling remain pending and are delivered after handling returns, fixing the issue where the master's SIGTERM is lost during SIGCHLD handling. - Enforce EOF packet length limit: Immediately report `SW_ERROR_PACKAGE_LENGTH_TOO_LARGE` when the first complete EOF packet exceeds `package_max_length`, or when an unterminated buffer reaches/exceeds the limit; coroutine sockets, synchronous/asynchronous clients, split mode, and server protocols enforce this uniformly, preserving packets exactly equal to the limit and valid first packets in merged reads. - Validate WebSocket handshake response headers: The coroutine HTTP client validates `Upgrade: websocket`, `Connection: Upgrade`, and `Sec-WebSocket-Accept` in the 101 response (recomputed and compared using the request key); if invalid, the handshake fails and the connection is closed. - UNIX datagram address ownership: When `recvfrom` has no peer address, clear the cached `sun_path`; during destruction, first refresh its own bound address with `getsockname` before unlinking, avoiding mistakenly deleting the peer socket file when releasing the receiver or exposing the previous peer address to PHP. - write_func receives decompressed response body: Compressed responses are decompressed before being handed to `write_func`; the callback receives plaintext chunks and the internal body buffer is cleared; covers gzip/deflate/br and compressed SSE streams. - Safe buffer expansion for WebSocket compressed output: `Z_SYNC_FLUSH` output may exceed `deflateBound()`; change to `extend` first when `bytes_written + max_length` exceeds capacity, and accumulate `length` according to the write position, avoiding out-of-bounds and length loss; add regression tests for incompressible payloads and control frames. - Shared settings array isolation: Each `set()` performs `SEPARATE_ARRAY` on the `setting` property array before merging, avoiding in-place modification of a copy-on-write shared array, so that previously taken snapshots and caller-provided arrays remain unchanged; also remove the erroneous extra reference to the port object when inheriting settings across multiple ports. - Preserve reload initiated in worker callbacks: The wait loop no longer deletes reload tasks during the `reload_init` phase, and instead waits until the next initialization round fills in the worker snapshot before checking completion, avoiding reloads requested in callbacks being discarded prematurely. - Backport adaptation for pending reload and regression cases: When there is already a pending reload in the queue, use `wait_process` with `WNOHANG` to avoid blocking, and fix the `pid less than or equal to zero` check; on the test side, reap child processes, drain accepted HTTP connections before closing listeners, and adapt the test runner's output limit handling. - Free captured HTTP/1 Content-Type: Move the freeing of `content_type` out of the branch that only matches compressed types, so that it is also freed when `Content-Encoding` is set and compression is disabled due to a mismatch, fixing a memory leak of about 1 KiB per request. - Added `SwooleCoroutineHttp2MultiplexClient`, an HTTP/2 client that multiplexes requests from many coroutines over one shared connection, reconnects on demand, and closes an idle connection after a configurable period (options `heartbeat_check_interval` and `heartbeat_idle_time`). - `SwooleDatabaseRedisConfig::withAuth()` now also accepts a `[username, password]` array for Redis ACL authentication. A class extending `RedisConfig` that overrides `withAuth()` or redeclares `$auth` has to widen its `string` type to `string|array`. - Support the `CURLOPT_PREREQFUNCTION` option in the coroutine curl handler; on PHP versions without the native constants, use `SwooleCurlCURLOPT_PREREQFUNCTION`, `SwooleCurlCURL_PREREQFUNC_OK` and `SwooleCurlCURL_PREREQFUNC_ABORT`. - Support the `http2_max_headers` server option, with the constant `SwooleConstant::OPTION_HTTP2_MAX_HEADERS`. - `SwooleDatabaseMysqliProxy::inTransaction()` and `reset()`, which report and forget the transaction state the proxy tracks. `SwooleDatabaseMysqliPool::get()` hands out a connection with that state reset. - `SwooleRemoteObjectException::getRemoteClass()` and `getRemoteCode()`, which give the class and the code of an exception thrown on the server. - `SwooleServerHelper` uses the `SwooleConstant::OPTION_*` constants instead of string literals in its option tables and lookups. - The FastCGI `Params` record encodes and decodes its parameters in linear time, about 2.5 and 8 times faster than before; the bytes produced and the parameters read are the same. - `SwooleArrayObject::lastIndexOf()` and `remove()` with `$loop` find their keys in one `array_keys()` call instead of walking the array in PHP, with the same results. - `SwooleStringObject::endsWith()` uses `str_ends_with()` and no longer scans the whole string, with the same results. - Report fatal `SwooleCoroutineServer` accept failures through `start()` and `errCode`. - Fixed a memory leak in `SwooleRemoteObjectClient`, present since 6.2.0, where every client was kept alive for the lifetime of the process. `SwooleRemoteObjectClient::getInstance()` now returns `null` for a client that is gone, and a client can no longer be cloned. - Fixed a startup race in the default remote object server that let a coroutine see the server as ready while another one was still starting it. - A failed reconnect left a database statement proxy wrapping `false`. - `SwooleRemoteObjectClient` now throws a `SwooleRemoteObjectException` on a response that does not unserialize. - An empty FastCGI response is now reported as `502 Invalid FastCGI Response`. - `SwooleCoroutineFastCGIClient` kept a connection whose response could not be parsed, and the next request sent over it read the rest of that response as its own. - A `SwooleRemoteObjectClient` used from several coroutines at once ended the process with a fatal "Socket has already been bound to another coroutine"; calls through one client are now serialized. - `swoole_container_cpu_num()` ignored the CPU quota of cgroup v2 containers. - The mysqli proxies did not reconnect after a lost connection under the default mysqli report mode of PHP 8.1+, where failures are thrown as `mysqli_sql_exception`. - The mysqli proxies no longer reconnect inside a transaction, and report a lost connection in a method they do not retry, such as `store_result()`, where they returned `false`. - `SwooleDatabaseMysqliStatementProxy` did not re-bind the `bind_result()` variables correctly after a reconnect, and retried `fetch()` on a statement that was prepared again but never executed. - `SwooleDatabaseMysqliStatementProxy` did not recover from a second lost connection on the same statement. - `SwooleDatabasePDOStatementProxy` turned a connection lost while reading rows into an empty result, and did not recover from a second lost connection on the same statement. It now retries `execute()` only, and reports a lost connection in any other method. - `SwooleDatabasePDOStatementProxy`: after a connection lost inside a transaction started by hand, e.g. with `exec('BEGIN')`, `execute()` ran the statement again on a new connection, outside the transaction. The lost connection is now reported. - The database proxies recognise more lost-connection errors: SSL failures during a query, PostgreSQL's `canceling statement due to conflict with recovery`, and the PlanetScale PostgreSQL / pg_bouncer messages, in line with Laravel's list. - `SwooleDatabaseRedisPool` passed the `connect()` arguments in the wrong positions when only some of the connect timeout, retry interval and read timeout were configured. - `SwooleCoroutineServer` never backed off when a coroutine could not be created for an accepted connection. - A FastCGI request body of `"0"` was dropped as empty. - An exception the remote object server caught became a `TypeError` on the client when its code was not an integer, as with a `PDOException`, and so did the server's own errors such as an invalid API key. Both now arrive as a `SwooleRemoteObjectException`. - `SwooleNameResolverNacos::getCluster()` threw a `TypeError`, because Nacos reports the weight of a node as a float. - Several scripts under `examples/` did not run: the remote object, Nacos, Consul, PDO and short name examples. - `SwooleConnectionPool::close()` failed with an `Error` when called twice, and `fill()` on a closed pool made connections only to drop them. - `SwooleDatabasePDOProxy`: `query()` and `prepare()` failed with a `TypeError` outside the exception error mode. - `SwooleDatabasePDOProxy`: `query()`, `exec()` and `beginTransaction()` did not reconnect after a connection lost outside a transaction on PostgreSQL. - `SwooleDatabasePDOProxy` stayed on a dead connection after a connection lost inside a transaction, and on PostgreSQL after a reconnect that failed. The next call now reconnects, and `rollBack()` of the transaction lost with the connection returns `true`. - `SwooleArrayObject` and `swoole_array_default_value()` raised a deprecation on PHP 8.5 when given a `null` key, which still stands for the empty string. - The mysqli proxies raised a warning on `prepare(query: ...)`, with the query passed by name, and could not prepare that statement again after a reconnect. - `SwooleDatabasePDOStatementProxy`: after a reconnect, a statement used the value a variable had when `bindParam()` was called, not its present one, and no longer filled the variables of `bindColumn()`. - `SwooleDatabasePDOStatementProxy::bindColumn()` threw a `TypeError` when called without a type. - `isset()` and `empty()` on an offset of a `SwooleRemoteObject` always failed with a `TypeError`. - `SwooleDatabasePDOStatementProxy`: after a reconnect, a parameter bound by both `bindValue()` and `bindParam()` could take the binding made first instead of the one made last. - Array access on a `SwooleRemoteObject` used the properties of the object on the server instead of its `ArrayAccess` implementation. - The remote object server passed `null` to a function called with a remote object it no longer has, where it now reports the object as not found. - The default remote object server did not start in a directory whose path has a space or a quote in it. - `isset()`, `empty()` and `??` on a property of a `SwooleRemoteObject` treated the property as unset without asking the server, and `unset()` did not reach the server. - Dropped support for PHP below 8.2 and Swoole below 6.2.
  • zookeeper 1.3.1
    Bugs: - Avoid double-free of watcher callback data after successful removal from the callback hash table (Thanks to John P. Bloch, GH PR #66)
  • datadog_trace 1.26.1
    ## All products ### Fixed - Call exit handlers when FrankenPHP shuts down #4350 - Use fallible allocations when serializing traces and parsing request bodies #4345, #4351 - Avoid null pointer arithmetic in CLI script basename detection #4320

    Tracer

    Fixed

    • Hook #[DDTraceTrace] attributes on preloaded functions #4324
    • Propagate DD_ENTITY_ID to DogStatsD metrics sent by the extension #4328 (thank you @lcobucci!)

    Profiling

    Fixed

    • Fix thread safety issues in profiler globals initialization and shutdown, and avoid a 100ms sleep at shutdown #4296, #4301

    AppSec

    Fixed

    • Avoid accessing freed logging state at shutdown #4350
tagged:

Link:

Community News:
Latest PECL Releases (10.20.2026)
Oct 20, 2026 @ 08:05:33

Latest PECL Releases:

  • yac 3.0.1
    - Keep reference-containing values on the internal fast serializer when their contents are supported, falling back to PHP serialization otherwise

    • dump() reports encoder details and names the storage location field consistently
  • phalcon 5.23.0
    Full changelog can be found at: https://github.com/phalcon/cphalcon/blob/master/CHANGELOG-5.0.md
  • protobuf 5.37.0RC1
    * See github.com/protocolbuffers/protobuf/releases/tag/v37.0-rc1 for release notes.
  • mongodb 1.21.12
    ## What's Changed ### Fixed * PHPC-276: Prevent stack exhaustion when decoding deeply nested BSON by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2158 ### Other Changes * PHPC-276: Enforce the decode nesting limit for CodeWScope scopes by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2166

    Full Changelog: https://github.com/mongodb/mongo-php-driver/compare/1.21.11...1.21.12

  • mongodb 2.1.12
    ## What's Changed ### Fixed * PHPC-276: Prevent stack exhaustion when decoding deeply nested BSON by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2158 ### Other Changes * PHPC-276: Enforce the decode nesting limit for CodeWScope scopes by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2166

    Full Changelog: https://github.com/mongodb/mongo-php-driver/compare/2.1.11...2.1.12

  • mongodb 2.5.5
    <!-- Release notes generated using configuration in .github/release.yml at 2.5.5 -->

    What's Changed

    Fixed

    • PHPC-276: Prevent stack exhaustion when decoding deeply nested BSON by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2158

    Other Changes

    • PHPC-276: Enforce the decode nesting limit for CodeWScope scopes by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2166

    Full Changelog: https://github.com/mongodb/mongo-php-driver/compare/2.5.4...2.5.5

tagged:

Link:

Community News:
Latest PECL Releases (10.13.2026)
Oct 13, 2026 @ 08:05:31

Latest PECL Releases:

  • gRPC 1.85.0RC1
    - gRPC Core 1.85.0 update

  • zephir_parser 2.9.1
    ### Fixed - Fixed a union-typed property failing to parse with `{ get, set }` shortcuts or an all-caps name ([zephir-lang/zephir#2761](https://github.com/zephir-lang/zephir/issues/2761))
  • zephir_parser 2.9.0
    ### Added - Support `a instanceof static` (late static binding). The right operand is a variable named `static`, the shape `instanceof self` and `instanceof parent` already have, and `a instanceof static::m()` still parses as before ([zephir-lang/zephir#2714](https://github.com/zephir-lang/zephir/issues/2714))
  • Judy 2.8.0
    - SECURITY FIX: appending to a string-keyed array ($j[] = ...) no longer crashes; the append guard now enumerates all seven string-keyed types, including Judy::STRING_TO_ENTRY (#217). - SECURITY FIX: forEach()/filter()/map() on Judy::STRING_TO_ENTRY read each value through the entry accessor instead of reinterpreting a cache-entry struct as a zval (out-of-bounds read / crash); equals() gained a matching ENTRY branch (#217). - SECURITY FIX: set() rejects keys longer than the 64 KB key buffer before taking a slot, closing a heap overflow reachable through an oversized key; deleteRange() on string-keyed ENTRY arrays now frees the cache-entry struct and its value reference instead of leaking both (#217). - FIX: expired STRING_TO_ENTRY values are hidden from reads and traversals (iterator, get, keys/values/toArray) while count()/size() stay raw-counter O(1) until pruneExpired(). mergeWith() copies TTL and flags verbatim, and get_gc() collects stored ENTRY values so value cycles are collectable (#217). - FIX: wrong-category range bounds now throw TypeError instead of silently coercing to a wrong-range read: int-keyed keys()/values()/toArray()/size()/ slice() reject non-numeric string bounds, and string-keyed deleteRange() rejects integer bounds (#217). - FIX: __unserialize() validates the serialized type, payload shape and optimizeIteration flag strictly before touching the object, so a malformed payload throws without destroying or corrupting an already-populated array, and an out-of-range type throws instead of emitting an E_WARNING (#225).
  • mongodb 1.21.11
    ## What's Changed ### Other Changes * Exclude OCSP tasks from PR checks by @kevinAlbs in https://github.com/mongodb/mongo-php-driver/pull/2125 * PHPC-2774: Pin all GitHub Actions to exact release tags by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2121 * Align the v1.21 CI configuration with v2.1 and v2.5, and pin all GitHub Actions by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2129 * Upgrade libmongoc by @paulinevos in https://github.com/mongodb/mongo-php-driver/pull/2148

    Full Changelog: https://github.com/mongodb/mongo-php-driver/compare/1.21.10...1.21.11

  • mongodb 2.1.11
    ## What's Changed ### Other Changes * Exclude OCSP tasks from PR checks by @kevinAlbs in https://github.com/mongodb/mongo-php-driver/pull/2125 * PHPC-2774: Pin all GitHub Actions to exact release tags by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2121 * Align the v1.21 CI configuration with v2.1 and v2.5, and pin all GitHub Actions by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2129 * Upgrade libmongoc by @paulinevos in https://github.com/mongodb/mongo-php-driver/pull/2148 * remove stray build files by @kevinAlbs in https://github.com/mongodb/mongo-php-driver/pull/2151

    Full Changelog: https://github.com/mongodb/mongo-php-driver/compare/2.1.10...2.1.11

  • mongodb 2.5.4
    <!-- Release notes generated using configuration in .github/release.yml at 2.5.4 -->

    What's Changed

    Fixed

    • PHPC-2505: Fix foreach after GC invocation by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/1982

    Minor

    • PHPC-2682: Replace zend_hash_destroy + FREE_HASHTABLE with zend_hash_release by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2138

    Other Changes

    • Exclude OCSP tasks from PR checks by @kevinAlbs in https://github.com/mongodb/mongo-php-driver/pull/2125
    • PHPC-2774: Pin all GitHub Actions to exact release tags by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2121
    • Align the v1.21 CI configuration with v2.1 and v2.5, and pin all GitHub Actions by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2129
    • Upgrade libmongoc by @paulinevos in https://github.com/mongodb/mongo-php-driver/pull/2148
    • remove stray build files by @kevinAlbs in https://github.com/mongodb/mongo-php-driver/pull/2151

    Full Changelog: https://github.com/mongodb/mongo-php-driver/compare/2.5.3...2.5.4

  • datadog_trace 1.26.0
    ## All products ### Changed - Write sidecar logs when it runs in thread mode #4235 - `datadog-setup.php` now reports that macOS is not supported #4284 (thank you @staabm for the report!)

    Fixed

    • Stop spawning a new sidecar while a PHP worker shuts down, which left orphaned sidecar processes #4164
    • Correctly handle a thread-mode sidecar that takes over as the new master process #4270
    • Fix sidecar telemetry lock inversions, premature sidecar idle shutdown and a hang on Windows when the sidecar pipe is full #4219
    • Avoid a race between the SSI loader's background dlclose() and process exit #4229
    • Crash reports now respect proxy environment variables, and the agent host/port takes priority over a UDS socket for error tracking uploads DataDog/libdatadog#2462, DataDog/libdatadog#2633
    • Authenticate sidecar connections and shared memory (peer credential checks, trusted shared memory directory), fixing https://github.com/DataDog/dd-trace-php/security/advisories/GHSA-j3g8-6962-2xqq and https://github.com/DataDog/dd-trace-php/security/advisories/GHSA-fmrj-jm6v-j549 DataDog/libdatadog#2551

    Internal

    • Update Rust dependencies to fix RustSec advisories; building from source now requires Rust 1.91.1 #4188
    • Publish the OTel process context during MINIT #4213

    Tracer

    Added

    • Support OTel sampling (ot.th/ot.rv tracestate) in distributed tracing #4177

    Changed

    • Update the default query string obfuscation regex, fixing a security vulnerability, as described in https://github.com/DataDog/dd-trace-php/security/advisories/GHSA-49fg-59cp-2hqj #4282
    • Improve stability of the tracer on macOS #4187
    • Client-side stats obfuscation now follows the agent's full SQL obfuscation config DataDog/libdatadog#2535

    Fixed

    • Fix crashes at shutdown: on PHP 7.0/7.1 ZTS #4185, in atexit after ddtrace was unloaded #4197, in the zend extension shutdown #4218, and in remote config shutdown #4220
    • Fix rare use-after-frees in the in-process background sender, during request processing #4189 and at shutdown when the writer thread gets detached #4278 (thank you @alexandre-daubois!)
    • Make the flush on SIGTERM/SIGINT safe against crashes in the allocator #4222
    • Fix a crash when walking the stack after a generator was destroyed during an aborted call #4272
    • Fix JIT blacklisting on PHP 8.5+ and for generator memory #4226, #4236
    • Fix multi-hooking with dynamic payloads and a crash when subclassing HookData #4236
    • Do not start the background writer when the tracer is disabled during MINIT #4233
    • Avoid starvation of synchronous flushes with the in-process background sender #4224
    • Fix sidecar connection from threads impersonating another user under Windows #4280
    • Make Windows remote config notifications safe against unloading ddtrace #4219
    • Evaluate the sampling decision once per trace chunk during serialization #4219
    • Set peer.service sources in the Predis and PDO connect integrations #4285, #4286 (thank you @redpanda for the reports!)
    • Report http.status_code for Guzzle requests that throw on non-2xx responses, and fix DD_TRACE_HTTP_CLIENT_ERROR_STATUSES handling #4287 (thank you @fbaumann-ph for the report!)
    • Fix client-side stats: http.endpoint takes precedence over http.route again, and deeply nested SQL can no longer exhaust the stack during obfuscation DataDog/libdatadog#2582, DataDog/libdatadog#2441
    • Fix a possible divide-by-zero panic in the shared rate limiter #4259

    Internal

    • Add the _dd.sdk.otlp_export marker to trace chunks #4240

    Profiling

    Changed

    • Speed up sample processing, reducing dropped samples under load #4194

    Fixed

    • Fix several I/O profiling issues: poll readiness, fread/fwrite byte counts, RELRO protection after GOT patching, and loader bounds checks #4156
    • Fix a wall-time crash after ext-grpc runs PHP code on a native thread; I/O profiling is disabled when ext-grpc is loaded #4198
    • Report allocator-rounded allocation sizes and fix upscaling of samples with varying allocation sizes #4230
    • Block signals before spawning profiler helper threads #4224

    AppSec

    Changed

    • Update libddwaf to 2.1.0 and build it from source for PECL packages, fixing offline builds #4203 (thank you @remicollet for the report!)
    • Update vendored libxml2 to 2.15.4 #4224

    Fixed

    • Fix loading AppSec on musl ZTS builds (e.g. Alpine, FrankenPHP), and a crash on ZTS thread exit #4180
    • Fix protocol failures caused by empty AppSec data #4216
  • rpminfo 1.2.2
    - Update PHP License from version 3 to version 4 (BSD-3-Clause) - Compatibility with PHP 8.6
  • Bitset 3.2.1
    - Compatibility with PHP 8.6
tagged:

Link:

Community News:
Latest PECL Releases (10.06.2026)
Oct 06, 2026 @ 08:05:35

Latest PECL Releases:

tagged:

Link:

Community News:
Latest PECL Releases (09.22.2026)
Sep 22, 2026 @ 08:05:26

Latest PECL Releases:

  • Tensor 3.1.0
    - Implemented the singular value decomposition (SVD) in the pure-PHP library

    • Implemented the Moore-Penrose pseudoinverse in the pure-PHP library via SVD
    • Implemented the eigendecomposition in the pure-PHP library
  • Tensor 3.0.11
    - Update to Zephir 1.5.0 - Fixed RREF/REF pivot float tolerance - RREF now zeroes the tail if below EPSILON - `rank()`, `fullRank()`, and `inverse()` are now consistent - Matrix::inverse() now throws a RuntimeException on singular input - Matrix::inverse() now throws an InvalidArgumentException on non-square input - Fix Poisson distribution when lambda is zero - Added square check to inverse() - Cholesky decompose() now throws a RuntimeException on non-positive-definite input - Added the SingularMatrix exception - The extension now reduces singular matrices to REF and RREF instead of throwing
  • phalcon 5.21.0
    Full changelog can be found at: https://github.com/phalcon/cphalcon/blob/master/CHANGELOG-5.0.md
  • Tensor 3.0.10
    - Update to Zephir 0.23, adds support for PHP 8.5 - Fixed Matrix and Vector build() validation - Fixed bug in Matrix row variance - Fixed LU decomposition pivot selection, singular matrices now throw a RuntimeException - Fixed undefined array key in Vector and Matrix quantile at q=1.0 or with a single element - Fix extension rank() operation - Fixed reduce() callback argument order inconsistency between Matrix and Vector - Fix covariance() summation axis - Fixed Vector notEqualMatrix throwing InvalidArgumentException instead of DimensionalityMismatch - Fixed memory leak in the extension on the failure path of inverse, pseudoinverse
  • protobuf 5.36.2
    * See github.com/protocolbuffers/protobuf/releases/tag/v36.2 for release notes.
  • ice 1.12.0
    - PHP 8.0, drop support - PHP 8.5, add support - Update zephir parser to 2.8.0 - Update mongodb/mongodb to ~2 - SleetParser, fix template parsing and array literal syntax - Di, Arr, fix magic get/set returning null for registered services - FastRouter, fix routes with no explicit handler not matching - Url, fix double leading slash in generated URLs - FilterCss, fix comment stripping - HttpResponse, fix byte range for non-resumable downloads - Fix various Zephir compile errors and conditional-initialization warnings - Tests, convert @dataProvider annotations to PHP 8 attributes for PHPUnit 11+
  • timezonedb 2026.4
    Updated to version 2026.4 (2026d)
  • swoole 6.1.10
    - Fixed an issue in SWOOLE_THREAD mode where the program could not start if the set() method was not called. - Fixed a NULL pointer dereference that occurred when querying port attributes while shutting down the server, caused by the ListenPort pointer being NULL. - Fixed an issue where a hooked TLS stream completes the handshake in Socket::connect(). When this call fails or is canceled, the stream transport layer should return failure directly instead of attempting to enable encryption again. - Fixed an issue where the coroutine HTTP server still returned success when the protocol setting was rejected or accept failed. - Fixed an issue where HTTP compression used the wrong data format when returning deflate encoding. - Fixed an issue where, when native hook was not enabled, destroying a native CurlHandle did not hand the object release work back to ext-curl, resulting in incorrect release logic. - Fixed an issue in cURL multi under the CURL_POLL_INOUT state where the event mask for "readable and writable at the same time" was not correctly restored, causing HTTP/2 duplex transmission to be repeatedly woken up when blocked by flow control, forming a busy loop. - Fixed the lack of timeout support for atomic wait/wakeup on the Windows platform. - Fixed an issue where, after enabling send_yield, the peer closing the connection prevented the coroutine from being woken up, resulting in a coroutine leak.
tagged:

Link:

Community News:
Latest PECL Releases (09.15.2026)
Sep 15, 2026 @ 08:05:24

Latest PECL Releases:

  • gRPC 1.84.0
    - gRPC Core 1.84.0 update

  • opentelemetry 1.4.1
    See https://github.com/open-telemetry/opentelemetry-php-instrumentation/releases/tag/1.4.1
  • maxminddb 1.14.0
    * Bounded the resources that the pure PHP decoder spends on a single lookup. A crafted database could nest data-section pointers to shared targets so that decoding one record cost exponential time and memory, or point many times at one large value so that the decoder copied far more data than the file holds. The decoder now follows the Reader Resource Limits section of the MaxMind DB specification. Each lookup is limited to 65,536 values, 512 levels of nesting, and 2 MiB of string and bytes payload. * Exceeding a limit throws an `InvalidDatabaseException`. * Opening a database whose metadata exceeds a limit throws the same exception. * A scalar that declares more than 16 bytes, the width of the widest fixed-width type, is rejected as invalid data. * The bundled libmaxminddb used by `--with-maxminddb-bundled` builds of the extension now applies the same decoder limits. The extension throws an `InvalidDatabaseException` when a lookup exceeds them. * The pure PHP reader is about 40% faster on City lookups. It no longer seeks before a read that continues where the last one ended, and it checks read lengths with `strlen()` instead of `ftell()`. * The Windows build configuration now accepts either `libmaxminddb.lib` or `maxminddb.lib` when building the extension. The `lib` prefix was removed in libmaxminddb 1.6.0, but the libmaxminddb that PHP publishes for Windows builds is still 1.5.0, which uses the prefixed name. Pull request by Jean-Baptiste Nahan. GitHub #231. * Replaced `XtOffsetOf()` with `offsetof()`. The `XtOffsetOf()` alias has been removed in PHP 8.6. Pull request by Remi Collet. GitHub #252. * The extension can now be built from a bundled copy of libmaxminddb, on both Unix-like systems and Windows, by passing `--with-maxminddb-bundled` to `configure` (or to `configure.bat` on Windows). This produces an extension that does not depend on a system libmaxminddb, which is a prerequisite for distributing precompiled builds; on Windows it also replaces the 1.5.0 import library that PHP publishes for Windows builds. The default is unchanged: without the flag, the extension links against a system libmaxminddb as before. GitHub #265. * The `conflict` constraint on `ext-maxminddb` in `composer.json` is again updated when a release is cut. The substitution that maintains it stopped matching in April 2024, when the constraint's separator changed from a comma to `||`, so the constraint has read `<1.11.1` through four releases. Users of the C extension should note the effect of reviving it: `ext-maxminddb` is a Composer platform package, so this release conflicts with an older compiled extension and `composer update` will require upgrading the two together. GitHub #266.
  • zephir_parser 2.8.0
    ### Added - Support PHP attribute syntax on every declaration PHP allows for a class member: `#[Attr]`, `#[Attr(1, "s", key: "v")]` and `#[A, B(2)]` on a class, interface, trait, function, property, class constant, method and parameter (including closure and interface-method parameters). The host node gains an `attributes` key, appended last and omitted entirely when the declaration carries none, so every node that parsed before keeps its exact shape. `#[A] #[B]` and `#[A, B]` produce the same flat list, since the grouping carries no meaning in PHP either. Arguments reuse the call-argument non-terminal, so a named argument (`key: expr`) needs no special form and the grammar accepts more than a constant expression, leaving the compiler to name the sub-expression it cannot fold. The canonical order is docblock then attributes; the reverse is tolerated ([zephir-lang/zephir#2466](https://github.com/zephir-lang/zephir/issues/2466)).

    Changed

    • #[ is a new token. A bare # remains a scanner error, and #[ inside a string, a comment, a docblock or a %{ ... }% cblock is still part of that literal.
    • An attribute named after one of Zephir's case-insensitive keywords is accepted for the eleven that are plausible attribute names (Deprecated, Final, Internal, Readonly, Static, Default, Case, Empty, Void, Reverse, Inline) and normalized to that canonical spelling. A keyword whose terminal matches two spellings, such as float, has no such rule and must be written qualified.
  • yac 2.4.2
    - String values are decoded straight into the zend_string handed back to PHP, no second copy per read - Copying a value and checksumming it are a single pass on writes as well as reads - The next probe slot is prefetched while the current one's lock, load and compare are in flight - Faster argument parsing for add/set/get/delete/dump - dump() builds its result array in bulk instead of one insert per entry - Overwriting an entry whose value outgrew its block skips the checksum of the block being replaced - CRC-32C picks its implementation by probing the CPU at runtime, so a binary built with -msse4.2 still runs on older hardware - Fixed get() crashing under concurrency: find() bumped the hit count and access time without holding the slot, overwriting the type flag a concurrent write had just published - flush() now takes every slot before clearing the table; it could previously land mid-publish and leave a slot permanently unusable - dump() returns an empty result while a flush() is in progress instead of reporting half-cleared slots - Fixed a wild-pointer read in the block-value guard of find() - Fixed dump() on PHP older than 7.4 - Fixed the packaged tarball missing storage/crc, which made it fail to build
  • datadog_trace 1.25.1
    ## All products ### Fixed - Fix SSI MSHUTDOWN on PHP 7.3 with opcache #4169

    Tracer

    Fixed

    • Set ZEND_ENABLE_STATIC_TSRMLS_CACHE=1 on windows as well for windows ZTS builds #4172
    • Fix #4163: broken frankenphp shutdown signal on musl #4167

    Internal

    • Remove any dependency on aws-lc-sys #4170

    Profiling

    Fixed

    • Fix IO/allocation sampling intervals #4159

    AppSec

    Fixed

    • Use MetricType::Distribution for RASP_RULE_DURATION_DIST #4093
    • Do not panic when WAF arrays exceed 2^16-1 elements DataDog/libddwaf-rust#28
tagged:

Link:

Community News:
Latest PECL Releases (09.08.2026)
Sep 08, 2026 @ 08:05:20

Latest PECL Releases:

  • gRPC 1.84.0RC1
    - gRPC Core 1.84.0 update

  • datadog_trace 1.25.0
    ## All products ### Added - Support the stable OpenTelemetry `deployment.environment.name` resource attribute, mapped to `DD_ENV` (in addition to the legacy `deployment.environment`) #4148

    Internal

    • Exclude DD_API_KEY and OTLP exporter header values from configuration telemetry #3961

    Tracer

    Changed

    • Add a 1 MB size limit to Dynamic Instrumentation capture snapshots #4126

    Fixed

    • Fix missing/mis-tagged drupal.theme.render spans on Drupal >= 11.3 and under early-returning renders #4145
    • Fix sidecar reconnection error handling DataDog/libdatadog#2463
    • Fix a sidecar listening-socket leak across forks DataDog/libdatadog#2447

    Internal

    • Reduce reconnect overhead for periodic background HTTP requests in the sidecar (telemetry/trace flushes) DataDog/libdatadog#2440
    • Reduce the number of HTTP requests sent for shutdown telemetry DataDog/libdatadog#2435
    • Feature Flag Evaluation: support arbitrary semver version formats and add serial-id tracking to exposure events DataDog/libdatadog#2413, DataDog/libdatadog#2402
    • Improve crash-report accuracy by filtering stack frames above the faulting frame DataDog/libdatadog#2428
    • Fix -flto -ffat-lto-objects builds DataDog/libdatadog#2460

    Profiling

    Changed

    • Improve profiler throughput by ~1% by gating debug-only runtime cache stats behind a build feature #4130

    Fixed

    • Restore I/O GOT hooks on module shutdown #4154

    Internal

    • Align zstd compression behavior across targets in the profiler's uploader DataDog/libdatadog#2400

    AppSec

    Internal

    • Move appsec communication onto the sidecar; the appsec helper is now built into the sidecar instead of as a separate binary, and the legacy C++ helper is removed #3725
  • mongodb 1.21.9
    **Full Changelog**: https://github.com/mongodb/mongo-php-driver/compare/1.21.8...1.21.9
  • mongodb 2.5.2
    <!-- Release notes generated using configuration in .github/release.yml at 2.5.2 -->

    Full Changelog: https://github.com/mongodb/mongo-php-driver/compare/2.5.1...2.5.2

  • mongodb 1.21.8
    ## What's Changed * Fix release workflow failing on root-owned git objects by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2066 * Document `phpize --clean` in build instructions by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2074 * Upgrade libmongoc to 1.30.9 by @paulinevos in https://github.com/mongodb/mongo-php-driver/pull/2077 * PHPC-2744 Fix dependency issue by @paulinevos in https://github.com/mongodb/mongo-php-driver/pull/2081

    Full Changelog: https://github.com/mongodb/mongo-php-driver/compare/1.21.7...1.21.8

  • mongodb 2.5.0
    <!-- Release notes generated using configuration in .github/release.yml at 2.5.0 -->

    What's Changed

    • PHPC-2753 Add link to ECR log-in by @kevinAlbs in https://github.com/mongodb/mongo-php-driver/pull/2055
    • Merge v2.4 into v2.x by @mongodb-drivers-pr-bot[bot] in https://github.com/mongodb/mongo-php-driver/pull/2058
    • PHPC-2751: Upgrade libmongoc to 2.5.0 by @paulinevos in https://github.com/mongodb/mongo-php-driver/pull/2054
    • Bump tests/drivers-evergreen-tools from e86753e to c70d29e by @dependabot[bot] in https://github.com/mongodb/mongo-php-driver/pull/2053
    • Merge v2.4 into v2.x by @mongodb-drivers-pr-bot[bot] in https://github.com/mongodb/mongo-php-driver/pull/2065
    • Update package.xml maintainers list by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2067
    • Fix release workflow failing on root-owned git objects by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2066
    • Merge v2.4 into v2.x by @mongodb-drivers-pr-bot[bot] in https://github.com/mongodb/mongo-php-driver/pull/2071
    • PHPC-2754: Update libmongocrypt to 1.20.3 by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2072
    • Merge v2.4 into v2.x by @mongodb-drivers-pr-bot[bot] in https://github.com/mongodb/mongo-php-driver/pull/2073
    • PHPC-2756: Upgrade libmongoc to 2.5.1 by @paulinevos in https://github.com/mongodb/mongo-php-driver/pull/2075

    New Contributors

    • @kevinAlbs made their first contribution in https://github.com/mongodb/mongo-php-driver/pull/2055

    Full Changelog: https://github.com/mongodb/mongo-php-driver/compare/2.4.1...2.5.0

  • yac 2.4.1
    - Integrity-check every value with CRC-32C on read: three interleaved hardware chains for values over 1KB on x86-64/ARM64, sliced-by-8 software table elsewhere - Eviction rework: separate expired sweep, victims picked by remaining ttl (ties fall to least hit), corrupt blocks tombstoned on find - A single MurmurHash64A drives home slot and probe stride (two hashes before) - hits/miss accumulated per process and folded once at request end, off the shared-counter hot path - Default memory raised: keys 4M to 8M, values 32M to 64M; compression on by default at 4K - Fixed a refcount leak on the multi-get $default - Entries failing to decompress are now invalidated instead of being evicted over and over - Fixed crc sampling and the decompression check - Fixed spurious kicks - Fixed the JSON serializer decoding from an unterminated buffer - Fixed info() folding miss counts into the hits counter
tagged:

Link:

Community News:
Latest PECL Releases (09.01.2026)
Sep 01, 2026 @ 08:05:19

Latest PECL Releases:

  • protobuf 5.36.1
    * See github.com/protocolbuffers/protobuf/releases/tag/v36.1 for release notes.

  • gRPC 1.83.1
    - gRPC Core 1.83.1 update
  • gRPC 1.82.2
    - gRPC Core 1.82.2 update
  • mongodb 1.21.7
    ## What's Changed * Update package.xml maintainers list by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2067

    Full Changelog: https://github.com/mongodb/mongo-php-driver/compare/1.21.6...1.21.7

  • mongodb 2.4.1
    <!-- Release notes generated using configuration in .github/release.yml at 2.4.1 -->

    What's Changed

    • PHPC-2742: Bump libmongocrypt to 1.20.2 by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2051
    • PHPC-2755: Fix test suite failures with PHP 8.6 by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2056
    • PHPC-2745: Reject null bytes in namespaces and periods in database names [v2.4] by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2060
    • PHPC-2745: Reject null bytes in namespaces and periods in database names [v1.21] by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2059
    • Bump drivers-github-tools action to v3 in release workflows by @GromNaN in https://github.com/mongodb/mongo-php-driver/pull/2063
    • Merge v2.4 into v2.x by @mongodb-drivers-pr-bot[bot] in https://github.com/mongodb/mongo-php-driver/pull/2061

    Full Changelog: https://github.com/mongodb/mongo-php-driver/compare/2.4.0...2.4.1

  • yac 2.4.0
    - Embed small scalars directly in the hash slot, avoiding value allocations for tiny entries - Switch compression from FastLZ to LZ4 (better ratio and speed) - get() accepts an optional $default argument (returned on miss instead of NULL) - dump() gains an $offset parameter and reports hits, atime, embedded and c_len per entry - Per-entry hit counters and start_time exposed in info()/dump() - Multi-get omits missing keys (filled with $default when given) instead of false placeholders - Field-by-field slot commits and spinlock backoff (pause/yield) reduce contention overhead - Fixed a startup hang when values_memory_size is below the 4M segment minimum - Fixed Windows shared memory cleanup (view unmapped exactly once) - Fixed valgrind-reported leaks and uninitialized reads (MINFO output, compression error paths)
  • phalcon 5.20.3
    Full changelog can be found at: https://github.com/phalcon/cphalcon/blob/master/CHANGELOG-5.0.md
  • phalcon 5.20.2
    Full changelog can be found at: https://github.com/phalcon/cphalcon/blob/master/CHANGELOG-5.0.md
tagged:

Link:

Community News:
Latest PECL Releases (08.11.2026)
Aug 11, 2026 @ 08:05:21

Latest PECL Releases:

  • taint 3.0.0
    - Support PHP 8.0 up to 8.5

    • Dropped PHP 7 support (use taint 2.1.x for PHP 7.x)
    • Propagate the taint mark through the frameless call fast paths (PHP 8.4+)
    • Extended sink coverage (see README for the full list)
  • sqlsrv 5.13.3
    Added - Windows support for installing the drivers with PIE (the PHP Installer for Extensions). PIE-based installation, introduced for Linux and macOS in 5.13.2, is now also available on Windows: `pie install microsoft/sqlsrv` and `pie install microsoft/pdo_sqlsrv`.

    Limitations

    • No support for inout / output params when using sql_variant type
    • No support for inout / output params when formatting decimal values
    • In Linux and macOS, setlocale() only takes effect if it is invoked before the first connection. Attempting to set the locale after connecting will not work
    • Always Encrypted requires MS ODBC Driver 17+
      • Only Windows Certificate Store and Azure Key Vault are supported. Custom Keystores are not yet supported
      • Issue #716 - With Always Encrypted enabled, named parameters in subqueries are not supported
      • Issue #1050 - With Always Encrypted enabled, insertion requires the column list for any tables with identity columns
      • Always Encrypted limitations

    Known Issues

    • Connection pooling on Linux or macOS is not recommended with unixODBC < 2.3.7
    • When pooling is enabled in Linux or macOS
      • unixODBC <= 2.3.4 (Linux and macOS) might not return proper diagnostic information, such as error messages, warnings and informative messages
      • due to this unixODBC bug, fetch large data (such as xml, binary) as streams as a workaround. See the examples here
  • pdo_sqlsrv 5.13.3
    Added - Windows support for installing the drivers with PIE (the PHP Installer for Extensions). PIE-based installation, introduced for Linux and macOS in 5.13.2, is now also available on Windows: `pie install microsoft/sqlsrv` and `pie install microsoft/pdo_sqlsrv`.

    Limitations

    • No support for inout / output params when using sql_variant type
    • No support for inout / output params when formatting decimal values
    • In Linux and macOS, setlocale() only takes effect if it is invoked before the first connection. Attempting to set the locale after connecting will not work
    • Always Encrypted requires MS ODBC Driver 17+
      • Only Windows Certificate Store and Azure Key Vault are supported. Custom Keystores are not yet supported
      • Issue #716 - With Always Encrypted enabled, named parameters in subqueries are not supported
      • Issue #1050 - With Always Encrypted enabled, insertion requires the column list for any tables with identity columns
      • Always Encrypted limitations

    Known Issues

    • Connection pooling on Linux or macOS is not recommended with unixODBC < 2.3.7
    • When pooling is enabled in Linux or macOS
      • unixODBC <= 2.3.4 (Linux and macOS) might not return proper diagnostic information, such as error messages, warnings and informative messages
      • due to this unixODBC bug, fetch large data (such as xml, binary) as streams as a workaround. See the examples here
  • yaconf 1.1.3
    - Fixed memory leak with PHP 8.1 - Fixed garbage value being returned when an INI file is unreadable - Fixed Yaconf::get() with paths deeper than a scalar value - Fixed section inheritance from numeric section names - Fixed fatal error and a memory leak in the startup scan
  • yar 2.4.0
    - Added yar.ssl_verify to make TLS certificate verification configurable - Kept persistent curl connections in the persistent resource list - Rejected non-public methods in the server dispatcher - Fixed use-after-free (dangling offset) in REALLOC_BUF_IF_EXCEED - Fixed size_t underflow when request body is shorter than the protocol header - Hardened protocol parsing: body length clamping, bounds checks, payload type checks - Fixed YAR_OPT_PROXY passing the connect timeout to CURLOPT_PROXY - Fixed issue #175 where Yar_Server::Info returns garbled output.
tagged:

Link:

Community News:
Latest PECL Releases (08.04.2026)
Aug 04, 2026 @ 08:05:20

Latest PECL Releases:

  • protobuf 5.36.0RC2
    * See github.com/protocolbuffers/protobuf/releases/tag/v36.0-rc2 for release notes.

  • sqlsrv 5.13.2
    Added - The drivers can now be installed with PIE (the PHP Installer for Extensions), the official replacement for the now-deprecated PECL: `pie install microsoft/sqlsrv` and `pie install microsoft/pdo_sqlsrv`.

    Security

    • Fixed SQL injection in PDO::lastInsertId($name) (CWE-89). The sequence-name lookup previously interpolated the caller-supplied name directly into the query text, allowing injection of arbitrary Transact-SQL. The name is now passed to a parameterized query and bound with the connection encoding, so it is always treated as a literal value. This also fixes lookups for sequence names containing non-ASCII characters (PR #1673)
    • Fixed silent truncation of binary parameters containing embedded NUL (0x00) bytes when using PDO emulated prepares with PDO::SQLSRV_ENCODING_BINARY (CWE-626). All bytes are now encoded (PR #1675)

    Fixed

    • Fixed a Windows thread-safe (ZTS) shared build link failure (unresolved external symbol LNK2001 on _tsrm_ls_cache) when building the extensions as shared DLLs (PR #1674)
    • Fixed stale unixODBC INI caching on Linux and macOS by clearing the unixODBC INI cache at module shutdown (PR #1667)
    • Fixed an AddressSanitizer One Definition Rule (ODR) violation reported when both the sqlsrv and pdo_sqlsrv extensions are loaded together (PR #1659)
    • Addressed CodeQL static-analysis findings (PR #1615)

    Limitations

    • No support for inout / output params when using sql_variant type
    • No support for inout / output params when formatting decimal values
    • In Linux and macOS, setlocale() only takes effect if it is invoked before the first connection. Attempting to set the locale after connecting will not work
    • Always Encrypted requires MS ODBC Driver 17+
      • Only Windows Certificate Store and Azure Key Vault are supported. Custom Keystores are not yet supported
      • Issue #716 - With Always Encrypted enabled, named parameters in subqueries are not supported
      • Issue #1050 - With Always Encrypted enabled, insertion requires the column list for any tables with identity columns
      • Always Encrypted limitations

    Known Issues

    • Connection pooling on Linux or macOS is not recommended with unixODBC < 2.3.7
    • When pooling is enabled in Linux or macOS
      • unixODBC <= 2.3.4 (Linux and macOS) might not return proper diagnostic information, such as error messages, warnings and informative messages
      • due to this unixODBC bug, fetch large data (such as xml, binary) as streams as a workaround. See the examples here
  • pdo_sqlsrv 5.13.2
    Added - The drivers can now be installed with PIE (the PHP Installer for Extensions), the official replacement for the now-deprecated PECL: `pie install microsoft/sqlsrv` and `pie install microsoft/pdo_sqlsrv`.

    Security

    • Fixed SQL injection in PDO::lastInsertId($name) (CWE-89). The sequence-name lookup previously interpolated the caller-supplied name directly into the query text, allowing injection of arbitrary Transact-SQL. The name is now passed to a parameterized query and bound with the connection encoding, so it is always treated as a literal value. This also fixes lookups for sequence names containing non-ASCII characters (PR #1673)
    • Fixed silent truncation of binary parameters containing embedded NUL (0x00) bytes when using PDO emulated prepares with PDO::SQLSRV_ENCODING_BINARY (CWE-626). All bytes are now encoded (PR #1675)

    Fixed

    • Fixed a Windows thread-safe (ZTS) shared build link failure (unresolved external symbol LNK2001 on _tsrm_ls_cache) when building the extensions as shared DLLs (PR #1674)
    • Fixed stale unixODBC INI caching on Linux and macOS by clearing the unixODBC INI cache at module shutdown (PR #1667)
    • Fixed an AddressSanitizer One Definition Rule (ODR) violation reported when both the sqlsrv and pdo_sqlsrv extensions are loaded together (PR #1659)
    • Addressed CodeQL static-analysis findings (PR #1615)

    Limitations

    • No support for inout / output params when using sql_variant type
    • No support for inout / output params when formatting decimal values
    • In Linux and macOS, setlocale() only takes effect if it is invoked before the first connection. Attempting to set the locale after connecting will not work
    • Always Encrypted requires MS ODBC Driver 17+
      • Only Windows Certificate Store and Azure Key Vault are supported. Custom Keystores are not yet supported
      • Issue #716 - With Always Encrypted enabled, named parameters in subqueries are not supported
      • Issue #1050 - With Always Encrypted enabled, insertion requires the column list for any tables with identity columns
      • Always Encrypted limitations

    Known Issues

    • Connection pooling on Linux or macOS is not recommended with unixODBC < 2.3.7
    • When pooling is enabled in Linux or macOS
      • unixODBC <= 2.3.4 (Linux and macOS) might not return proper diagnostic information, such as error messages, warnings and informative messages
      • due to this unixODBC bug, fetch large data (such as xml, binary) as streams as a workaround. See the examples here
  • phalcon 5.18.0
    Full changelog can be found at: https://github.com/phalcon/cphalcon/blob/master/CHANGELOG-5.0.md
  • datadog_trace 1.23.3
    ## Profiler ### Fixed - Restore OPcache restart hook on shutdown (#4076)
  • datadog_trace 1.23.2
    ## Tracer ### Fixed - Prevent application error handlers from replacing successful OpenFeature evaluation values with code defaults #4071
tagged:

Link:


Trending Topics: