3.1.x 에서 3.2.x 로 업그레이드

업데이트를 수행하기 전에 index.php 파일을 정적 파일로 교체하여 사이트를 오프라인 상태로 만들어야 합니다.

Step 1: CodeIgniter 파일 업데이트

system/ 디렉토리의 모든 파일과 폴더를 교체합니다.

참고

이 디렉토리에 사용자 정의 파일이 있는 경우, 먼저 복사본을 만들어 두세요.

Step 2: PHP 버전 확인

항상 현재 지원되는 버전을 사용하길 권장하며, 현재는 최소 PHP 5.6입니다.

PHP 5.3.x 버전은 이제 CodeIgniter에서 공식적으로 지원되지 않으며, 5.4.8+ 버전이 실행은 될 수 있지만 PHP.net 지원 버전 페이지에 나열된 버전 미만의 PHP를 사용하지 않도록 강력히 권고합니다.

Step 3: CI_Model::__construct() 호출 제거

CI_Model 의 클래스 생성자에는 중요한 코드나 유용한 로직이 없었으며, 메시지를 로그에 기록하는 한 줄만 있었습니다. CodeIgniter 3.1.7의 변경으로 이 로그 메시지가 다른 곳으로 이동되어 생성자가 완전히 불필요해졌습니다. 그러나 마이너 릴리즈에서 즉각적인 하위 호환성 문제를 피하기 위해 유지되었습니다.

버전 3.2.0에서 해당 생성자가 완전히 제거되어, 이를 호출하면 치명적 오류가 발생합니다. 특히 다음과 같은 코드에서:

class Some_model extends CI_Model {

        public function __construct()
        {
                parent::__construct(); // CI_Model::__construct() 호출

                do_some_other_thing();
        }
}

parent::__construct() 호출을 제거하기만 하면 됩니다. 덧붙여, 다음 패턴은 매우 흔하게 볼 수 있습니다:

class Some_class extends CI_Something {

        public function __construct()
        {
                parent::__construct();
        }
}

이렇게 하지 마세요! 무의미하며 아무 목적도 없습니다. 부모 클래스에 __construct() 메서드가 있으면 모든 자식 클래스에 상속되어 잘 실행됩니다. 로직을 확장하려는 경우가 아니라면 명시적으로 호출할 필요가 없습니다.

Step 4: 데이터베이스 연결 처리 변경

config/autoload.php 설정을 사용하거나 $this->load->database() 또는 DB() 함수를 통해 데이터베이스를 “로드”하면, 실패 시 RuntimeException 이 발생합니다.

또한, 설정된 문자 집합을 지정할 수 없는 경우도 이제 연결 실패로 간주됩니다.

참고

이는 과거 대부분의 데이터베이스 드라이버(‘mysql’, ‘mysqli’, ‘postgre’ 드라이버 제외)에서도 마찬가지였습니다.

이는 데이터베이스에 연결할 수 없거나 잘못된 문자 집합이 설정된 경우, CodeIgniter가 더 이상 조용히 실패하지 않고 예외를 발생시킨다는 것을 의미합니다.

명시적으로 예외를 처리할 수 있습니다 (이 경우 데이터베이스 클래스 를 로드하는 데 config/autoload.php 를 사용할 수 없음):

try
{
        $this->load->database();
}
catch (RuntimeException $e)
{
        // 실패 처리
}

또는 CodeIgniter의 기본 예외 핸들러에 맡겨, 오류 메시지를 로그에 기록하고 개발 모드에서 오류 화면을 표시하도록 할 수 있습니다.

db_set_charset() 호출 제거

위의 변경으로 인해 db_set_charset() 메서드의 목적은 이제 런타임에 연결 문자 집합을 변경하는 것뿐입니다. 이는 의미가 없으며, 대부분의 데이터베이스 드라이버가 지원하지 않는 이유이기도 합니다. 따라서 db_set_charset() 은 더 이상 필요하지 않으며 제거되었습니다.

Step 5: CLI 요청의 URI 파싱 관련 로직 확인

