프로그래밍 언어/PHP

PHP 배열 저장에 선호되는 방법 (json_encode vs serialize)

Rateye 2021. 9. 1. 10:35
728x90
반응형
질문 : PHP 배열 저장에 선호되는 방법 (json_encode vs serialize)

캐싱을 위해 데이터의 다차원 연관 배열을 플랫 파일에 저장해야합니다. 때때로 웹 앱에서 사용하기 위해 JSON으로 변환해야 할 필요가있을 수 있지만 대부분의 경우 PHP에서 직접 배열을 사용합니다.

이 텍스트 파일에 배열을 JSON 또는 PHP 직렬 배열로 저장하는 것이 더 효율적입니까? 나는 둘러 보았고 최신 버전의 PHP (5.3)에서 json_decode 가 실제로 unserialize 보다 빠릅니다.

필요한 경우 사람이 읽기 쉽기 때문에 현재 배열을 JSON으로 저장하는쪽으로 기울고 있습니다. PHP와 JavaScript 모두에서 아주 적은 노력으로도 사용할 수 있습니다. 디코딩 속도가 빠릅니다 (인코딩에 대해서는 확실하지 않음).

누구든지 함정을 알고 있습니까? 누구든지 두 방법의 성능 이점을 보여주는 좋은 벤치 마크가 있습니까?

답변

우선 순위에 따라 다릅니다.

성능이 절대적인 주행 특성이라면 반드시 가장 빠른 것을 사용하십시오. 선택하기 전에 차이점을 완전히 이해했는지 확인하십시오.

  • serialize() 와 달리 UTF-8 문자를 그대로 유지하려면 추가 매개 변수를 추가해야합니다 : json_encode($array, JSON_UNESCAPED_UNICODE) (그렇지 않으면 UTF-8 문자를 유니 코드 이스케이프 시퀀스로 변환합니다).
  • JSON은 객체의 원래 클래스가 무엇인지에 대한 메모리가 없습니다 (항상 stdClass의 인스턴스로 복원 됨).
  • JSON과 함께 __sleep()__wakeup() 을 활용할 수 없습니다.
  • 기본적으로 공용 속성 만 JSON으로 직렬화됩니다. ( PHP>=5.4 JsonSerializable 을 구현하여이 동작을 변경할 수 있습니다).
  • JSON은 더 이식성이 있습니다.

그리고 아마도 지금은 생각할 수없는 몇 가지 다른 차이점이있을 것입니다.

두 가지를 비교하는 간단한 속도 테스트

<?php

ini_set('display_errors', 1);
error_reporting(E_ALL);

// Make a big, honkin test array
// You may need to adjust this depth to avoid memory limit errors
$testArray = fillArray(0, 5);

// Time json encoding
$start = microtime(true);
json_encode($testArray);
$jsonTime = microtime(true) - $start;
echo "JSON encoded in $jsonTime seconds\n";

// Time serialization
$start = microtime(true);
serialize($testArray);
$serializeTime = microtime(true) - $start;
echo "PHP serialized in $serializeTime seconds\n";

// Compare them
if ($jsonTime < $serializeTime) {
    printf("json_encode() was roughly %01.2f%% faster than serialize()\n", ($serializeTime / $jsonTime - 1) * 100);
}
else if ($serializeTime < $jsonTime ) {
    printf("serialize() was roughly %01.2f%% faster than json_encode()\n", ($jsonTime / $serializeTime - 1) * 100);
} else {
    echo "Impossible!\n";
}

function fillArray( $depth, $max ) {
    static $seed;
    if (is_null($seed)) {
        $seed = array('a', 2, 'c', 4, 'e', 6, 'g', 8, 'i', 10);
    }
    if ($depth < $max) {
        $node = array();
        foreach ($seed as $key) {
            $node[$key] = fillArray($depth + 1, $max);
        }
        return $node;
    }
    return 'empty';
}
출처 : https://stackoverflow.com/questions/804045/preferred-method-to-store-php-arrays-json-encode-vs-serialize
728x90
반응형