Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

php7 에서 cond 문법 안되는거 해결 안되나요? #2237

Closed
wookho opened this issue Mar 7, 2018 · 63 comments
Closed

php7 에서 cond 문법 안되는거 해결 안되나요? #2237

wookho opened this issue Mar 7, 2018 · 63 comments

Comments

@wookho
Copy link

wookho commented Mar 7, 2018

공홈에 알려진 내용등 모든 조치를 했지만
cond 조건이 무시되어서 조건에 맞지 않는 출력이 되어 곤란합니다.

이거 해결책이 도저희 없는건가요?
if 문으로 고쳐서 쓰기 힘드네요.

@kijin
Copy link
Contributor

kijin commented Mar 7, 2018

이게 은근히 고치기 힘들어요 ㅜㅜ
서버 환경, 템플릿 파일의 정확한 내용, 경로 등이 모두 일치해야 증상 재현이 가능합니다.

@ghost
Copy link

ghost commented Mar 7, 2018

@wookho

classes/template/TemplateHandler.class.php 파일을 아래와 같이 수정 후 확인 가능할까요?
450라인 부근의 _parseInline()의 첫번째 if문의 변경입니다.

private function _parseInline($buff)
{
	if(!preg_match_all('/<([a-zA-Z]+\d?)(?:\s)/', $buff, $match))
	{
		return $buff;
	}

	...
}

@ghost ghost self-assigned this Mar 7, 2018
@ghost
Copy link

ghost commented Mar 7, 2018

cond, loop를 포함하는 태그만 걸러내던 것을 모든 태그 이름을 찾아내도록 단순화 했습니다.
(어차피 뒤에서 다시 찾거든요)

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bnu 마찬가지로 if 문이 아니면 안됩니다.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

cond="$comment->getProfileImage()"

() 이런 문자가 영향을 주는건 아닌가요?

@ghost
Copy link

ghost commented Mar 7, 2018

@wookho 문제되는 템플릿 파일(코어의 것은 제외)의 크기(용량)를 알려주세요.
파일을 주실 수 있다면 bnu@xpressengine.com 으로 부탁드립니다.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bnu raed.html 파일에서 comment.html 을 불러옵니다.
문제가 되는 코드는 comment.html에 있습니다. 글 읽는 화면에 list도 뿌려줍니다.

read.html -> 36k
comment.html -> 22k
_list.html 파일들은 ->5k 내외

입니다.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bnu 지금 문제가 되는 템플릿 말고 직전에 문제가 되어 내용 일부 style을 덜어내고 해결했을때 상황입니다.

<div class="fb_node ind{$comment->get('depth')}" style="width:40px;" cond="$comment->get('depth') > 0 && $comment->get('depth') <= 5">ㄴ</div>

이게 템플릿에 작성된 코드였고..
에러가 발생해서 에러기록모듈에 기록된 코드는
<div class="fb_node ind<?php echo $__Context->comment->get('depth') ?>" style="width:40px;" cond="$comment->get('depth') > 0 && $comment->get('depth') <= 5">ㄴ</div>

이렇게 되어 있었습니다. 혹시 정보가 될까 해서 적어보았습니다.

cc : @kijin

@kijin
Copy link
Contributor

kijin commented Mar 7, 2018

@wookho 음... 템플릿 핸들러가 잘못 해석할 만한 < > 등의 문자가 많이 보이는군요.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@kijin 오늘 발생한 문제는 비교적 간단한
cond="$comment->getProfileImage()"
이었습니다.

@bjrambo
Copy link
Contributor

bjrambo commented Mar 7, 2018

@wookho 일부 코드에서 발생되어서 나타나는 문제일수도 있고 그래서... 이 부분은 재대로 스킨파일을 비누님께 제공해주세요..

템플릿 오류는 다양한 원인때문에 생기거나 메모리리밋등 다양하게 있어서 직접적으로 구현할 수 있는 환경을 제공해주는 것이 확실하답니다..

이렇게 댓글에 댓글이 길어지면 길어지기만 할뿐, 재대로 해결하기까지의 시간은 점점 늘어질 수 있습니다..

@kijin
Copy link
Contributor

kijin commented Mar 7, 2018

