PHP 20

그누보드5 성능 이슈 겪은 것들 정리

한때 그누보드 차세대도 만들고 그누보드를 많이 만졌던 사람이다.그누보드로된 사이트를 운영하며 사람들이 많이 늘어나면 소규모에서는 눈에 띄지않던 문제점들이 부각된다. 오늘은 개인 사이트를 운영하며 일어난 일들의 코드를 살펴보자.그누보드는 2003년에 만들어졌는데 그 시절의 MySQL 에는 MyIsam 이라는 트랜젝션을 지원하지 않던 엔진이 있었다.그이후 InnoDB 엔진에서는 트랜젝션 지원이 되었지만 아마도 하위호환성으로 인해 그누보드에는 트랜젝션 쿼리는 없다. 그누보드는 PHP 가 나온대로 html 과 DB 쿼리, php 함수가 섞여있고 실행순서는 아래와 같다.사용자 요청 -> 요청한 php 파일 -> common.php -> 테마나 스킨 시작 -> tail.php 이다.경우에 따라 tail.php는..

PHP 2025.07.01

PHP 로 된 프로젝트는 왜 유독히...

PHP 는 처음에 템플릿 스크립트로 시작했습니다.그래서 html 과 php 를 섞어쓰는것은 당연했지요. 사람들은 PHP 를 쓰며 여러 문제를 겪었습니다.PHP 가 외면 받는것은 최근 몇년만 보면 비동기 미지원.. 제네릭 미지원 이런게 있겠지만이건 부차적인 문제입니다. 정말로 외면받는것은 PHP 가 처음 나온 방식대로 사용하는 바로 그런 코드들에 환멸 느끼고 사용자가 떠났기 때문입니다.워드프레스, 제로보드, 그누보드, 그 밖에 줌라, EC 큐브 3 등등 공통점은 mvc 가 아니며 인클루드에 인클루드를 반복, 전역변수가 너무나 난무, 함수도 사용안하고 그저 데이터를 html 에 반복하는 코드들입니다. NextJS 14를 보며 저거 옛날 PHP 잖아? 하는건 조롱입니다. 칭찬이 아니구요. MVC 패턴은 은탄환..

PHP 2025.02.17

라라벨의 파사드 찬성/반대 측면

라라벨에서 파사드라는 기능이 있다.이름은 파사드이지만 파사드 패턴을 구현한건아니고 서비스로케이터 패턴을 구현해놨다. 겉으로 보기에는 클래스의 정적매서드를 호출하는것과 같아보인다.실제로는 파사드 호출함수가 런타임에 클래스를 생성하고 캐시를 한뒤 함수를 호출하게된다.여기서 한가지 문제가 생기는데런타임에 동작하므로 IDE 가 해당클래스에 뭐가있는지 알 수없다는것이다.이에 라라벨 커뮤니티에선 파사드 함수에 PHP Doc 을 달면된다고 하고 라라벨프레임워크의 코드도 그렇게 되어있다. 이때문에 파사드를 지지하는 측과 반대하는 측이 종종 레딧에서 온갖 글과 토론이 오간다 파사드 찬성 측 주장- 코드의 간결화- 의존성 주입을 하지않아도 된다.- 파사드를 써도 라라벨에서는 테스트가 가능하게 구현되어있다. 반대 측 주..

PHP 2023.06.08

php 사용자에게 도움되는 사이트

https://modernpug.github.io/php-the-right-way/ PHP: The Right Way 한국어판쉽게 읽을 수 있는 PHP의 베스트 프랙티스, 코딩 표준, 권위있는 튜토리얼로의 링크를 제공합니다.modernpug.github.ioPHP The right way https://refactoring.guru/ko/design-patterns/catalog 디자인 패턴 목록 refactoring.guruPHP 를 비롯한 다양한 언어로 작성된 디자인 패턴 예시들입니다. https://laravel.kr/docs 라라벨 9.x라라벨 한글 메뉴얼 9.xlaravel.kr https://psr.kkame.net/ Introduction - 한글판 PHP Standards Recommend..

PHP 2022.11.20

코드이그나이터 4 REST API 주의점

코드이그나이터 4는 네임스페이스와 라우터에서 REST API를 지원합니다. 라우터 코드이그나이터 4를 설치하면 3과 마찬가지로 함수이름을 이용해서 라우팅이 됩니다. 자동라우터라고 합니다. app/config/Routes.php 파일에 $routes->setAutoRoute(true); 자동라우터 기능이 켜져있을때는 REST API 컨트롤러의 HTTP 메소드로 설정해도 우회방법이 생깁니다. Routes.php $routes->resource('City'); //컨트롤러 클래스를 등록 $routes->post('/', 'City::show'); //연결할 url과 메소드를 string 으로 넘김. show같이 보여주는건 보통 GET메소드를 씁니다. 여기서는 확인을 위해 post를 썼습니다. City 컨트롤러..

