Preserve readiness in hooked curl_multi_select
Native PHP uses curl_multi_select() only to wait for socket readiness; curl_multi_exec() drives the transfer. Swoole instead called curl_multi_socket_all() at the start of curl_multi_select(). If data arrived between exec and select, that call could consume the ready data and run its write callback, then suspend until another event or the requested timeout. The caller could not consume the data already delivered to its buffer.
This moves the existing all-socket drive and socket-state synchronization into curl_multi_exec(). curl_multi_select() now only waits for reactor readiness. This also removes the redundant transfer-driving pass that previously occurred once in exec and again in each normal exec/select cycle.
For Hypervel, the defect can delay an SSE event, JSON line, or final streamed response chunk for up to its one-second select interval. The synchronized Hypervel regression reproduces the native behavior through the streaming transport.
The new Swoole PHPT sends one byte after exec and withholds the final byte until select returns. It fails on unchanged 6.1 because select reports 0, and passes with this fix by reporting readiness and preserving the complete body. The unskipped Hypervel regression also fails unchanged and passes fixed. The locally runnable tests/swoole_curl suite has no other changed result; two existing expected-fatal ProcessManager fixtures do not terminate in this local runner on either tree and remain covered by CI.