CLI에서 CodeIgniter 애플리케이션을 실행할 때, URI 라이브러리 는 이제 $config['url_suffix']$config['permitted_uri_chars'] 설정을 무시합니다.

이 두 옵션은 커맨드 라인에서 의미가 없으므로 영향을 받지 않아야 하지만, 어떤 이유로 이에 의존했다면 코드를 변경해야 할 수도 있습니다.

Step 6: Redis, Memcache(d) 캐시 라이브러리 설정 확인

캐시 라이브러리 의 ‘redis’ 및 ‘memcached’ 드라이버의 개선으로 설정값을 약간 조정해야 할 수 있습니다…

Redis

UNIX 소켓 연결과 함께 ‘redis’ 드라이버를 사용하는 경우, 소켓 경로를 $config['socket'] 에서 $config['host'] 로 이동해야 합니다.

$config['socket_type'] 옵션도 제거되었지만 애플리케이션에는 영향을 주지 않습니다. 연결 유형은 $config['host'] 에 사용된 형식으로 결정됩니다.

Memcache(d)

‘memcached’ 는 이제 host 값을 지정하지 않는 설정을 무시합니다 (이전에는 호스트를 기본값 ‘127.0.0.1’로 설정했음).

따라서 예를 들어 port 만 설정한 구성을 추가한 경우, 이제 host 도 명시적으로 ‘127.0.0.1’로 설정해야 합니다.

Step 7: Email 라이브러리 사용 확인

Email 라이브러리 는 이제 기본적으로 전달된 모든 이메일 주소의 유효성을 검사합니다. 이 검사는 기본적으로 꺼져 있었으며, 활성화하려면 validate 옵션을 TRUE 로 명시적으로 설정해야 했습니다.

유효성 검사는 문제를 일으키지 않아야 하지만, 기술적으로 하위 호환성 변경이므로 모든 것이 정상 동작하는지 확인하세요. 문제가 발생하면 버그로 보고해 주시고, validate 옵션을 비활성화하여 이전 동작으로 되돌릴 수 있습니다.

Step 8: doctype() HTML 헬퍼 사용 확인

HTML 헬퍼doctype() 함수는 문서 유형이 지정되지 않은 경우 기본값으로 ‘xhtml1-strict’ (XHTML 1.0 Strict)를 사용했습니다. 이 기본값이 이제 ‘html5’로 변경되었습니다.

이 변경으로 실제로 문제가 발생하지는 않지만, 애플리케이션이 기본값에 의존하는 경우 원하는 형식을 명시적으로 설정하거나 HTML 5 형식에 맞게 프론트엔드를 수정하세요.

Step 9: form_upload() Form 헬퍼 사용 확인

Form 헬퍼form_upload() 함수에는 3개의 파라미터가 있었는데, “file” 유형의 HTML input 태그에서는 의미가 없으므로 두 번째 파라미터 ($value)는 사용되지 않았습니다.

이 불필요한 파라미터가 이제 제거되었으므로, 세 번째 파라미터 ($extra)를 사용한 경우:

form_upload('name', 'irrelevant value', $extra);

다음과 같이 변경해야 합니다:

form_upload('name', $extra);

Step 10: 이전 버전에서 더 이상 사용되지 않는 기능 제거

