<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// This part of the code is unrelated to the article content, for demonstration only</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Initializing connection...\n"</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
<p></span># How to efficiently handle and receive large data streams after pfsockopen connection?<span></p>
<p>In PHP, <code>pfsockopen
Non-blocking mode is emphasized here because blocking mode may cause the program to hang while reading large data streams, affecting other tasks.
When receiving large data, reading all data at once can cause memory overflow. The proper way is to read data in chunks:
<span><span><span class="hljs-variable">$bufferSize</span></span><span> = </span><span><span class="hljs-number">8192</span></span><span>; </span><span><span class="hljs-comment">// 8KB buffer size</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>)) {
</span><span><span class="hljs-variable">$chunk</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>, </span><span><span class="hljs-variable">$bufferSize</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$chunk</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-comment">// Handle read error</span></span><span>
</span><span><span class="hljs-keyword">break</span></span><span>;
}
</span><span><span class="hljs-variable">$data</span></span><span> .= </span><span><span class="hljs-variable">$chunk</span></span><span>;
</span><span><span class="hljs-comment">// Process each data chunk, such as writing to file, parsing piece by piece, etc.</span></span><span>
}
</span></span>
This approach allows data to be processed while reading, reducing memory usage.
The default buffer size and timeout may not be suitable for large data transmission. You can use stream_set_timeout to set an appropriate timeout:
<span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>); </span><span><span class="hljs-comment">// Set 10 seconds timeout</span></span><span>
</span></span>
And balance speed and memory consumption by adjusting the buffer size (e.g., increasing the length read by fread).
If the data stream is text or structured data, consider using stream filters for decoding or decompression to save transmission time and bandwidth. For example:
<span><span><span class="hljs-title function_ invoke__">stream_filter_append</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>, </span><span><span class="hljs-string">"zlib.inflate"</span></span><span>, STREAM_FILTER_READ);
</span></span>
This way, you can read decompressed data directly.
After use, properly close the connection to avoid resource leaks:
<span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
</span></span>
Especially in persistent connection scenarios, it is essential to release resources promptly to prevent the connection pool from becoming overloaded.
When using pfsockopen to handle large data streams, the key points are:
Use non-blocking mode and reasonable buffer size;
Read data in chunks to avoid memory overflow;
Combine stream filters to improve data processing efficiency;
Set reasonable timeouts to prevent blocking;
Close connections promptly after finishing.
By applying these methods, PHP programs can efficiently and reliably handle and receive large data streams.
<span></span>