[PHP] mbstring 없이 한글 문자열 다루기

보통 PHP에서 한글 글자수를 센다던가, substr을 통해 자른다던가, 한글자씩 분리한다던가 할 때 php-mbstring 확장을 사용한다.

 

만약 자신이 만들고 있는 PHP 앱이 빠른 속도를 요구한다면, mbstring 확장을 떨쳐 내는 것은 이를 위한 좋은 방법이 될 수 있다. 실제로 해외의 여러 커뮤니티에서도 mb_strlen() 등은 매우 느리다고 이야기하고 있고, 그래서 구글링 끝에 얻은 대안 두 개를 소개한다.

 

1. iconv_

php-iconv 모듈에 속해 있는데 대부분 내장이라 뭘 따로 설치할 필요는 없다.

<?phpn$str = '가나다';necho microtime();nfor($i=0; $i<1000; ++$i){n    mb_strlen($str);n}necho microtime();nnecho microtime();nfor($i=0; $i<1000; ++$i){n    iconv_strlen($str);n}necho microtime();nnecho microtime();nfor($i=0; $i<1000; ++$i){n    count(preg_split('//u', $str));n}necho microtime();

속도를 측정해 보고 싶어서 다음과 같이 코드를 작성 후 실행하였다.

strlen을 측정하는 세 가지 방법을 사용하였다. 각 방법으로 1000회씩 실시해 그 소요시간의 차를 구해보겠다.

 

출력

0.15499200 1620953054

0.15879300 1620953054

0.15879800 1620953054

0.15966200 1620953054

0.15966400 1620953054

0.16053900 1620953054

 

분석해 보면, mb_strlen()은 0.003801초

iconv_strlen()은 0.000864초

count(preg_split(…))은 0.000875초가 걸렸다.

물론 하단에 서술하겠지만 count(preg_split()) 은 함수를 하나 더 써야해서 속도가 더 느릴 것이다.

이렇게 해 보면 mb_strlen이 얼마나 느린 함수인지 알 수 있다.

2. preg_split

출처:

stackoverflow.com/questions/3666306/how-to-iterate-utf-8-string-in-php

 

How to iterate UTF-8 string in PHP?

How to iterate a UTF-8 string character by character using indexing? When you access a UTF-8 string with the bracket operator $str[0] the utf-encoded character consists of 2 or more elements. For

stackoverflow.com

<?phpnfunction u_strlen($text){n    $result = array_slice(preg_split('//u', $text), 1, -2);n    return count($result);n}nnfunction u_substr($text, $offset, $len=null){n	$result = preg_split('//u', $text,-1,PREG_SPLIT_NO_EMPTY);n    return array_slice($result, $offset, $len);n}nnfunction u_strpos($haystatck, $needle, $offset=0){n	$split = preg_split('//u', $haystack,-1,PREG_SPLIT_NO_EMPTY);n    $result = array_slice($result, $offset);n    return array_search($needle, $result);n}nn$sample = '다람쥐 헌 쳇바퀴에 타고파';necho u_strlen($sample); // 14necho u_substr($sample, 1); // 람쥐 헌 쳇바퀴에 타고파necho u_strpos($sample, '쳇바퀴'); // 6n

 

 

 

정규식 함수를 쓰기 때문에 얼핏 보면 느려보일 수 있다. 그러나 메모리를 더 많이 먹을지언정 속도는 더 빨라졌다는 것이 해당 stackoverflow 페이지의 주 내용이다.

 

여기서 주의할 점은, PREG_SPLIT_NO_EMPTY 옵션을 주지 않으면 맨 앞과 맨 뒤에 공백이 생긴다.

[PHP 8] 시작과 끝 문자열 확인하기 – str_starts_with(), str_ends_with()

javascript에는 .startsWith()와 .endsWith() 라는 함수가 각각 시작과 끝 문자열을 반환해주는 기능을 한다.
그런데 PHP에는 이게 없어서 직접 기능을 구현해야 했다.

이 함수는 PHP 8에서 새롭게 추가된 기능인데, 문자열이 특정 문자로 시작하거나 끝나는지의 여부를 bool 형태로 반환한다.

str_starts_with( string $haystack, string $needle )nstr_ends_with( string $haystack, string $needle )nn// 예제n$a = 'abcdefghi';nif(str_starts_with($a, 'a')){n	echo 'Starts with a.';n}else{n	echo 'NOT Starts with a.';n}nnif(str_starts_with($a, 'b')){n	echo 'Starts with b.';n}else{n	echo 'NOT Starts with b.';n}n// Starts with a. NOT Starts with b. 가 출력된다.nn// 예제n$a = 'abcdefghi';nif(str_ends_with($a, 'i')){n	echo 'Ends with i.';n}else{n	echo 'NOT Ends with i.';n}nnif(str_ends_with($a, 'h')){n	echo 'Ends with h.';n}else{n	echo 'NOT Ends with h.';n}n// Ends with i. NOT Ends with h. 가 출력된다.

PHP Lecture 2 – 변수

이번 글의 주제는 ‘변수’입니다.

‘변수’란 ‘어떤 관계나 범위 안에서 여러 가지 값으로 변할  있는 수’를 뜻합니다. (네이버 사전)

 

이제 PHP 상에서의 변수에 대해 알아보겠습니다.

 

1. 변수 선언

$variable = 'value';

$변수명 = ‘값’; 과 같이 새로운 변수를 선언할 수 있습니다.

 

