> 백엔드 개발 > PHP 문제 > 배열 효율성을 위한 PHP json

배열 효율성을 위한 PHP json

WBOY
풀어 주다: 2023-05-19 14:02:37
원래의
519명이 탐색했습니다.

최근 모바일 인터넷의 급속한 발전과 클라우드 컴퓨팅, 사물 인터넷, 인공 지능 및 기타 분야의 활발한 발전으로 인해 데이터 처리의 효율성은 주요 기업의 관심사 중 하나가 되었습니다. 웹 개발에 있어서 json 데이터 처리는 없어서는 안 될 링크가 되었습니다. 웹 개발의 주력인 PHP 역시 json 데이터를 어떻게 효율적으로 처리할 것인가의 문제에 직면해 있습니다. 이러한 맥락에서 이 기사에서는 PHP에서 json을 배열로 변환하는 효율성과 이를 최적화하는 방법을 살펴보겠습니다.

  1. json을 배열로 변환하는 기본 작업

PHP에서 json 데이터를 배열로 변환하는 작업은 매우 간단합니다. json_decode() 함수를 사용하면 됩니다. 함수는 다음과 같이 정의됩니다.

mixed json_decode ( string $json [, bool $assoc = FALSE [, int $depth = 512 [, int $options = 0 ]]] )
로그인 후 복사

그 중 $json 매개변수는 디코딩할 json 문자열을 나타내고, $assoc 매개변수는 json 객체를 연관 배열로 변환할지 여부를 나타내며, $length 매개변수는 최대 개수를 나타냅니다. 지원되는 디코딩 계층(기본값은 512)의 경우 $options 매개변수는 디코딩 시 동작 옵션을 나타냅니다.

다음은 간단한 예입니다.

$json_str = '{"name":"张三","age":18}';
$arr = json_decode($json_str, true);
print_r($arr);
로그인 후 복사

출력 결과는

Array
(
    [name] => 张三
    [age] => 18
)
로그인 후 복사

json 문자열을 배열로 변환하는 것이 매우 간단하고 처리 효율성이 상대적으로 높다는 것을 알 수 있습니다. 연관 변환도 지원합니다. 배열과 일반 배열.

  1. json을 배열로 변환할 때 성능 병목 현상

json을 배열로 변환하는 것은 매우 간단하지만, 대량의 json 데이터를 처리할 때 성능 병목 현상이 발생합니다. 우선, json 문자열을 디코딩하려면 메모리, CPU 등과 같은 특정 시스템 리소스가 필요합니다. 둘째, json 문자열을 배열로 변환할 때 json 문자열의 구조에 따라 레이어별로 파싱하고 변환해야 하는데 이 과정에도 많은 시간과 자원이 필요하다.

이 문제를 설명하기 위해 다음은 성능 테스트의 예입니다. 테스트된 json 데이터에는 10,000개의 개체가 포함되어 있으며 각 개체에는 10개의 속성이 있으며 모든 속성은 총 크기가 약 10MB입니다.

<?php

$start_time = microtime(true);
$json = file_get_contents('test.json');
$arr = json_decode($json, true);
echo count($arr) . "
";
echo (microtime(true) - $start_time) . "
";
로그인 후 복사

테스트 결과는 다음과 같습니다.

10000
0.785
로그인 후 복사

10MB의 json 데이터를 디코딩하고 변환하는 데 0.785초가 소요되는 것을 볼 수 있습니다. 이 시간은 동시성이 높고 실시간 요구 사항이 높은 일부 애플리케이션에서는 병목 현상이 발생할 수 있습니다. 따라서 json을 배열로 변환하는 효율성을 어떻게 향상시킬 것인가가 매우 중요한 문제가 되었습니다.

  1. json에서 배열로 변환을 위한 최적화 솔루션

json에서 배열로 변환하는 성능 병목 현상을 해결하기 위해 다양한 최적화 솔루션을 채택할 수 있습니다.

3.1.json 데이터 압축

우선, json 데이터를 압축하여 json 문자열의 크기를 줄여 디코딩 및 변환 시간을 단축할 수 있습니다. 일반적인 압축 방법에는 gzip과 LZ4가 있습니다. 예를 들어, 위의 예에서 gzip을 사용하여 json 데이터를 압축하면 데이터 크기가 약 1.56MB로 줄어들어 디코딩 및 변환 시간이 단축됩니다.