저 부분에서 오류가 발생했을 뿐, 실제 원인을 제공한 코드는 다른 곳에 있을 수도 있습니다. 템플릿의 특성상 한 군데가 잘못 해석되면 연쇄작용으로 줄줄이 밀리다가 엉뚱한 데서 터지거든요...

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bjrambo 요청하신 파일용량까지 정보 제공 해드렸고 문제가 되는 템플릿들 다 드려야 하는 상황이 아닌 듯 합니다.

굳이 필요하다면 드릴 수는 있지만 저희 사이트에서 사용하는 부분이 굉장히 많이들어간 수정된 상용템플릿이라 용량확인 외 다른 것이 필요한지 아직 요청이 없어 드리지 않았습니다.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

그리고 지금 공통적으로 나타나는 현상이 템플릿 내용을 많이 줄이면 오류가 없어진다는 것 입니다.

@bjrambo
Copy link
Contributor

bjrambo commented Mar 7, 2018

@wookho 템플릿관련 오류는 앞서 기진님께서 말씀하신 것 처럼 다양한 에러가 있고 진짜 용량의 문제가 있을 수 있어요..

이 이슈의 비슷한 이슈가 있는 cameron위젯의 오류도 라이믹스에서는 전혀 문제 없는데 XE1에서는 문제가 발생하는 경우가 있습니다. (같은서버환경에서요..)

그만큼 메모리가 어디에서 빠져나가는지 등등을 확인할려면 그 환경을 그대로 구축할 수 있는 환경이 더 필요해요.. 그래서 템플릿 파일을 직접 개발자에게 제공해드리라는 말씀이였습니다.

마침.. 비누님께서도 제공해줄 수 있으면 이메일으로 메일을 전달해달라고 말씀도 하셨고요..

XE팀에서 제공해주신 템플릿을 마음대로 배포할 권리도 없을꺼요. 오류 해결을 위해 잠깐 쓰고 폐기 처분내릴 것 같은데, 일딴 제공을 하여 어디에서 문제가 발생되는지 명확하게 버그 찾을 수 있도록 해주시는 편이 좋을 것 같다고 제 의견을 드린 것 입니다. ㅎㅎ

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bjrambo 글쎄요. 저는 그렇게 생각하지 않고 있습니다.
용량을 알려주세요 or 파일을 주실수 있으면 주세요.

@bnu 께서 다시 요청을 하셨을때 드릴지 고민을 해 보고 결정하겠지만 지금까지 제 판단은 그렇습니다.

https://xetown.com/qna/915494

이 게시글의 댓글을 보시면 상황을 아실 것이고 이미 알고 계실거라 생각합니다.

@bjrambo
Copy link
Contributor

bjrambo commented Mar 7, 2018

@wookho 상황만 짐작가능할뿐 실제 원인은 찾지 못합니다...

이 댓글을 마지막으로 저는 더 이상 이 이슈에 관여 안할께요.

죄송합니다. (_ _ )

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bjrambo 같은 템플릿이라도 제 서버가 아니면 확인이 어렵다는 의견입니다.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

지금 저희 서버에서 php7 으로 변경하면서 문제가된 스킨중 하나는
플랫보드 스킨입니다. 레이아웃과 함께 써야 하는 스킨이고 @bjrambo 님도 가지고 계신 스킨입니다.

<div class="profile-image pad">
<img src="{$comment->getProfileImage()}" alt="profile image" width="40px" height="40px" cond="$comment->getProfileImage()" />
</div>

comment.html 파일입니다.

pad 사이즈에서 프로필이미지를 보여주는 부분의 cond 조건이 걸리지 않는 문제입니다.

제 파일을 드리긴 어려울 것 같으니 이정도 정보를 알려드리겠습니다.

@ghost
Copy link

ghost commented Mar 7, 2018

@wookho
classes/template/TemplateHandler.class.php
__construct()에 다음과 같이 ini_set()을 추가하여 확인 부탁드립니다.

public function __construct()
{
	ini_set("pcre.jit", 0);
	$this->xe_path = rtrim(getScriptPath(), '/');
	$this->compiled_path = _XE_PATH_ . $this->compiled_path;
}

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bnu 해당부분 추가해서 확인해봤는데
여전히 프로필이미지 없는 회원의 프로필 이미지를 불러오려해서 없는 이미지가 뜨네요.

