클라이언트에게 답신 메일을 보내다, 장문이 되어버렸다. 그런데 나중에 발췌해서 공유하고자 함이니 고객에 대한 것은 편집해서 공유해 본다. 잘 쓴 글은 아니지만 그래도 나누고 싶다.
워드프레스를 사용하여 운영을 시작하시는 분들께는 다음과 같은 조언을 드리고 싶습니다.
(더 보기…)클라이언트에게 답신 메일을 보내다, 장문이 되어버렸다. 그런데 나중에 발췌해서 공유하고자 함이니 고객에 대한 것은 편집해서 공유해 본다. 잘 쓴 글은 아니지만 그래도 나누고 싶다.
워드프레스를 사용하여 운영을 시작하시는 분들께는 다음과 같은 조언을 드리고 싶습니다.
(더 보기…)register_post_type() 함수 인자에서 ‘support’ 항목에 ‘page-attributes’를 추가한다. 그리고 아래의 필터를 추가한다.
<?php add_filter( 'theme_' . 'custom_post_type' . '_templates', 'my_templates', 10, 4); function my_templates( $post_templates, $wp_theme, $post, $post_type ) { if ( empty( $post_templates ) ) { $pt = $wp_theme->get_post_templates(); $post_templates = $pt['page'] ?? array(); } return $post_templates; }
워드프레스는 Portable PHP password hashing framework(phpass)를 사용하여 패스워드를 해싱한다. 이 프레임워크에서는 PHP5.5이후의 내장된 password_hash(), password_verify()를 사용하는 것이 권장하며, 자신들은 그 이전 프로젝트를 위한 호환성을 보장한다고 한다. 워드프레스 최소 환경이 5.2.9인 것을 감안하면 그렇게 해야 할 듯.
예를 들어 설명하는 것이 낫겠다. 워드프레스에서 시험적으로 ‘guest’라는 계정과 ‘guest’라는 매우 취약한 패스워드를 사용하여 계정을 만들었다. 그러면 패스워드 해쉬 값은 ‘$P$ByCNnCoqFGHDSjIkWjlf8heBFfLJLI1’로 나오게 된다.
불타는 금요일을 보내고 토요일 새벽까지 디버깅을 한 결과입니다.
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 요청에는 응답할 수 없는 상태입니다. 그래서 꽤 오랫동안 로딩이 걸리게 되는 것입니다. 아마 다른 페이지에 접근할 때도 마찬가지로 로딩이 심하게 발생할 수 있을 것입니다.
문제를 해결하려면
/* AJAX call to load all images */ add_action( 'wp_ajax_list_images', 'uncode_list_images' );
부분을 주석 처리.
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도 굳이 세션을 써야 했나 생각이 듭니다.