PHP 2022.04.14

그누보드 보안 SQL 인젝션 방어하기

그누보드는 sql 쿼리를 문자열 그대로 취급하기에 sql 인젝션 공격 문제가 있습니다.SQL 인젝션 공격을 막기 위해서는 prepared statement 쿼리 일명 바인딩쿼리를 써야합니다.변수자리에 ? 를 넣고 나중에 값을 채우는 방식이라 SQL 인젝션 공격을 막는 확실한 방법입니다.예시)$query = 'select wr_id, wr_num, wr_subject from g5_write_free where wr_id =  ? '; 그누보드 자유게시판에서 게시글 id 가 1 인 글을 불러오는 쿼리입니다.wr_id = ?   //  그누보드에서 쓰는방법common.php 는 많은 일을 합니다.DB 연결, 확장, 라이브러리, 게시물 처리, POST, GET 문자열을 변수화시키는 것들 등등 common.ph..

PHP 2022.03.30

PHP 동작방식 - 생명주기

PHP 재단 소식 보다가 PHP internals Book을 정리한다고 해서 보게 되었습니다. 생명주기: 프로그램은 시작되고 어떤 것이 로딩되고 실행 후 끝나고 하는 생명주기가 있습니다. PHP The internals Book (PHP 내부 동작에 관한문서) 에 관련 내용이 자세하게 나와있습니다. PHP로 작성한 코드를 실행하는 환경은 크게 두 가지가 있습니다. 1) CLI (터미널에서 실행) 하나의 요청을 처리하는 환경, 2) 웹 서버와 SAPI 인터페이스를 통해 여러 웹 요청을 처리하는 환경입니다. 1. 의 경우 간단한데요 php -s 로 시작하는 php내장 개발 서버도 여기에 해당하죠 PHP 엔진에서 해당 프로그램을 실행 후 종료합니다. 2. 웹서비스를 하려면 PHP를 nginx , 아파치등 웹서..

PHP 2022.03.27

PHP 8.1 의 변경점: 클래스 로딩 최적화

PHP 8.1 이 출시되었습니다. PHP 8.1 에는 Enum , Fiber 도입등 다양한것이 있지만 https://github.com/php/php-src/pull/6627 Inheritance cache by dstogov · Pull Request #6627 · php/php-src github.com PHP 프로세스 실행시 클래스 링킹과정을 캐시해서 파일이 변경되기전에 한번만 하게 바뀌었습니다. 5~8% 성능향상이 있다고 밝혔는데요 심포니와 같은 객체지향적으로 작성된 프레임워크들은 많은 클래스를 로딩하게됩니다. 클래스 참조 속도 향상과 링킹과정 캐시등으로 20%의 성능향상이 있네요 반면 절차지향적인 코드인 워드프레스는 3.5%정도로 성능향상이 미미합니다. 국내 CMS 인 그누보드도 성능향상은 미미..

PHP 2021.12.05

PHP 5.2에서 JSON_FORCE_OBJECT 대용

PHP json_encode 에는 다양한 옵션들이 있습니다. 그렇지만 PHP 5.3.3 버전 부터죠 회사에서 레거시 프로그램이 5.2 버전이라 json_encode 의 json_encode($data,JSON_FORCE_OBJECT); JSON_FORCE_OBJECT 를 못쓰고 있는데요. 아쉬운 딴에 json_decode(json_encode($data)); 로 쓰고 있습니다. 웹호스팅인상태라서 PHP 7 버전을 올리려면 서버를 멈춰야하는데 서버를 멈춰가면서 까지 하지는 마라더군요 사실 웹호스팅상태가 아니면 무중단 업그레이드 방법은 많은데 말이죠 아쉽습니다.

PHP 2021.07.05

PHP 에서 select 쿼리 결과값이 않나올 때

PHP mysqli 사용중에 일어난일 입니다. PHP 로 작업중에 mysql 콘솔에서 쿼리를 실행하면 결과가 나오는데 PHP에서 실행하면 row가 0 이 나왔습니다. xDebug로 디버깅하다보니 한글이 들어가면 안되더군요 바로 인코딩 문제였습니다. PHP mysqli로 연결할 때 mysqli_set_charset($conn,'utf8'); mysqli_set_charset()함수로 DB에 연결할 때 DB의 문자인코딩을 설정하면 됩니다. DB 문자열 설정일 euckr 이면 mysqli_set_charset($conn,'euckr'); 이 되겠죠 PHP뿐만 아닌 다른언어를 사용하더라도 발생할 수 있는 문제였습니다.

PHP 2021.06.28