@ghost
Copy link

ghost commented Mar 7, 2018

@wookho 브라우저 소스에서 <img src="{$comment->getProfileImage()}" alt="profile image" width="40px" height="40px" cond="$comment->getProfileImage()" /> 등의 코드가 그대로 노출되나요?

PHP 버전 좀 알려주세요. PHP 업데이트 내역을 보니 관련해서 패치가 자주 있었네요.저는 PHP 7.1.12 버전에서 확인하고 있습니다.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bnu 소스가 노출되는 문제가 아니구요. cond의 조건이 동작하지 않는 문제입니다.
php7.0 입니다.

cond="$comment->getProfileImage()" 조건에 만족하지 않는 프로필 이미지가 없는 회원의 이미지도 불러오는 현상이죠.

조건이 걸려있기 때문에 조건에 맞는 상황에서만 저 소스가 동작해야 하지만 조건이 없는 것이랑 같은 결과를 보여주는 것 입니다.

@ghost
Copy link

ghost commented Mar 7, 2018

@wookho 템플릿이 해석되지 않아 발생할 수 있는 증상일 수 있습니다만, 이 이슈에서는 프로필 이미지가 깨져보이는 것이 템플릿 파서의 문제인지 확인을 위해 소스보기에서 템플릿 문법이 그대로 노출되느냐 아니냐의 확인이 필요합니다.

ini_set("pcre.jit", 0); 추가  및 _parseInline()의 if문 변경이 적용된 상태에서, 브라우저 소스 보기에서 템플릿 문법이 해석되지 않고 그대로 노출되는지 확인 부탁드려요.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bnu

개발자도구에서 본 것이구요.

<div class="profile-image">
					<img src="" alt="profile image" width="40px" height="40px" cond="$comment->getProfileImage()">
				</div>

소스보기 입니다.

<div class="profile-image">
--
  | <img src="" alt="profile image" width="40px" height="40px" cond="$comment->getProfileImage()" />
  | </div>

말씀하신 부분이 소스에서 cond="$comment->getProfileImage()" 이부분이 보이냐고 물으신거면 맞습니다.

@ghost
Copy link

ghost commented Mar 7, 2018

@wookho 네. 맞습니다. 확인 감사합니다.

ghost pushed a commit that referenced this issue Mar 7, 2018
- 일부 해결됨을 확인하였으나, 다양한 환경에서 문제가 여전히 나타날 수 있음
@ghost
Copy link

ghost commented Mar 7, 2018

일부 환경에서 재현되고 해결이 확인된 내용으로 처리했습니다.
정규식의 최적화가 주요 해결 방안이 될 것 같은데, 템플릿 변환에 문제를 일으킬 수 있는 민감한 부분이고 재현이 어려워 간단치 않을 것 같습니다.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bnu 일부 환경에서 해결.. 저희는 해당 사항이 없는 것이군요..
어떤 자료들이 또 문제를 일으킬지...

같은 템플릿에 바로 연이어..

<block cond="$comment->get('best_comment')=='Y'">
<block cond="$comment->get('voted_count') >= 1 && $comment->get('voted_count') <= 2 && $mid=='pom_QnA'">

이렇게 동일한 것들이 사용되는데 전혀 문제가 없는데 문제가 되는 경우가 참 신기합니다. 지금 위에 적은 것 보다 바로 위에 위치한 코드인데 그것은 문제가 되구요..

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bjrambo 스킨 파일 제공이 이 문제 해결임을 강조하는 것 좀 그렇습니다.
@bnu님 해결이 이 것이 좌우 한다면 드리겠습니다. 말씀 해주세요.

제가 BNU님과 이 문제를 해결하기 위해 노력을 했고 그리고 저도 나름 이문제에 관해 많이 공유를 받아봐서 제가 제 파일을 드린다해도 절대 bnu님이 가지신 서버에서 재현 못하는 것 알 고 있습니다.
그래서 현실적 판단으로 드리지 않은 것 입니다.

차라리 제 서버에서 디버깅을 하겠다면 저는 그것을 원합니다.
개인이 수정하고 만든 고친 템플릿도 사실 남에게 보이고 싶지 않은 프라이빗 한 것들이 많습니다.

@ghost
Copy link