3.2. 스트리밍 구문 분석 방법 사용

둘째, 스트리밍 구문 분석 방법을 사용하면 전체 json 문자열을 한 번에 메모리에 로드하지 않도록 json 데이터를 점진적으로 구문 분석할 수 있습니다. 스트리밍 구문 분석을 구현하려면 PHP에서 json_stream_decode() 함수를 사용할 수 있습니다. 예:

<?php

$handle = fopen('test.json', 'r');
$arr = [];
$parser = json_parser();
while (($line = fgets($handle)) !== false) {
    $result = $parser->write($line);
    if ($result !== null) {
        array_push($arr, $result);
    }
}
fclose($handle);
echo count($arr) . "
";

function json_parser() {
    $parser = new JsonStreamingParser_Parser(new class() implements JsonStreamingParser_Listener {
        private $current_obj;
        private $stack;
    
        public function start_document() {
            $this->stack = [];
        }
    
        public function start_object() {
            $this->current_obj = [];
        }
    
        public function end_object() {
            $obj = array_pop($this->stack);
            if (!empty($this->stack)) {
                $current_key = end($this->stack);
                $current_key[] = $obj;
            }
            else {
                array_push($this->current_obj, $obj);
            }
        }
    
        public function start_array() {
            $this->stack[] = [];
        }
    
        public function end_array() {
            $arr = array_pop($this->stack);
            if (!empty($this->stack)) {
                $current_key = end($this->stack);
                $current_key[] = $arr;
            }
            else {
                array_push($this->current_obj, $arr);
            }
        }
    
        public function key($key) {
            array_push($this->stack, [$key]);
        }
    
        public function value($value) {
            $current_key = end($this->stack);
            $current_key[] = $value;
        }
    
        public function whitespace($whitespace) {
    
        }
    });
    return $parser;
}
로그인 후 복사

이 예에서는 타사 라이브러리 JsonStreamingParser가 스트리밍 구문 분석을 구현하는 데 사용됩니다. 기본 원칙은 json 데이터를 여러 개의 작은 조각으로 분해하고, 각 작은 조각을 구문 분석하고, 해당 배열 요소를 생성하는 것입니다. 이런 방식으로 전체 json 문자열을 한 번에 메모리에 로드하는 것을 방지하여 효율성을 크게 향상시킬 수 있습니다.

3.3. 바이너리 프로토콜 사용

마지막으로 바이너리 프로토콜을 사용하여 json 문자열을 대체하고 이를 바이너리 데이터로 변환하여 전송 및 처리할 수 있습니다. 이진 데이터는 일반적으로 리터럴 데이터보다 더 컴팩트하므로 더 빠르게 구문 분석할 수 있습니다. PHP에서는 MessagePack 확장을 사용하여 바이너리 프로토콜 처리를 구현할 수 있습니다. 예:

$msgpack = new MessagePack();
$packed = $msgpack->pack($arr);
$unpacked = $msgpack->unpack($packed);
로그인 후 복사

이 예에서는 배열이 바이너리 형식으로 변환되고 MessagePack 클래스의 pack() 및 unpack() 메서드가 변환에 사용됩니다. 바이너리 프로토콜을 사용하면 디코딩 및 변환 효율성이 크게 향상될 수 있음을 알 수 있습니다.

  1. 요약

실제 개발에서 json은 매우 일반적으로 사용되는 데이터 형식이자 Web API의 표준 데이터 형식 중 하나입니다. 따라서 PHP에서 json을 배열로 변환하는 효율성을 최적화하는 것이 매우 중요합니다. 이 기사에서는 압축 알고리즘 사용, 스트리밍 구문 분석 사용 및 바이너리 프로토콜 사용을 포함하여 세 가지 일반적인 최적화 솔루션을 소개합니다. 각 최적화 솔루션에는 고유한 장점과 적용 가능한 시나리오가 있으며 개발자는 실제 요구 사항에 따라 적절한 솔루션을 선택할 수 있습니다.

위 내용은 배열 효율성을 위한 PHP json의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