현재 위치: > 최신 기사 목록> STRSTR 성능 최적화 : 대규모 텍스트 처리에서 검색 효율을 향상시키는 방법은 무엇입니까?

STRSTR 성능 최적화 : 대규모 텍스트 처리에서 검색 효율을 향상시키는 방법은 무엇입니까?

gitbox 2025-09-01

php에서 strrristr () 함수는 문자열에서 지정된 서브 스트링의 첫 번째 발생을 찾는 데 사용되는 함수입니다. 이 기능은 대소 문자를 사용하지 않으며 종종 텍스트 일치 및 검색에 사용됩니다. 그러나 많은 양의 텍스트에서 자주 검색이 필요할 때 STRRRISTR () 의 성능은 특히 큰 텍스트를 다룰 때 병목 현상이 될 수 있습니다. 따라서이 기능의 효율성을 향상시키는 것은 응용 프로그램 성능을 향상시키는 데 중요합니다.

1. strrristr ()의 작동 방식을 이해하십시오

strrristr () 함수의 기본 사용량은 다음과 같습니다.

 <span><span><span class="hljs-title function_ invoke__">stristr</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$needle</span></span><span>): </span><span><span class="hljs-keyword">string</span></span><span>|</span><span><span class="hljs-literal">false</span></span><span>
</span></span>
  • $ Haystack : 검색 할 기본 문자열.

  • $ 바늘 : 찾을 수있는 서브 스트링.

이 기능은 $ 니들 의 첫 번째 발생 후 $ haystack 의 일부를 반환하거나 찾을 수없는 경우 False를 반환합니다.

strristr () 는 간단하고 사용하기 쉽지만, 특히 여러 조회 작업 또는 매우 큰 텍스트 파일이 관련 될 때 대규모 텍스트 조회에는 성능이 좋지 않습니다.

2. 성능 병목 현상 분석

strristr ()은 $ 니들이 발견되거나 전체 $ haystack을 통해 반복 될 때까지 문자별로 $ haystack 문자열 문자를 스캔해야합니다. 더 큰 문자열로 여러 검색 작업을 수행하는 경우마다 전체 문자열을 처음부터 스캔 할 수 있습니다. 이 방법은 특히 파일 내용 또는 다량의 데이터를 처리 할 때 자주 검색 해야하는 작업에 비교적 비효율적입니다.

예를 들어, 텍스트가 많은 로그 파일이 있고 여러 다른 키워드를 찾아야한다고 가정합니다. strrristr ()가 모든 조회라고 불리면 여러 불필요한 횡단이 발생하여 성능에 영향을 미칩니다.

3. strstr () 성능을 향상시키는 몇 가지 방법

3.1 strrristr () 대신 strpos () 를 사용하십시오.

서브 스트링이 존재하는지 여부를 찾는 것에 대해서만 관심이 있고 서브 스트링 후 컨텐츠를 반환 할 필요가 없다면 strpos () 함수 사용을 고려할 수 있습니다. strpos () 와 비교하여 strpos ()는 첫 번째 일치의 위치 만 반환하며 전체 하위 문자열 내용을 반환 할 필요가 없습니다.

 <span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"This is a large text example that we are working with."</span></span><span>;
</span><span><span class="hljs-variable">$needle</span></span><span> = </span><span><span class="hljs-string">"large"</span></span><span>;

</span><span><span class="hljs-variable">$position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$needle</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$position</span></span><span> !== </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Found at position: "</span></span><span> . </span><span><span class="hljs-variable">$position</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Not found."</span></span><span>;
}
</span></span>

strpos () 의 시간 복잡성은 O (n)이며, 여기서 n은 $ haystack 의 길이이며, strpos () 의 추가 문자열 반환 작동을 피합니다.

3.2 다중 검색 대신 정규식을 사용하십시오

여러 조회 작업이 필요하고 여러 문자열 스캔을 피하려면 정규 표현식 사용을 고려할 수 있습니다. 정규 표현식은 기능을 찾기 위해 여러 호출없이 한 번에 여러 패턴과 일치 할 수 있습니다. PHP는이 기능을 구현하기 위해 preg_match ()preg_match_all () 과 같은 함수를 제공합니다.

 <span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"This is a large text example that we are working with."</span></span><span>;
</span><span><span class="hljs-variable">$pattern</span></span><span> = </span><span><span class="hljs-string">"/large|text|example/i"</span></span><span>; </span><span><span class="hljs-comment">// 여러 키워드를 정기적으로 일치시킵니다</span></span><span>

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-variable">$pattern</span></span><span>, </span><span><span class="hljs-variable">$haystack</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Match found!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"No match found."</span></span><span>;
}
</span></span>

