PHP에서 Serialize 함수는 객체, 배열 등과 같은 데이터 구조를 문자열 형식으로 변환하여 데이터베이스, 파일 시스템 또는 기타 지속적인 스토리지에 저장 될 수 있도록 사용됩니다. Desserialize ( unserialize ) 문자열을 원래 데이터 구조로 다시 변환합니다. 객체 상태를 저장하기 위해 Serialize를 사용하는 것은 특히 사용자 세션, 캐시 또는 다른 페이지간에 데이터를 전달 해야하는 경우 일반적인 기술입니다.
이 기사는 PHP의 직렬화 기능을 통해 객체 상태를 저장하는 방법에 대해 논의하고 객체를 지속시킬 때주의를 기울일 것들을 탐색합니다.
Serialize 함수는 PHP 변수를 매개 변수로 사용하여 저장 및 전송할 수있는 문자열로 변환합니다. 예를 들어, 간단한 객체의 경우 데이터베이스 또는 파일로 직렬화하여 저장 한 다음 사로화하여 객체의 원래 상태를 복원 할 수 있습니다.
<?php
// 간단한 클래스를 정의하십시오
class User {
public $name;
public $email;
public function __construct($name, $email) {
$this->name = $name;
$this->email = $email;
}
}
// 객체를 만듭니다
$user = new User("John Doe", "[email protected]");
// 객체를 직렬화하십시오
$serializedUser = serialize($user);
// 직렬화 된 데이터를 파일 또는 데이터베이스에 저장합니다
file_put_contents("user_data.txt", $serializedUser);
// 사막화 과정을 시뮬레이션하십시오
$retrievedData = file_get_contents("user_data.txt");
$unserializedUser = unserialize($retrievedData);
// 출력 사형화 된 물체
echo "Name: " . $unserializedUser->name . "<br>";
echo "Email: " . $unserializedUser->email;
?>
정의 객체 : 먼저 사용자 클래스가 정의되고 사용자 이름과 이메일이 포함 된 인스턴스 사용자가 생성됩니다.
Serialize Object : Serialize ($ user)를 호출하여 Object $ user를 문자열로 변환합니다.
데이터 저장 : 직렬화 된 데이터는 파일 시스템 또는 데이터베이스에 저장할 수 있습니다. 여기서는 user_data.txt 파일에 저장합니다.
사제화 : 비 시교 기능을 통해 데이터를 물체로 복원합니다.
출력 데이터 : 객체를 실조시켜 속성에 액세스 할 수 있습니다.
직렬화 함수는 매우 편리하지만 개체를 지속시킬 때 주목해야 할 사항이 있습니다.
객체가 내부적으로 다른 객체에 의존하거나 객체의 클래스가 수정되면, 사막화 중에 문제가 발생할 수 있습니다. 특히 클래스의 구조가 변경되면 비 서식 화이 객체 상태를 올바르게 복원하지 않아 오류가 발생할 수 있습니다.
사제화 운영에는 특정 보안 위험이 있습니다. 악의적 인 사용자는 가짜 직렬화 된 문자열을 구성하여 PHP가 안전하지 않은 코드를 실행하고 원격 코드 실행 취약점을 트리거 할 수 있습니다. 이를 피하기 위해 다음과 같은 조치를 취할 수 있습니다.
특히 데이터 구조가 더 간단한 경우 Serialize 및 Unserialize 대신 JSON_ENCODE 및 JSON_DECODE를 사용하십시오.
사형화 된 데이터는 신뢰할 수있는 출처에서 나오도록 엄격하게 검증되었습니다.
다른 버전의 PHP에서, 특히 클래스의 내부 구현이 변경 될 때 직렬화 및 비 서식 화가 다를 수 있습니다. 따라서 애플리케이션에서이를 사용할 때 버전 업데이트의 영향을 고려하고 버전 호환성을 보장해야합니다.
직렬화 된 문자열은 원래 데이터보다 더 많은 저장 공간을 차지할 수 있습니다. 많은 수의 객체를 저장할 때는 직렬화 데이터의 공간 오버 헤드를 고려해야합니다.
직렬화 된 데이터를 데이터베이스에 저장할 때는 필드 길이 제한에 특별한주의를 기울여야합니다. 예를 들어, 텍스트 또는 Blob 유형 필드는 대형 직렬화 된 데이터 세그먼트를 저장할 수 있지만 더 큰 객체의 경우 페이징 또는 기타 스토리지 전략을 고려해야 할 수도 있습니다.