개발자는 PHP의 직렬화 및 비 제외 화 기능을 사용할 때 "비소화 할 수 없음"오류가 발생할 수 있습니다. 이 오류는 일반적으로 PHP가 문자열을 객체 나 배열로 성공적으로 불안정하게 할 수 없음을 나타냅니다. 이 기사는 몇 가지 일반적인 이유 와이 문제를 해결하는 방법을 다룰 것입니다.
Serialize 함수는 PHP 데이터 구조 (예 : 객체 또는 배열)를 문자열로 변환 할 수 있으며, 비소화는 문자열을 원래 데이터 구조로 다시 변환합니다. 그러나 경우에 따라 비 제시 화를 호출 할 때 다음과 유사한 오류 메시지가 발생할 수 있습니다.
Warning: unserialize(): Error at offset 0 of 2 bytes in /path/to/script.php on line 20
Cannot unserialize
이 오류는 일반적으로 다음과 같은 이유로 인해 발생합니다.
가장 일반적인 이유 중 하나는 직렬화 된 데이터가 변조되거나 손상 되었기 때문입니다. URL 또는 데이터베이스를 통해 데이터를 저장할 때와 같은 전송 중에 발생할 수 있습니다. 직렬화 된 데이터가 잘못 수정되면 비 제시 화는 원래 구조를 복원 할 수 없습니다.
해결책:
저장 및 전송 중에 직렬화 된 데이터가 손상되거나 수정되지 않도록하십시오. URL 매개 변수를 사용하여 직렬화 된 데이터를 전달하는 경우 데이터 변경을 유발하는 특수 문자 (예 : & , = ,? )가 있는지 확인하십시오.
URL을 통해 직렬화 된 데이터를 전달하는 경우 UrlenCode를 사용하여 직렬화 된 문자열을 인코딩하면 수신기가 URLDECODE를 사용하여 특수 문자 간섭을 피하기 위해 디코딩합니다.
// 전송 전에 사용하십시오 urlencode 코딩
$serialized_data = urlencode(serialize($data));
// 수신 후 디코딩하고 사제화합니다
$data = unserialize(urldecode($serialized_data));
직렬화 된 객체에 클래스가 포함되어 있고 사막화 중에 클래스를 찾을 수없는 경우, PHP는 "비교 할 수 없음"오류를 던집니다. 예를 들어, 클래스의 파일이 올바르게 포함되지 않았거나 클래스 이름이 변경되었을 수 있습니다.
해결책:
특히 객체를 사용할 때 필요한 모든 클래스가 올바르게로드되어 있는지 확인하십시오. spl_autoload_register를 사용하여 클래스 파일을 자동으로로드 할 수 있습니다.
클래스의 이름이 바뀌거나 제거 된 경우 직렬화 된 데이터의 버전 및 구조를 확인하여 클래스 이름이 사막화 중에 일관성을 유지하는지 확인하십시오.
// 자동으로 클래스를로드합니다
spl_autoload_register(function ($class) {
include 'path/to/classes/' . $class . '.php';
});
직렬화 된 데이터가 다른 PHP 버전간에 전송되면 일부 PHP 버전간에 비 호환성이있을 수 있습니다. 특히, PHP 7 및 PHP 8은 객체 직렬화를 약간 수정하여 사막화가 실패 할 수 있습니다.
해결책:
PHP 버전이 모든 런타임 환경에서 일관되거나 사막화 전에 데이터의 적절한 처리를 고려하십시오 (예 : 호환 형식으로 변환).
PHP 버전을 제어 할 수없는 경우 직렬화 대신 JSON 형식을 사용해 볼 수 있습니다.
// 사용 JSON 대안 serialize
$json_data = json_encode($data);
// 사용 json_decode 대안 unserialize
$data = json_decode($json_data, true);
다른 문자 인코딩 시스템간에 직렬화 된 데이터를 전달하면 일관되지 않은 문자 세트가 발생할 수 있습니다. 이것은 일반적으로 비소화가 데이터를 올바르게 해독하지 못하게합니다.
해결책:
특히 데이터를 전송할 때 데이터의 문자 인코딩이 일관성이 있는지 확인하십시오. 인코딩 문제를 피하기 위해 데이터를 저장할 때 UTF-8과 같은 통합 문자 세트 (예 : UTF-8)를 사용할 수 있습니다.
// 设置字符코딩为 UTF-8
mb_internal_encoding("UTF-8");
직렬화 된 객체에 PHP 리소스 유형 (예 : 데이터베이스 연결, 파일 핸들 등)이 포함 된 경우, 이러한 리소스는 사막화 중에 복원 할 수 없으므로 오류가 발생할 수 있습니다.
해결책:
객체를 직렬화하기 전에 객체에서 리소스 멤버를 제거하거나 __sleep 및 __wakeup 방법을 구현하여 리소스 릴리스 및 복구를 처리하십시오.
class MyClass {
private $file;
public function __sleep() {
// 직렬화 전에 자원을 제거하십시오
unset($this->file);
return ['file']; // 직렬화 해야하는 속성을 반환합니다
}
public function __wakeup() {
// 사막화 후 자원을 다시 열어줍니다
$this->file = fopen('path/to/file', 'r');
}
}
"비소화 할 수 없음"오류가 발생하면 일부 디버깅 기술을 사용하여 문제를 해결할 수 있습니다.
직렬화 된 데이터의 무결성을 확인하십시오. 직렬화 된 문자열을 출력하여 완전하고 잘린 상태가 아닌지 확인하십시오.
오류보고 활성화 : error_reporting (e_all) 및 ini_set ( 'display_errors', 1)을 사용하여 가능한 프롬프트를 볼 수있는 상세 오류보고를 활성화합니다.
var_dump 로 데이터를 확인하십시오 : 사막화하기 전에 Var_dump를 사용하여 데이터의 형식과 내용을 확인하여 기대치를 충족하는지 확인하십시오.
var_dump($serialized_data);
" 비소화 할 수 없음 "오류는 일반적으로 직렬화 된 데이터의 무결성, PHP 버전 비 호환성, 클래스 파일 누락 또는 문자 인코딩 문제와 관련이 있습니다. 이러한 일반적인 원인을 하나씩 확인하고 해당 솔루션을 취함으로써 문제를 해결할 수 있습니다. 조건이 허용되는 경우, 특히 교차 플랫폼 또는 버전에서 직렬화 및 사제화 대신 JSON 사용을 고려하여 잠재적 인 호환성 문제를 피할 수 있습니다.