2. 변수 재정의

1에서 설명드렸던 방법과 같이 $변수명 = ‘재정의 값’; 을 통해 변수를 재정의할 수 있습니다.

이렇게 하면 변수의 값이 변경됩니다.

 

3. 변수명

변수에 대해 짚고 넘어가야 할 점 중 하나는 변수명에 제약이 있다는 것입니다.

아래와 같은 이름의 변수는 사용할 수 없습니다.

// 변수명에 숫자 사용 불가n$12345 = '12345';nn// 변수명에 +, - 등의 연산자와 . , @ ! ' " 등은 사용 불가n$h(ell)o! = 'hello world';n$my-name = 'PRASEOD-';n$one+one = 'two';n$don'tusethis. = 'abcd';n...

4. 연산

변수는 연산자를 사용할 수 있습니다.

$a = 1;n$b = 2;necho $a + $b;n// 3이 출력된다.nnecho $a * $b;n// 2가 출력된다.

단순 연산도 가능하고, 괄호를 사용한 혼합 계산 역시 가능하다.

혹은 아래와 같이 계산할 수도 있다.

 

$cost = 100;n$cost += 10; // $cost = $cost + 10; 과 같은 계산necho $cost;n// 110이 출력된다.nn++$cost; // $cost의 값을 1 더하여 111 출력n--$cost; // $cost의 값을 다시 1 빼서 110 출력nn$pre = 'abc';n$suf = 'def';n$pre .= $suf; // $pre = $pre + $suf; 와 같은 계산n// abcdef가 출력된다.

위와 같이 활용 가능하다.

 

5. 문자열과의 혼합

문자열과 함께 쓸 수도 있다.

$v = '나는';nnecho $v.' 글을 씁니다.';necho "$v 글을 씁니다."; // 큰따옴표만 사용해야 함.n// 둘 다 '나는 글을 씁니다' 가 출력된다.nn$x = '글을';nnecho "나는 ".$x." 씁니다.";necho "나는 $x 씁니다."; // 큰따옴표만 사용해야 함.n// 둘 다 '나는 글을 씁니다' 가 출력된다.nn$z = '밥';nnecho "잡곡".$z;necho "잡곡{$z}";n// 둘 다 '잡곡밥' 이 출력된다.

이 정도면 기초적인 활용법은 끝났습니다.

이들을 자유자재로 활용할 수 있어야 합니다.

PHP Lecture 1 – 시작

PHP란 무엇인가?

 이 질문으로 시작해 보겠습니다.

PHP는 웹 분야에서 주로 쓰이는 프로그래밍 언어의 하나로, 원래 Perseonal Home Page Tools의 약자로, 현재는 PHP – Hypertext Preprocessor 의 약자로 사용하고 있습니다.

이 언어는 TIOBE에서 선정한 2020년 10월 기준 검색어 점유율 상위 20개 프로그래밍 언어 중 8위를 차지했습니다.

 

PHP의 주 특징 중 하나는 바로 서버 사이드 언어라는 것입니다. 본 블로그에서는 현재 최신 버전인 PHP 7.4를 기준으로 포스팅을 작성할 예정입니다.

 

PHP 시작하기

웹 서버에서 PHP를 사용하기 위해서는 서버에 PHP가 설치되어 있어야 합니다.

Ubuntu 20.04 / NGINX 기준으로 설명하겠습니다. NGINX는 설치되어 있다고 가정합니다.

 

1. CLI에 접속해 다음 명령어로 PHP를 설치합니다.

> $ sudo apt-get -y install php[버전]

PHP7.4 기준으로 다음과 같이 입력합니다.

> $ sudo apt-get -y install php7.4

같이 설치되는 패키지는 그냥 설치하시면 됩니다.

 

2. NGINX 설정 파일의 서버 영역에 다음 부분을 추가합니다.

server {n	...n  	index index.php index.html;n	...nn	# pass PHP scripts to FastCGI servern	#n	location ~ \.php$ {n		include snippets/fastcgi-php.conf;n		include fastcgi_params;	nn	#	# With php-fpm (or other unix sockets):n		fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;n	#	# With php-cgi (or other tcp sockets):n	#	fastcgi_pass unix:/run/php/php7.4-fpm.sock;n		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;n		fastcgi_read_timeout 300;n	...n	}n}

혹시 PHP 소켓 위치가 다르다면 php7.4-fpm.sock의 위치를 수정해 주시면 됩니다.

index에 index.php를 추가하셔야 디렉토리로 접근했을 때 자동으로 index.php를 로드하게 됩니다.

이 단계를 거치지 않는다면 URL을 통해 PHP 파일로 접근했을 때 PHP 파일을 다운로드하는 창이 뜰 것입니다.

 

설정 후 다음 명령어를 입력하여 NGINX 설정 파일의 오류를 확인합니다.

> $ nginx -t

 

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

실행 후 이러한 문구가 보였다면 정상입니다.

 

설정 후 다음 명령어를 입력하여 NGINX를 다시 시작합니다.

> $ sudo systemctl restart nginx

 

코드를 써보자

 

PHP는 스크립트 실행 영역을 직접 정의할 수 있습니다. 정의는 아래와 같이 이루어집니다.

 

<?phpn // Write Something Here...n?>

 

<?php와 ?> 사이에 PHP 코드를 작성하면 됩니다.

다음 글에서는 PHP 코드에 대해 알아보겠습니다.