복제된 객체는 단일 파일 핸들을 사용해야 합니까, 아니면 각각 고유한 파일 핸들을 사용해야 합니까?

StackOverflow https://stackoverflow.com/questions/2002742

  •  18-09-2019
  •  | 
  •  

문제

저는 기존 웹 도구에 대한 데이터 파일을 구문 분석하는 래퍼를 작업 중입니다.그러나 대용량 데이터 파일을 사용하고 있기 때문에 모든 것을 메모리에 로드할 수 없으므로 작은 덩어리로 로드하여 살펴보아야 합니다.기존 웹 도구는 SimpleXML과 유사한 스타일의 데이터를 기대합니다($obj->parentnode->childnode->childnode는 문자열 또는 일종의 노드 객체를 반환합니다).다행히 구조는 XML과 유사하지만 구문이 이상합니다.참작할 수 있는 상황 때문에 정상적인 형식으로 번역할 수도 없습니다.그래서 나는 그것을 즉석에서 에뮬레이트해야합니다.

파일을 살펴보면서 전체 트리를 구문 분석할 필요가 없고 현재 노드의 하위 노드 이름만 구문 분석할 필요가 있습니다.각 하위 노드 이름과 관련 오프셋은 상위 노드에 저장됩니다.하위 노드의 콘텐츠에 액세스해야 하는 경우 상위 노드 개체가 복제되고 오프셋 값이 업데이트되며 하위 노드 개체는 요청된 하위 노드를 찾을 때까지 콘텐츠 구문 분석을 시작합니다.

내가 가진 질문은 다음과 같습니다.

  • 상위 노드 개체를 복제하면 하위 복제본에 파일 핸들이 제공됩니다.모든 클론이 동일한 핸들을 사용하고 fseek를 사용하여 필요한 경우 파일 주위를 이동해야 합니까(그리고 이는 꽤 큰 경우입니다)?
  • 파일을 닫아야 하나요?아니면 스크립트 실행이 끝나면 가비지 수집이 종료되나요?그렇지 않으면 어떤 위험에 직면하게 됩니까?
  • 각 클론에 대한 핸들을 만들어야 합니까, 아니면 공유를 계속 유지해야 합니까?그렇다면 상한선이 있나요?
  • 복제된 객체가 원본 객체에 대한 참조를 보유할 수 있는 방법이 있습니까?개체 소멸자에서 핸들을 닫는 경우 개체가 복제본이면 핸들을 닫아서는 안 됩니다.그리고 위쪽으로 추적할 수 있으면 아마도 유용할 수도 있습니다.
도움이 되었습니까?

해결책

구현하면 __clone 이 방법을 사용하면 개체를 복제본으로 플래그 지정하는 속성을 설정하거나 부모를 보유하는 속성을 설정하는 등 개체를 복제할 때 원하는 모든 작업을 수행할 수 있습니다.

편집하다:

public function __clone()
{
  $clone = clone $this;
  $clone->isCloned = true;
  $clone->parent = $this;
  $clone->resource = $this->resource; // i dont think resources are copied be default
  // additional property transference
  return $clone;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top