ghost commented Mar 7, 2018

https://3v4l.org/UloFT
이런 짧은 코드에서도 문제가 나타나는 경우도 있어서 쉽지는 않을 것 같습니다.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bnu 네. 해결책이 나오거나 혹은 제가 php 변경을 하기까지 문제가 발생하는 스킨들이 있다면 고쳐서 사용해 볼게요.
일단 저 같은 경우 문제가 되는 것 발견하면 회피해서 수정할 정도는 되니 개인적으로 대응해 보겠습니다.

@kijin
Copy link
Contributor

kijin commented Mar 7, 2018

@wookho 네, 공개된 장소에 스킨을 올려 달라고 말씀드린 것은 아닙니다.

@bnu 문제 해결에 도움이 된다면 @wookho 님 서버와 동일한 환경으로 하나 구축해 드리거나, 동일 서버 내에서 실제 사이트에 영향을 주지 않고 테스트할 수 있는 공간을 마련해 드릴 수 있습니다.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@kijin @bnu 님께서 현실적으로 어려워 하고 계시는데 왜 주변에서 이야기 하시는지 저로선 이해가 잘 안갑니다.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bnu 스킨 파일 드리면 될까요?

@lalafellsleep
Copy link
Contributor

@wookho XE문법은 정규 문법이 아닌 정규식으로 구현되고 있는 일종의 간이 스크립트 입니다. 즉 HTML을 파싱하여 구분한다고 해도 사용자가 어떻게 XE문법을 입력할 지 모르고 서버의 환경과 테스트 환경도 매번 다릅니다. 그래서 #2220 에서 @kijin 님이 서버 환경을 물어보신 것 같습니다. 이후 5.6 7.0. 7.1 7.2 모두 설치하여 테스트 했으나 해당 문제는 모든 환경에서 나타나고 있었습니다. (실제로 제가 1.7버전을 마지막으로 호스팅사에서 썼을때도 봤으니 매우 오래된 문제겠죠) 그래서 이미 현재의 XE문법을 기준으로 작성된 많은 프로그램들에 영향을 줄 수 있는 하이코스트 문제가 됩니다. (리스크도 크구요) 물론 좀 더 해당 환경을 재현하여 그러한 문제에 맞닿았을 때 우회할 수 있도록 제공을 부탁드리고 계신 것 같습니다.

@kijin
Copy link
Contributor

kijin commented Mar 7, 2018

@wookho 주변에서 참견하는 거 아닙니다. XE 개발팀과 라이믹스 개발팀은 이런 종류의 문제에 대해서는 많이 협력하고 있습니다. 또한 코어 개발에도 참여해 보았고 템플릿 핸들러도 많이 건드려 본 사람으로서 이런 버그를 잡으려면 무엇이 필요한지 잘 알고 있기 때문에 말씀드린 것입니다.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bnu 님께서 제가 가진 지금 그대로의 스킨이 필요하신지 말씀 해주시면 좋겠습니다.
@kijin 님께서 제 파일을 가지고 디버깅을 하실 것이라면 드리겠습니다.

그런데 제가 이야기 하는 것은 @bnu 님께서 이 방법을 선택하고 계시지 않는다는 점 입니다.
제가 잘못 판단한 것일까요??

@kijin
Copy link
Contributor

kijin commented Mar 7, 2018

@wookho 네, 스킨 파일을 메일로 전달해 주세요. 지금 곧 XE에 적용할 수 있는 해결책이 나온다는 보장은 없습니다만, 어떤 문법의 어떤 조합이 문제를 일으키는지라도 찾아보겠습니다.

@ghost
Copy link

ghost commented Mar 7, 2018

@wookho kijin님과는 항상 의견을 주고 받고 있고, 이 이슈에 관해서도 별도로 많은 대화를 나눴습니다.
kijin님께서 적극적으로 이슈에 참여해주시는 것이니 양해 부탁드립니다.

저는 또 다른 환경을 구축해서 살펴보도록 하겠습니다.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@kijin 메일로 레이아웃,보드스킨 첨부해서 보내드렸습니다. 저희 사이트에 맞춰서 들어간 부분중 그냥 웃고 넘어갈 부분들은 넘어가 주세요. 말도 안되는 코드들도 많을 테니까요.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bnu 님 파일을 메일로 보내드릴지 여부 알려주세요.

