현재 위치: > 최신 기사 목록> 직렬화를 사용할 때 발생하는 일반적인 경고 및 오류가 발생합니다

직렬화를 사용할 때 발생하는 일반적인 경고 및 오류가 발생합니다

gitbox 2025-05-27

PHP의 직렬화 기능은 PHP의 데이터 구조 (예 : 배열 및 객체)를 저장 또는 전송할 수있는 문자열 형식으로 변환하는 데 사용됩니다. 그러나 모든 기능과 마찬가지로 Serialize는 사용시 일부 경고 및 오류가 발생할 수 있습니다. 이 기사는 직렬화 기능을 사용할 때 일반적인 문제를 탐구하고 피하기위한 제안을 제공합니다.

1. 정의되지 않은 클래스를 사용하는 동안 오류가 발생했습니다

PHP는 정의되지 않은 클래스가 포함 된 객체를 직렬화하려고 할 때 오류를 유발합니다. 예를 들어 다음 코드 :

 class TestClass {
    public $name = "GitBox";
}

$obj = new TestClass();
$serialized = serialize($obj);
echo $serialized;

나중에이 객체를 제조하면 PHP는 클래스 테스트 클래스 를 정의해야합니다. 그렇지 않으면 오류가 발생합니다. 구체적으로, TestClass 클래스가 코드에 정의되지 않은 경우 다음 오류 가보고됩니다.

 Warning: unserialize(): Error at offset 0 of 20 bytes in ...

해결책

이러한 오류를 피하기 위해 관련된 모든 클래스가 부식되기 전에로드되거나 포함되어 있는지 확인하십시오. 사막화하기 전에 spl_autoload_register 기능을 사용하여 클래스 파일을 자동으로로드 할 수 있습니다.

 spl_autoload_register(function ($class_name) {
    include $class_name . '.class.php';
});

이를 통해 누락 된 클래스 파일이 사막화에 자동으로로드되도록합니다.

2. 자원 유형을 직렬화 할 때의 경고

PHP의 리소스 (예 : 데이터베이스 연결, 파일 핸들 등)는 직렬화 할 수 없습니다. PHP는 리소스 직렬화를 시도 할 때 다음과 유사한 경고를보고합니다.

 Warning: serialize(): Type of property must be object or array in ...

예를 들어, 다음 코드는 다음 경고를 생성합니다.

 $fp = fopen("file.txt", "r");
$serialized = serialize($fp); // 리소스 직렬화

해결책

이 경고를 피하려면 직렬화 기능을 사용할 때 직렬화 된 리소스 유형이 아닌 객체 또는 배열인지 확인해야합니다. 직렬화 전에 변수 유형을 확인할 수 있습니다.

 if (is_resource($fp)) {
    echo "리소스 유형을 직렬화 할 수 없습니다";
} else {
    $serialized = serialize($fp);
}

3. 폐쇄 기능을 성공적으로 직렬화하지 못했습니다

PHP는 직렬화 된 클로저 (익명 함수)를 지원하지 않습니다. 폐쇄가 포함 된 객체 또는 어레이를 직렬화하려고하면 PHP가 오류를 던집니다.

 Warning: serialize(): Error at offset 0 of 20 bytes in ...

예를 들어:

 $func = function() {
    echo "Hello World";
};

$serialized = serialize($func); // 폐쇄를 직렬화하십시오

해결책

응용 프로그램이 폐쇄 기능을 저장하고 전송 해야하는 경우 클로저를 문자열로 변환하거나 폐쇄 코드를 저장하고 폐쇄 재생과 같은 다른 방법을 사용하는 것을 고려하십시오.

 $closure_code = 'function() { echo "Hello World"; }';
$serialized = serialize($closure_code); // 폐쇄를 저장하기위한 코드

4. 가능한 사산화 보안 문제

사막화 운영은 심각한 보안 취약점으로 이어질 수 있습니다. 특히 사산화 된 콘텐츠가 신뢰할 수없는 출처에서 나오는 경우. 공격자는 사막화를 사용하여 임의의 코드를 실행하여 보안 취약점을 유발할 수 있습니다. 이를 피하기 위해 다음 경고는 때때로 PHP에 나타납니다.

 Warning: unserialize(): Argument is not a valid serialized string in ...

해결책

  • 신뢰할 수있는 출처의 데이터만을 사로화합니다.

  • JSON_ENCODEJSON_DECODE를 사용하여 JSON 형식의 데이터가 더 안전하고 사막화 보안 문제를 일으키지 않기 때문에 SerializeUnserialize를 대체하십시오.

  • 직렬화가 필요한 경우, 건조 된 데이터가 확인되어야합니다. Hash_HMAC 와 같은 함수는 데이터의 무결성을 보장하는 데 사용될 수 있습니다.

5. 큰 객체를 직렬화 할 때 성능 문제

매우 큰 데이터 구조의 경우 직렬화로 인해 성능 문제가 발생할 수 있습니다. 직렬화 프로세스는 많은 수의 문자열을 생성하여 특히 메모리 제약 환경에서 메모리 소비가 증가합니다.

해결책

  • 너무 큰 데이터 구조를 통과하여 직렬화 하기 위해 데이터 구조를 분석하십시오.

  • 데이터베이스를 사용하여 큰 객체를 저장하고 한 번에 메모리에로드하지 마십시오.

  • 데이터베이스 또는 캐시 시스템 (예 : REDIS)을 사용하여 대규모 데이터 저장 및 전송을 처리하십시오.

위의 제안에 따라 PHP 직렬화 기능을 사용하여 코드의 안정성과 보안을 보장 할 때 일반적인 오류 및 경고를 피할 수 있습니다. 이 기사가 도움이되기를 바랍니다!