다음은 이전 CodeIgniter 버전에서 더 이상 사용되지 않아 3.2.0에서 제거된 기능 목록입니다:

  • $config['allow_get_array'] (대신 $_GET = array(); 사용)

  • $config['standardize_newlines']

  • $config['rewrite_short_tags'] (PHP 5.4+에서는 영향 없음)

  • ‘sqlite’ 데이터베이스 드라이버 (PHP 5.4+에서 더 이상 제공되지 않음; ‘sqlite3’는 계속 사용 가능)

  • CI_Input::is_cli_request() (대신 is_cli() 사용)

  • CI_Router::fetch_directory() (대신 CI_Router::$directory 사용)

  • CI_Router::fetch_class() (대신 CI_Router::$class 사용)

  • CI_Router::fetch_method() (대신 CI_Router::$method 사용)

  • CI_Config::system_url() (보안에 취약한 방식을 권장함)

  • CI_Form_validation::prep_for_form() (prep_for_form 규칙)

  • standard_date() 날짜 헬퍼 함수 (대신 date() 사용)

  • nice_date() 날짜 헬퍼 함수 (대신 DateTime::format() 사용)

  • do_hash() 보안 헬퍼 함수 (대신 hash() 사용)

  • br() HTML 헬퍼 함수 (대신 str_repeat()'<br />' 사용)

  • nbs() HTML 헬퍼 함수 (대신 str_repeat()'&nbsp;' 사용)

  • trim_slashes() 문자열 헬퍼 함수 (대신 '/' 와 함께 trim() 사용)

  • repeater() 문자열 헬퍼 함수 (대신 str_repeat() 사용)

  • read_file() 파일 헬퍼 함수 (대신 file_get_contents() 사용)

  • form_prep() Form 헬퍼 함수 (대신 html_escape() 사용)

  • Encrypt 라이브러리 전체 (최신 Encryption 라이브러리 는 계속 사용 가능)

  • Cart 라이브러리 전체 (아카이브 버전: bcit-ci/ci3-cart-library)

  • Javascript 라이브러리 전체 (원래부터 실험적이었음)

  • Email 헬퍼 전체 (두 함수만 있었음):

    • valid_email() (대신 filter_var($email, FILTER_VALIDATE_EMAIL) 사용)

    • send_email() (대신 mail() 사용)

  • Smiley 헬퍼 전체 (아카이브 버전: bcit-ci/ci3-smiley-helper)

  • 데이터베이스 Forge 메서드 add_column()$_after 파라미터

  • Pagination 라이브러리anchor_class 옵션 (대신 class 사용)

  • 문자열 헬퍼 함수 random_string()uniqueencrypt 옵션

  • URL 헬퍼 함수 url_title()underscoredash 옵션

  • CAPTCHA 헬퍼 함수 create_captcha()$img_path, $img_url, $font_path 파라미터 (대신 배열 옵션으로 전달)

Step 11: 모든 사용자 입력을 검증하고 있는지 확인

Input 라이브러리$_GET, $_POST, $_COOKIE 수퍼글로벌의 사용자 입력을 (종종 무조건적으로) 필터링 및/또는 정제했습니다.

이는 register_globalsmagic_quotes_gpc 가 PHP에 존재하던 과거의 레거시 기능이었습니다. 당시에는 필수였지만, 이제는 그렇지 않으며 전역 필터에 의존하는 것은 잘못된 보안 의식을 줄 수 있는 나쁜 방식입니다.

이 기능이 제거되었으므로, 어떤 이유로든 이에 의존했다면 애플리케이션의 모든 사용자 입력을 제대로 검증하고 있는지 다시 확인해야 합니다 (항상 그렇게 해야 합니다).

Step 12: 출력 캐시 지우기 (선택 사항)

Output 클래스 의 내부 변경으로 인해 웹 페이지 캐싱 기능을 사용하는 경우 오래된 캐시 파일이 남을 수 있습니다.

문제가 되지는 않지만, 지우는 것이 좋습니다.

Step 13: OCI8 get_cursor() 및 stored_procedure() 메서드 사용 제거

OCI8 데이터베이스 드라이버는 더 이상 다른 드라이버에는 없는 두 메서드를 지원하지 않습니다. $curs_id 속성도 제거되었습니다.

이를 사용했다면 oci_new_cursor() 와 공개 접근 가능한 $conn_id 를 통해 직접 커서를 생성할 수 있습니다.

Step 14: $config[‘log_file_extension’] 을 $config[‘log_filename’] 으로 변경

이제 $config['log_filename'] 을 통해 전체 로그 파일명을 지정할 수 있습니다. 새 파일을 복사하지 않은 경우 application/config/config.php 에 이 설정 옵션을 추가하세요.

기존의 $config['log_file_extension'] 옵션은 제거되어 더 이상 작동하지 않습니다. 그러나 기능은 파일명 확장자를 포함하는 새 $config['log_filename'] 에 통합되어 있습니다.