PHP에서 Serialize 함수는 PHP 변수를 저장 또는 전송할 수있는 문자열 형식으로 변환하는 데 사용됩니다. 이 기능은 배열, 객체, 문자열, 정수 등을 포함하여 대부분의 데이터 유형을 직렬화 할 수 있습니다. 그러나 리소스 유형 (예 : 파일 핸들)의 데이터 직렬화를 시도 할 때 문제가있을 수 있습니다.
리소스 유형은 PHP의 외부 리소스를 참조하여 파일 핸들, 데이터베이스 연결 또는 컬 핸들과 같은 시스템 또는 기타 프로그램과의 상호 작용을 나타냅니다. 이러한 리소스는 일반적으로 시스템 또는 외부 응용 프로그램에 대한 참조이므로 자원을 직렬화 할 때 PHP는 필사적으로 재건하는 방법을 알 수 없습니다. 따라서 파일 핸들과 같은 리소스 유형을 직렬화 할 때는 더주의를 기울여야합니다.
리소스 유형에는 PHP 스크립트가 실행 된 후에 사라질 수있는 외부 리소스에 대한 포인터가 포함되어 있습니다. 따라서 PHP는 직렬화 된 리소스가 사막화 될 때 여전히 유효하다는 것을 보장 할 수 없습니다. 예를 들어, 파일 핸들은 운영 체제의 열린 파일을 가리 킵니다. 이 파일 핸들은 직렬화 중에 파일에 대한 실제 연결을 잃어 버리고 사막화 중에 파일을 다시 열 수 없습니다.
자원 유형을 올바르게 처리하는 두 가지 일반적인 방법이 있습니다. 리소스 유형의 직렬화를 무시하거나 직렬화 할 때 수동으로 처리합니다.
가장 쉬운 방법은 자원 유형을 직렬화하는 것입니다. 이는 파일 내용을 문자열로 저장하거나 파일 핸들 대신 파일 경로를 사용하는 등 직렬화 전에 자원 유형을 다른 데이터 구조로 바꾸면 수행 할 수 있습니다. 사막화하는 동안 파일을 다시 열거나 새 리소스를 만들 수 있습니다.
샘플 코드 :
// 파일 핸들을 파일 경로로 변환합니다
$file = fopen('/path/to/file.txt', 'r');
$data = ['file' => '/path/to/file.txt']; // 자원 대신 경로를 사용합니다
// 데이터 직렬화
$serializedData = serialize($data);
// 反데이터 직렬화
$unserializedData = unserialize($serializedData);
// 파일 핸들을 다시 열십시오
$fileHandle = fopen($unserializedData['file'], 'r');
이러한 방식으로 파일 핸들을 파일 경로로 변환하고 직렬화 중에 리소스 유형을 포함하지 않습니다. 사형화 후 파일을 다시 열어 원래 작업을 복원합니다.
리소스 유형을 포함하는 복잡한 개체를 직렬화 해야하는 경우 __sleep 및 __wakeup 마법 방법을 구현하여 객체의 직렬화 및 사막화 동작을 사용자 정의 할 수 있습니다. 이를 통해 직렬화 중에 자원 유형을 무시하거나 다른 직렬화 가능한 형식으로 바꾸고 사막화 중에 원래 리소스 유형으로 복원 할 수 있습니다.
샘플 코드 :
class FileHandler
{
private $file;
public function __construct($filePath)
{
$this->file = fopen($filePath, 'r');
}
// 맞춤 직렬화 방법
public function __sleep()
{
// 파일 경로 만 직렬화하십시오,파일 리소스가 아닙니다
return ['filePath'];
}
// 맞춤형 사막화 방법
public function __wakeup()
{
// 사막화 할 때 파일을 다시 열어줍니다
$this->file = fopen($this->filePath, 'r');
}
}
// 객체를 만들고 직렬화하십시오
$fileHandler = new FileHandler('/path/to/file.txt');
$serializedFileHandler = serialize($fileHandler);
// 파일 핸들을 제외하고 복원합니다
$unserializedFileHandler = unserialize($serializedFileHandler);
이 예에서는 __sleep 방법에서 파일 핸들의 직접 직렬화를 피하고 파일 경로 만 유지합니다. __wakeup 방법에서 파일을 다시 열고 파일 핸들을 복원합니다.
경우에 따라 리소스 유형 (예 : 파일 핸들)은 원격 URL을 나타낼 수 있습니다. 전체 리소스를 직렬화하는 대신 이러한 URL을 문자열로 저장하고 직렬화하도록 선택할 수 있습니다.
예를 들어, 원격 파일을 가리키는 파일 핸들이 있다고 가정합니다. 해당 URL로 교체하고 사산 할 때 원격 파일을 다시 구할 수 있습니다.
샘플 코드 :
$fileUrl = 'http://gitbox.net/path/to/file.txt'; // 사용 URL 파일 핸들 대신
// 파일 직렬화 URL
$serializedFileUrl = serialize(['fileUrl' => $fileUrl]);
// 反파일 직렬화 URL
$unserializedFileUrl = unserialize($serializedFileUrl);
// 사막화 할 때,당신은 할 수 있습니다 URL 파일을 얻거나 다른 작업을 수행하십시오
echo "The file URL is: " . $unserializedFileUrl['fileUrl'];
여기서 우리는 파일의 URL 문자열을 직렬화 된 데이터에 저장하고 해당 URL을 구조화 할 때 복원합니다. 이는 파일 핸들을 직렬화하여 발생하는 문제를 피하고 여전히 필요한 정보를 저장하고 전송할 수 있습니다.
PHP의 직렬화 기능을 사용할 때는 리소스 유형 (예 : 파일 핸들)을 처리 할 때 더 조심해야합니다. 자원 유형을 직접 직렬화하면 사막화 중에 예측할 수없는 행동과 오류가 발생할 수 있습니다. 모범 사례는 직렬화 자원 유형을 피하거나 사용자 정의 직렬화 및 사막화 방법을 통해 처리하는 것입니다. 이러한 방법을 통해 직렬화 및 사막화 프로세스 중에 시스템 리소스가 올바르게 처리되고 복원되도록 할 수 있습니다.