PHP 네트워크 프로그래밍에서 Fwrite를 사용하여 연결하고 데이터를 쓰는 데 Socket_addrinfo_connect 기능을 사용하는 것이 일반적인 네트워크 통신 방법 중 하나입니다. 데이터 전송의 성능을 향상시키기 위해서는 완충 기술을 합리적으로 활용하는 것이 특히 중요합니다. 이 기사에서는 fwrite 와 함께 Socket_addrinfo_connect 함수에서 버퍼를 사용하는 방법을 자세히 설명하고 관련 모범 사례를 요약합니다.
socket_addrinfo_connect 는 주소 정보를 기반으로 소켓 연결을 수행하며 종종 TCP 연결에 사용되는 기능입니다. 연결이 성공한 후에는 일반적으로 Fwrite를 통해 소켓 스트림에 데이터를 작성합니다.
Fwrite 자체에는 버퍼링 메커니즘이 있습니다. 글을 쓸 때는 먼저 PHP 출력 버퍼에 씁니다. 버퍼가 가득 차 있거나 새로 고침 될 때만 수동으로 데이터를 기본 소켓으로 전송합니다.
많은 수의 작은 데이터를 작성하기 위해 Fwrite를 직접 호출하면 많은 수의 작은 패킷이 생겨 "패킷 조각화"가 발생하여 전송 효율에 영향을 미치고 대기 시간 및 CPU로드를 증가시킵니다.
버퍼를 사용하여 :
fwrite 라고 부르는 횟수를 줄입니다
여러 저작물을 하나의 상부 쓰기로 병합하십시오
시스템 통화 오버 헤드를 줄입니다
TCP 트래픽 활용도를 향상시킵니다
<?php
$addrinfo = socket_addrinfo_lookup('m66.net', '80', AF_UNSPEC, SOCK_STREAM);
$socket = socket_addrinfo_connect($addrinfo);
if ($socket === false) {
die("연결이 실패했습니다");
}
?>
모든 데이터를 메모리 버퍼 (문자열 또는 기타 캐시 메커니즘)에 먼저 쓰고 한 번에 FWRRITE 로 보내는 것이 좋습니다.
<?php
$buffer = '';
// 여러 데이터 스티칭을 시뮬레이션합니다
$dataPieces = ['Hello, ', 'this is ', 'a buffered ', 'write example.'];
foreach ($dataPieces as $piece) {
$buffer .= $piece;
}
// 한 번 쓰십시오socket
fwrite($socket, $buffer);
?>
데이터가 매우 크면 과도한 메모리 사용이 증가하는 것을 방지하기 위해 쓰기를 차단하기 위해 고정 버퍼 크기를 설정하는 것이 좋습니다.
<?php
$bufferSize = 8192; // 8KB완충기
$offset = 0;
$length = strlen($buffer);
while ($offset < $length) {
$chunk = substr($buffer, $offset, $bufferSize);
$written = fwrite($socket, $chunk);
if ($written === false) {
die("쓰기 실패");
}
$offset += $written;
}
?>
병합 쓰기 데이터 : 시스템 통화를 줄이기 위해 여러 하위 쓰기를 하나의 상단 쓰기로 병합하십시오.
적절한 버퍼 크기를 사용하십시오 . 메모리 압력을 피하기 위해 네트워크 환경 및 서버 성능에 따라 버퍼 크기를 조정하십시오.
버퍼를 제 시간에 플러시하십시오 : 작성 후 Fflush ()를 호출하여 버퍼를 새로 고칠 수 있으므로 데이터가 제 시간에 전송되도록 할 수 있습니다.
오류 처리 : FWRRITE 의 반환 값을 확인하여 쓰기 실패 및 부분 쓰기를 처리합니다.
비 블로킹 쓰기는 선택과 결합 : 고성능 수요 시나리오에서는 차단을 피하고 대기하고 효율성을 향상시키기 위해 비 블로킹 소켓 및 Stream_Select를 사용하십시오.
지속적인 연결 사용 : 자주 연결 연결을 피하고 연결 설정의 오버 헤드를 줄입니다.
네트워크 계층 최적화 : TCP_NODELAY를 켜거나 TCP 버퍼 크기를 조정하십시오 (PHP 환경 및 기본 소켓 지원에 따라 다름).