정규 표현식으로 스캔에서 여러 하위 문자열을 일치시켜 Strrristr () 에 대한 반복 호출을 피할 수 있습니다.

3.3 str_replace ()를 사용하여 텍스트를 미리 처리하십시오

검색 프로세스 중에 특정 텍스트 콘텐츠 만 교체하거나 삭제 해야하는 경우 STR_REPLACE () 를 통해 텍스트를 미리 처리하는 것이 더 효율적입니다. str_replace () 는 단일 트래버스에서 여러 교체 작업을 수행 할 수 있으므로 일반적으로 하나씩 찾는 것보다 빠릅니다.

 <span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"This is a large text example that we are working with."</span></span><span>;
</span><span><span class="hljs-variable">$search</span></span><span> = [</span><span><span class="hljs-string">"large"</span></span><span>, </span><span><span class="hljs-string">"text"</span></span><span>, </span><span><span class="hljs-string">"example"</span></span><span>];
</span><span><span class="hljs-variable">$replace</span></span><span> = [</span><span><span class="hljs-string">"big"</span></span><span>, </span><span><span class="hljs-string">"word"</span></span><span>, </span><span><span class="hljs-string">"sample"</span></span><span>];

</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>(</span><span><span class="hljs-variable">$search</span></span><span>, </span><span><span class="hljs-variable">$replace</span></span><span>, </span><span><span class="hljs-variable">$haystack</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>;
</span></span>

이 접근법은 텍스트가 전처리되어야하는 상황에 특히 적합합니다.

3.4 메모리 최적화 : 반복 스캔을 피하십시오

대형 텍스트 파일에서 여러 조회가 이루어지면 불필요한 메모리 할당이없고 각 조회를 복사하지 마십시오. 특히 매우 큰 텍스트 데이터를 처리 할 때 메모리 포인터 및 스트리밍 읽기를 사용하여 성능을 최적화 할 수 있습니다.

 <span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'large_file.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">stristr</span></span><span>(</span><span><span class="hljs-variable">$line</span></span><span>, </span><span><span class="hljs-string">'needle'</span></span><span>)) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Found in line: "</span></span><span> . </span><span><span class="hljs-variable">$line</span></span><span>;
    }
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span></span>

위의 코드에서는 파일을 한 줄씩 읽고 검색하여 메모리 사용량을 줄일 수 있으며 전체 파일을 한 번에 메모리에로드하지 않습니다.

4. 캐싱 정책을 사용하십시오

빈번한 검색 시나리오의 경우 캐싱 전략을 채택하면 성능이 크게 향상 될 수 있습니다. 예를 들어, 검색 된 결과를 캐시하여 동일한 서브 스트링에 대한 반복 검색을 피하십시오. Cache Storage 용 Redis와 같은 PHP의 APCU 확장 또는 외부 캐싱 도구를 사용할 수 있습니다.

 <span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"This is a large text example that we are working with."</span></span><span>;
</span><span><span class="hljs-variable">$needle</span></span><span> = </span><span><span class="hljs-string">"large"</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$cachedResult</span></span><span> = </span><span><span class="hljs-title function_ invoke__">apcu_fetch</span></span><span>(</span><span><span class="hljs-variable">$needle</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Found from cache: "</span></span><span> . </span><span><span class="hljs-variable">$cachedResult</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stristr</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$needle</span></span><span>);
    </span><span><span class="hljs-title function_ invoke__">apcu_store</span></span><span>(</span><span><span class="hljs-variable">$needle</span></span><span>, </span><span><span class="hljs-variable">$result</span></span><span>);
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Found: "</span></span><span> . </span><span><span class="hljs-variable">$result</span></span><span>;
}
</span></span>

이렇게하면 특히 복잡한 텍스트를 처리 할 때 반복 검색의 오버 헤드가 줄어들고 캐시는 응용 프로그램 응답 속도를 크게 향상시킬 수 있습니다.

5. 결론

strristr () 는 PHP에서 매우 실용적인 기능이지만 성능 최적화와 관련하여 문자 별 특성 스캔은 큰 텍스트 나 빈번한 조회를 처리 할 때 병목 현상을 유발할 수 있습니다. strpos () , 정규식, 메모리 최적화 처리 및 캐시 전략과 같은 대체 방법을 채택함으로써 검색 효율을 효과적으로 개선하고, 시스템 부담을 줄이며, 대규모 텍스트 처리의 성능을 최적화 할 수 있습니다.