포럼
php 정수형에 대해 논의해봅니다.
2012.02.29 21:19
제가 프로그램쪽은 잘 몰라서 지식이 많이 부족합니다.
앞으로 이야기하는 내용에 잘못된 점은 지적해주시고 좋은 방법이 있다면 이야기해주셨으면 합니다.
XE의 core중 core는 sequence설계입니다. XE는 그 sequence를 담을 정수형을 bigint로 설정하였습니다.
bigint
-2^63(-9223372036854775808) ~ 2^63-1(9223372036854775807) 8바이트
최대수인 값을 직접 document_srl에 입력 한 후 돌려보았습니다. 문제없이 조회, 수정 되었습니다. 하지만 저의 고민은 이곳이 아닌 다른곳에서부터 시작되었습니다.
function getNumberingPath($no, $size=3) { $mod = pow(10, $size); $output = sprintf('%0'.$size.'d/', $no%$mod); if($no >= $mod) $output .= getNumberingPath((int)$no/$mod, $size); return $output; } echo getNumberingPath(9223372036854775807);
결과
-01/000
일반 php로는 수를 담고 출력은 되지만 연산이 들어가게되면 올바른 처리를 하지못하게 됩니다.
9.22337203685E+18
실제 저런 터무니 없는 수까지 도달은 상당히 어려우니 일단 어느자릿수부터 문제가 나왔는지 테스트해보았습니다.
echo getNumberingPath(999999999);
결과
999/999/999
php의 조건상 9자리실제 10자리까지가 한계입니다.
XE는 sequence가 9자리를 넘어가게되면 모든 기능이 전부다 정상적인 동작이 되지 못하며, 첨부파일 등 sequence를 연산하는 곳에 대해서 문제가 발생하고 맙니다. 이 말은 결국 XE가 사용하가능한 데이터의 수는 000000000~999999999 = 1000000000 이라는 결과가 됩니다.
9.22337203685E+18처럼 나오는 수를 숫자모양처럼 나오게는 가능합니다.
function getNumberingPath($no, $size=3) { $mod = pow(10, $size); $output = sprintf('%0'.$size.'d/', sprintf("%.0f",$no)%$mod); if($no >= $mod) $output .= getNumberingPath((int)sprintf("%.0f",$no)/$mod, $size); return $output; } echo getNumberingPath(9223372036854775807);
결과
647/484/147/002/
하지만 이것은 그냥 그럴듯하게 보이게할뿐 결코 올바른 정보가 아닙니다. 입력한 숫자가 10자릿수를 넘는 순간 저 수만 나오게되니까요.
제가 이 문제 때문에 짧은 시간이지만 몇일간 여러 자료를 보고 검색을 해보았지만 결국 일반 php를 이용해서는 극복이 안되는걸로 결론을 냈습니다. 만약 이 부분에 대해서 규칙에 얽매이지 않고 연산처리없이 받은 수 그대로 폴더를 생성해낸다면 XE가 사용가능한 데이터 수는 bigint 자료형 그대로 사용되지 않을까 생각합니다.
연산처리 외에 기본적인 처리에 대해서는 pico님께서 이슈를 이미 남기셨더군요.
XE공홈에 sequence는 현재 8자리이네요. 앞에 설명한대로 10자리부터 이상증상이 나온걸 고려해본다면 9자리의 도달은 지극히 일반적이며 결코 무한이 아니라고 봅니다.
위의 문제점에 대해서 XE개발팀 이하 고수여러분들께서 좋은 방법이나 해결 방향을 고민하고 계시다면 어떠한 방법을 해보고계신지 이야기해주셨으면 합니다.
- [2019/03/18] 포럼 XE 레이아웃 제작 일주일 코스
- [2019/01/18] 묻고답하기 모바일에서 서 레이아웃 비정상 문의드려요
- [2018/12/31] 묻고답하기 슬라이드 위젯 삽입 후 메뉴가 안보이네요 고수님들 부탁드립니다 *6
- [2018/11/21] Blog [XE3] XE Store 사업설명회 행사 안내 - 2018년 12월 5일 *2
- [2018/03/28] 묻고답하기 $oMail->setSender Sender 이메일 발신자가 공백으로 나옵니다. *3
댓글 8
-
카르마
2012.03.01 22:36
-
라르게덴
2012.03.01 23:13
PHP Version 5.2.14
PHP Version 5.2.11
제 호스팅과 제 컴 두군데에서 테스트했었고요, PHP가 안된다는게 아닌 일반 PHP 라는 점을 말씀드립니다. 정수형 8byte 를 처리할 수 있는 라이브러리를 컴파일하거나 하면 되지만 제가 짚고싶은 부분은 코어의 문제점이기 때문에 일반적으로 안되는 대상이 많다면 개선을 고민해야한다고 생각합니다.
-
카르마
2012.03.02 09:18
제가 깜빡했네요.
제가 테스트한 두개의 PHP5 서버가 64bit네요...끙~~ 지송...
-
misol
2012.03.02 08:47
정수형으로 처리하지 말고, string으로 타입을 변경한 다음 세글자씩 자르는 식으로 처리해도 동일한가요??.. ㅠㅠ 실험 해볼 형편이 안되어 이렇게 씁니다. -
라르게덴
2012.03.02 23:29
string으로 넘길때 값이 짤리거나 정상적인 값이 들어가지 않습니다. 값을 가공하거나(타입도) 연산시에는 본연의 값을 처리하지 못하게 됩니다.
-
sol
2012.03.02 10:27
64bit OS와 PHP로 전환이 가장 좋은 방법일 듯 싶습니다.
-
라르게덴
2012.03.02 23:28
64bit OS 선택에 대한 이야기는 오늘 처음 알았네요. 프로그램 업계에서는 상식일 수도 있지만 XE가 이것에 영향을 받는지 안받는지는 확실히 소개해둘 필요가 있을 것 같습니다.
XE 설치환경 소개에 권장사항으로 64bit 사용을 권장하고 32bit 사용지 정수형 문제점에 대해 소개해주셨으면 좋겠습니다.
XE 사용자, 개발자 매뉴얼도 마찬가지 -
또별
2013.12.27 19:31
쪽지모듈 같이 순간적으로 몇천개씩 마구 증가하는 모듈은 개발자가 독립적으로 시리얼을 부여할수 있게 하면 좋겠는데..모든 테이블의 레코드를 다 시퀀스 하니..걱정입니다. 앞으로 수많은 모듈들이 개발되어 쏟아져 나올건데, 정말 걱정입니다.
개발팀에서 이 문제에 대해서 명확하게 [어떻한 문제가 발생할수 있는지 예상되지만 그에 대해서 어떻게 대응할 것이다]라고 속시원하게 발표해 주시면 정말 좋겠습니다. 대책도 없이 그냥 가고 보자는 건지..뭔가 걱정없이 가도 상관없는건지..한 번쯤 공식적으로 공개해 주시면 좋겠습니다. 앞으로 XE로 만든 싸이트에서 네이버보다 더 큰 싸이트로 성장할 싸이트들이 많이 나올것 같은데..그런것은 전혀 고려하지 않는건지..단지..빅데이터 활용하듯 정보수집에만 고려한것인지..어떤 장점이 있는건지..너무 궁금합니다.
글쓴이 | 제목 | 최종 글 |
---|---|---|
푸시아 | 네이버 로그인 서비스 [10] | 2014.07.16 by chansol |
이즈야 | 와우... Ajax에 첫 발을 들여놓았습니다. [7] | 2013.12.28 by scepter83 |
리크스 | XE의 시퀀스 넘버와 유튜브와 같은 문자 형식은 차이점이 무엇인가요? [2] | 2013.12.28 by 도라미 |
socialskyo | 제로보드의 추억. [8] | 2013.12.28 by 권태성 |
메테워 | css , js브라우저캐시? [3] | 2013.12.28 by explode |
콩치 | [토론] XE의 모듈을 정의내린다면? [15] | 2013.12.28 by sejin7940 |
nado0124 | 개발자 포럼이 앞쪽으로 갔네요. 개발자 우대...^^ | |
푸시아 | xe개발자 vs xe사용자 [4] | 2013.12.27 by XE |
misol | 개발자 포럼 글 관리 규칙 [5] | 2013.12.27 by 또별 |
2donggalbi | 사이트가 리뉴얼되는 건가요? [3] | 2013.12.27 by 2donggalbi |
졸라맨 | menu_pop_area 팝업메뉴 수정에 관한 포럼. [3] | 2013.12.27 by 졸라맨 |
라돌체 | 본문에 이미지 뽑아오기 되신 계시나요? | |
라르게덴 | php 정수형에 대해 논의해봅니다. [8] | 2013.12.27 by 또별 |
socialskyo | XE 마켓의 긍정적인 효과 [1] | 2013.12.27 by 쿡래빗 |
socialskyo | 네이버 이미지 검색 컴포넌트의 이미지를 XE가 섬네일을 생성 못하는듯 하네요.. | |
벨몽이 | xe github에서 코멘트없이 closed된건 반영안된건가요? [6] | 2020.03.14 by 벨몽이 |
너부리야 | jquery 사용과 관련해서 말입니다. [2] | 2013.12.27 by 너부리야 |
좋은친구들222 | 1.7.3.6 버전에서 블로그 api 쓰시는분 계신가요? | |
bigblue2010 | Vimeo 썸네일 자동추출 어떻게 안될까요? ㅠㅠ [1] | 2013.12.26 by ToFinder |
휘즈 | ㅋㅋ 너무 어렵네^^; [3] | 2020.03.14 by BNU |
같은 소스 다른 결과입니다.
라르게덴님 테스트 환경이 PHP4이신가요??
PHP4 : 000/000/
PHP5.2 : 807/776/854/036/372/223/009/
PHP5.3 : 807/776/854/036/372/223/009/
function
getNumberingPath(
$no
,
$size
=3) {
2.
$mod
= pow(10,
$size
);
3.
$output
= sprintf(
'%0'
.
$size
.
'd/'
,
$no
%
$mod
);
4.
if
(
$no
>=
$mod
)
$output
.= getNumberingPath((int)
$no
/
$mod
,
$size
);
5.
return
$output
;
6.
}
7.
8.
echo
getNumberingPath(9223372036854775807);
PHP4에서는 문제가 되지만
PHP5에서는 잘 동작하는 것같습니다.