워드프레스에서 PHP 세션은 독이 될 수 있습니다.

워드프레스 플러그인 제작시 PHP의 세션(session) 사용은 자제하시기를 권고드립니다.

이전에 잠시 쓴 포스트의 검증을 위한 작업을 했습니다. 두 포스트를 통해 저는 PHP 세션(session)은 어지간하면 사용하지 말기를 권고드리며, 다른 방법을 사용하시기를 조언드립니다. 세션 사용시 사이트의 성능 저하가 발생할 수 있기 때문입니다.

더 보기 “워드프레스에서 PHP 세션은 독이 될 수 있습니다.”

Uncode 테마 + KBoard 게시판은 성능 저하를 일으킬 수 있습니다.

불타는 금요일을 보내고 토요일 새벽까지 디버깅을 한 결과입니다.
 Uncode 테마와 KBoard 게시판을 사용할 경우 워드프레스의 성능 저하를 유발시킬 수 있습니다. 둘을 따로따로 쓰면 문제가 없지만 같이 사용하는 경우 사이트에 로딩이 생기며, 특히 비주얼 컴포저 사용시 심각한 로딩 시간이 생기게 됩니다.

원인은 KBoard의 세션과 Uncode 테마의 ‘list_images‘ AJAX 동작 때문에 발생합니다. KBoard의 메인 파일인 kboard/index.php 파일의 초반에는 session_start()로 세션을 시작하는 구문이 있습니다. 그리고 이 세션은 KBoard 곳곳에서 활용됩니다.

한편 Uncode는 list_images라는 ajax 액션을 통해 uncode_list_images()라는 함수를 동작시킵니다(uncode/core/inc/admin.php: 1086). 이 함수는 무려 모든 이미지 파일을 불러와 그 이미지 파일의 용량을 계산합니다. 그리고 아래와 같은 메시지를 응답으로 넘깁니다.

The Adaptive Images system is using 87.6M of the 6.29G space left.

JSON 포맷이 아닌, 그냥 단순 텍스트 응답으로 날아옵니다. 이 응답이 자바스크립트 같은 곳에서 프로그래밍적으로 유의미한지는 확인하지 않았으나, 그렇게 보이지는 않습니다.

문제는 이미지의 양이 많아질 때 터집니다. 제가 작업 중인 사이트는 이미지 파일만 1만개에 가깝게 유지하고 있습니다. 사이트의 용량만도 기가바이트급입니다. 언코드는 무식하게도 이 1만개에 육박하는 이미지를 매번 관리자 화면 로딩시 별도의 AJAX 요청을 통해 모두 쿼리로 불러와, 용량을 계산하고, 위 메시지를 출력하고 있던 것입니다.  이 계산을 위해 대략 수 초, 심하면 저의 경우처럼 30~40초까지 걸리기도 합니다.

이제 이 상태에 KBoard가 끼어들면 문제가 정말 심각해집니다.  KBoard는 로딩될 때마다 세션을 실행합니다. 세션에는 한 번에 하나의 연결만 접근할 수 있으므로 둘 이상의 연결을 동시 처리할 수 없습니다. 그런데 언코드는 파일 용량을 계산하는 AJAX를 페이지를 부를 때마다 자동으로 실행합니다. 병목구간이 발생하는 것입니다.

비주얼 컴포저로 각 위젯을 편집 버튼을 누르면 각 UI 정보는 AJAX를 통해 얻어 옵니다. 그러나 이미 이미지 용량 계산 때문에 다른 AJAX 요청에는 응답할 수 없는 상태입니다. 그래서 꽤 오랫동안 로딩이 걸리게 되는 것입니다. 아마 다른 페이지에 접근할 때도 마찬가지로 로딩이 심하게 발생할 수 있을 것입니다.

문제를 해결하려면

  1. Uncode와 KBoard를 같이 쓰지 않는다.
  2. 같이 써야 한다면 Uncode의 이미지 계산하는 부분, uncode/core/inc/admin.php 파일의 1086번째 줄 부근의
    /* AJAX call to load all images */
    add_action( 'wp_ajax_list_images', 'uncode_list_images' );

     부분을 주석 처리.

  3. 코어를 건드리는 것은 부담스러우므로 차일드 테마나, 별도의 플러그인을 생성.
    add_action( 'plugins_loaded', 'my_uncode_kboard_fix' );
    
    function my_uncode_kboard_fix() {
      if( has_action( 'wp_ajax_list_images', 'uncode_list_images' ) {
        remove_action( 'wp_ajax_list_images', 'uncode_list_images' ) ;
      }
    }

매번 이런 용량 계산을 하는 언코드도 문제지만, KBoard도 굳이 세션을 써야 했나 생각이 듭니다.