PHP에서는 이진 형식의 로그 파일에 데이터를 작성하면 저장 공간을 효과적으로 줄이고 읽기 성능을 향상시킬 수 있습니다. fwrite () 와 결합 된 팩 () 함수는이를 달성하는 데 중요한 도구입니다. 이 기사는 예제를 사용 하여이 두 기능을 사용하여 구조화 된 데이터를 이진 로그 파일에 작성하고 관련 기술 세부 사항을 설명하는 방법을 설명합니다.
기존 텍스트 로그와 비교하여 이진 로그의 장점은 다음과 같습니다.
보다 작곡 : 바이트 정렬을 사용하여 데이터를 저장하여 디스크 공간을 절약하십시오.
보다 효율적인 : 높은 동시성 시나리오에 적합한 빠른 읽기 및 구문 분석 속도;
보다 안전 : 로그 구조는 수동으로 수정하기 쉽지 않습니다.
물론, 단점은 가독성이 좋지 않으므로 내부적으로 또는 성능 최적화의 일부로 만 사용하는 것이 좋습니다.
Pack ()는 PHP 변수를 이진 문자열로 포장하는 데 사용됩니다. 기본 구문은 다음과 같습니다.
string pack(string $format, mixed ...$values)
여기서 $ format은 형식 문자열이며, 다음과 같은 각 값을 패키는 방법을 정의합니다.
L : 서명되지 않은 긴 정수 (4 바이트, 기계 엔지니어)
N : 서명되지 않은 긴 정수 (4 바이트, 큰 엔디 어 바이트 순서)
A : NUL 채우기 문자열
F : 단일 정밀 부동 소수점 번호 (4 바이트)
사용자 액세스 로그 기록을 예로 들어 보겠습니다. 각 레코드에는 다음 필드가 포함됩니다.
사용자 ID (4 바이트 부호없는 정수)
타임 스탬프 (4 바이트 부호없는 정수)
페이지 URL 길이 (2 바이트 부호없는 정수)
페이지 URL (가변 길이 문자열)
<?php
function write_log($user_id, $timestamp, $url) {
$fp = fopen("access.log", "ab"); // 이진 부록에서 로그 파일을 엽니 다
if (!$fp) {
die("로그 파일을 열 수 없습니다");
}
$url = parse_url($url, PHP_URL_PATH); // 경로 부분 만 기록됩니다,민감한 매개 변수를 포함하는 로그를 피하십시오
$url_length = strlen($url);
if ($url_length > 65535) {
$url = substr($url, 0, 65535); // 최대 저장소는 가능합니다2바이트 길이URL
$url_length = 65535;
}
// 패키지 고정 길이 데이터:사용자ID + 타임 스탬프 + URL길이
$header = pack("L L n", $user_id, $timestamp, $url_length);
// 로그 파일에 쓰십시오
fwrite($fp, $header);
fwrite($fp, $url);
fclose($fp);
}
// 샘플 통화
write_log(123456, time(), "https://m66.net/user/profile?id=987");
?>
위의 코드는 다음을 수행합니다.
팩 ( "ll n", ...)을 사용하여 사용자 ID, 타임 스탬프 및 URL 길이를 이진 형식으로 인코딩합니다.
fwrite ()를 사용하여 각각 헤더와 URL 본문을 작성하십시오.
각 레코드는 명확하고 소형 형식이며 후속 빠른 읽기 또는 분석에 사용할 수 있습니다.
작성 후 다음 방법을 사용하여 이러한 이진 로그를 읽고 디코딩 할 수 있습니다.
<?php
function read_logs($filename) {
$fp = fopen($filename, "rb");
while (!feof($fp)) {
$header = fread($fp, 10); // 4바이트사용자ID + 4바이트타임 스탬프 + 2바이트URL길이
if (strlen($header) < 10) break;
$data = unpack("Luser_id/Ltimestamp/nurl_len", $header);
$url = fread($fp, $data['url_len']);
echo "사용자ID: {$data['user_id']}, 시간: " . date('Y-m-d H:i:s', $data['timestamp']) . ", URL: $url\n";
}
fclose($fp);
}
// 샘플 통화
read_logs("access.log");
?>
pack () 및 fwrite () 를 통해 구조화 된 데이터를 이진 로그 파일에 효율적으로 쓸 수 있으며, 이로 인해 많은 수의 자주 액세스하는 로그 정보를 기록하는 데 적합합니다. 바이너리 로그는 직접보기가 쉽지는 않지만 시스템의 성능과 유지 관리를 향상시키기 위해 배치로 읽고 분석 할 수 있습니다.
실제 애플리케이션 에서이 방법은 사용자 행동 궤적 녹음, 인터페이스 통화 로그, 성능 분석 데이터 등과 같은 여러 시나리오로 확장 될 수 있으며, 이는 학습 할 가치가있는 효율적인 로그 처리 방법입니다.