@ghost
Copy link

ghost commented Mar 7, 2018

@wookho 네. bnu@xpressengine.com으로 부탁드립니다.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bnu 구글에서 차단한건지 공홈메이에서 차단한건지 바이러스가 포함될 우려가 있다고 전송을 차단합니다.

@ghost
Copy link

ghost commented Mar 7, 2018

@wookho 아. 그럼 bnufactory@naver.com으로 부탁드립니다.
google 시스템에서 차단하는 것 같습니다.

@lalafellsleep
Copy link
Contributor

@wookho JS가 전송할 파일 내에 포함되어 있나요? 그런 경우 메일이 전송되지 않을 수 있습니다. 조금 특별한 압축 방식을 사용하거나 하셔야 할 것 같네요...

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bnu 메일로 보낼수가 없어서..
https://www.xpressengine.com/service_help/23261237

첨부 했습니다. 비밀글로 했구요.

레이아웃과 보드스킨이 css 등이 혼용되는 자료입니다.

저희가 사용하고 있는 그대로를 보내드립니다.

댓글 출력하는 부분에서 댓글 작성자 프로필이미지를 조건에 따라 출력하는 부분에서 문제가 발생하고 있습니다.

다운받으시고 게시글 삭제하시면 됩니다.

@ghost
Copy link

ghost commented Mar 7, 2018

@wookho 확인했습니다. 감사합니다. 문제가 재현됐으면 좋겠네요.

@ghost
Copy link

ghost commented Mar 7, 2018

@wookho 문제가 재현되었고 원인도 찾았습니다.
따로 메일로 드려야 할 것 같은데 메일 주소 하나 남겨주시거나 bnu@xpressengine.com 으로 메일 주시면 회신하겠습니다.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

@bnu 메일 하나 보내드렸습니다.

@wookho
Copy link
Author

wookho commented Mar 7, 2018

템플릿에 오타가 있었던거군요. 그럼 오늘 코어에서 조금 변경된 코드로 왠만한 문제는 해결이 된다고 보는게 맞을까요? 저희 스킨의 문제로 괜한 시간을 보냈네요. 죄송합니다.

@lalafellsleep
Copy link
Contributor

@wookho #2220 와 같이 기본적인 부분에서도 발생했던 문제라 또 어디서 어떻게 잘못될 지 모르니 기여하신게 아닐까요? 죄송할 필요까지는 ㅠ_ㅠ

@ghost
Copy link

ghost commented Mar 7, 2018

@wookho 문제를 찾아서 속이 시원하네요. 다른 문제도 찾아서 고칠 수 있었고요. 감사합니다.

일단 제 환경에서(PHP 7.1.12, PCRE 8.38)에서 사이트맵 관리 페이지에서 발견하고, PHP 7.0 이상에서 발생할 수 있는 문제로 추정하고 있습니다. 해당 문제가 얼마나 많은 곳에 영향을 주었을지는 모르겠지만 유사 문제를 겪던 곳에서는 해결되었으리라 생각합니다. 정규식 관련 라이브러리와 PHP 자체 버그도 PHP 여러 버전에 걸쳐 고쳐지고있기 때문에 발견하지 못한 문제가 있을 수 있습니다.

이 이슈는 사용한 템플릿 코드에 문법 오류가 있었던 것으로 이슈를 종료합니다.
템플릿 코드와 관련하여 추가 문제를 겪는 분이 계시다면 새로 이슈를 작성해주세요.

@ghost ghost closed this as completed Mar 7, 2018
@lalafellsleep
Copy link
Contributor

@bnu #2220 도 해결된 것으로 보이네요 issue close 하셔도 될 것 같습니다.

@ghost
Copy link

ghost commented Mar 7, 2018

@laiglinne-ff 확인 감사합니다 👍

@ghost
Copy link

ghost commented Mar 7, 2018

집에 가야지

@wookho
Copy link
Author

wookho commented Mar 7, 2018

오늘 제 삽질이 완전히 헛 삽질은 아니었다고 위안해 봅니다 ㅡㅡ;

@ghost
Copy link

ghost commented Mar 7, 2018

@wookho 헛되지 않았어요 :)

This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants