PHP 파일이 불규칙적으로 중복 실행됩니다. 웹브라우즈는 정상으

morning의 이미지

저는 원맨컴퍼니 사장겸 개발자겸 백수인 설호규입니다. 지난 1년 6개월간 개발한 쇼핑몰
솔루션을 마무리 작업을 하면서 제 수준에서는 이해가 되지 않은 현상을 발견하여 조언을 구
하고자 글을 올립니다. 같이 지내는 방돌이도 도무지 갈피를 못 잡겠다고 합니다.지난 3일간
이 스트레스로 살이 3Kg은 빠진 듯 합니다. 휴~~~
일단 제가 발견한 오류는 웹브라우즈/웹서버가 간혹 일부 페이지를 중복 실행된다는 것입니
다. 이용자가 보는 유저 화면에서는 1회 실행한 결과가 나오지만 서버 쪽에 기록된 로그를
보면 분명 중복실행되어 있습니다. 현재 웹브라우즈 쪽인지 아파치 웹서버 쪽인지는 모르겠
습니다.
이 중복실행이 일정한 현상을 보인다면 제가 작성한 스크립트의 문제이겠지만 상황에 따라
중복 실행이 되기도 하고, 그렇지 않기도 하고... 심지어 3번 실행이 됩니다. 복잡한 연산을
하는 페이지는 물로 카테고리 상품리스트 보여주는 곳에서도 이런 문제가 있습니다. 문제가
발생하는 페이지는 전체 페이지에서 0.2~1%로 미미하지만 쇼핑몰이다 보니 치명적인 문제
입니다.
제가 받는 느낌은 웹브라우즈나 OS가 어떤 오류를 만나면 웹페이지를 읽어 들이면서 순차적
으로 2~3개의 쓰레드를 만들어서 해당 페이지를 각각 연다는 느낌입니다.
서버 환경은 Red Hat Linux 9 에 있는 기본 APM을 그대로 사용하고 있습니다.
자세한 상황은 아래의 내용을 보세요.

참고1. 기록된 로그 정보
참고2. 로그 기록시 사용한 스크립트.

- 원래 로그 자료가 있는데 조금 복잡해서 올리지 않았습니다.

3. 재미 있는 문제 상황들.

가. 네스케이프가 중복 실행이 비교적 적으며, 익스플로의 경우에는 중복 실행되는 경우가
많으며 심지어 3번 실행되는 경우도 있습니다.

나. 중복 실행이 자주 일어나는 파일과 그렇지 않은 파일들이 있습니다. 주로 중복 실행이 일
어나는 파일들은 크기가 매우 큽니다. 스크립트 라인만 2~4000줄 가까이 되며, 연산 결과로
나온 HTML은 4~7000 줄 정도로 크기는 200 ~ 300K 정도입니다. (보통 쇼핑몰의 3~4배
는 많은 라인을 가지고 있습니다.)

다. 중복 실행이 일어나는 파일도 동일한 조건에서 계속해도 일어나는 경우와 그렇지 않은
경우가 있습니다. 동일한 물건은 연속으로 50번 정도 구매를 시도한 적이 있는데 6번 정도
중복이 일어났으며 중복 실행이 일어난 시점은 매우 불규칙적임.

마. 중복 실행시 클라이언트에 나타나는 값은 처음 실행시킨 경우의 HTML임.

바. 문제점을 파악하기 위해 로그 기록시 자바스크립트로 알림 창을 달아 두었는데 첫 번째
로그 기록시에는 알려 주지만, 2번째 로그시에는 알림 창을 띄우지 않고 그냥 로그만 기록합
니다.

사. 하도 답답하여 파일 처리에 문제가 있는가 해서 로그를 DB에 남기게 하였는데 역시 DB
에도 중복 기록합니다.

아. 로그 기록을 5초의 시간 간격을 두고 A, B에 각각 기록하게 하여 중복 실행되었을 때 결
과물을 보면 A와 B는 정확하게 5초간의 간격이 되지만 A와 A', B와 B'의 시간 간격은 1~3초
(스크립트 실행 시간) 정도 차이 납니다.
정상적인 중복 실행이라면 A -> B -> A' -> B'가 되어야 하는데 실제 실행 결과는 A -> A'
-> B -> B'가 됩니다. 마치 쓰레드가 2개 만들어져 각기 실행되듯이 말입니다.
쉽게 예를 들어 설명하면 아래와 같은 결과를 보입니다.

-----------------
실행 모듈
기록 시간
------------------
A
05:06:02
A'
05:06:03
B
05:06:07
B'
05:06;08

-----------------
ㅈ. 중복 실행되는 경우 2번째 실행되는 referer를 보면 항상 스크립트 자기 자신입니다.

4. 현재 의심 가는 것들

1). 설호규(제작자 본인) :
- 45만줄이 넘는 너무 큰 솔루션을 1년 넘게 혼자 악으로 깡으로 만들다 살짝 맛이 간
것은 아닐까?
- 같이 생활하는 방돌이(모 벤처기업에 유능한 개발자)도 문제 부분에 대해서 전혀 갈
피를 못 잡지만 문제가 기막히다는 것에 대해서는 공감.
3번 실행시킨 것은 아닐까?

2. 클라이언트(웹브라우즈 + 윈도OS)
- 웹브라우즈와 윈도OS가 불안정해서 기분에 따라 서버 쪽에 재실행을 요청하는 것은
아닐까? 웹페이지 HTML을 다 받은 이후에 서버 쪽에 잘 받았다고 인사하는 것을 잘 못
해서 다시 달라고 한 것은 아닐까?
- 위의 로그에서도 보 듯이 중복 실행되는 경우 2번째 실행되는 referer를 보면 스크립
트 자기 자신인데... 역시 실력이 부족해 심증만 있고 물증이 없다.

3. 웹서버(아파치 + PHP)
- 아파치2로 올라가면서 쓰레드 이야기 많았는데 현재 레드핫 9.0 그대로 초기버전이
므로 아직 안정화가 조금 먼 것은 아닐까? 더욱이 PHP도 엄청나게 업그레이드가 빨리
되는 언어라 버그가 있는 것은 아닐까?
- 지금 보이는 증상이 꼭 2~3번 쓰레드로 실행한 것과 동일한 증상으로 볼 수 있음. 웹
브라우즈가 1번 실행을 부탁했는데 서버 혼자 신이나서 2~3번 실행시킨 것은 아닐까.
- 더욱이 지금같이 무리하게 큰 스크립트들을 처리하면서 오작동한 것은 아닐까?

5. 소결론
처음에는 1)설호규를 의심해서 이래저래 코드들을 살펴보고 디버깅을 시도했지만 코드에서
문제거리를 찾을 수 없었습니다. 3일 동안 문제가 있으며 증상이 매우 불규칙 적이란 것만
확인하였습니다.
그러다 로그 기록 부분에 자바스크립트 창을 추가하고 referer 정보를 보면서 2. 클라이언트
쪽(웹브라우즈 + 윈도OS)를 의심했습니다. 웹브라우즈가 빨리 연산할려고 쓰레드를 만들어
요청해 놓고 가장 빠른 것만 받아 들인다는 말도 안되는 생각을 했습니다. 빌이 꽁수를 사용
한 것은 아닌가라고 생각했습니다.
그러나 네스케이프로 체크 해보니 처음에 20회 정도까지는 문제가 없더군요. 그래서 역시
빌이 문제야라고 생각하고 있는데 역시 중복 실행이 되더군요. 그래서 현재는 3. 서버쪽(아
파치 + PHP)를 가장 유력한 용의자로 보고 있습니다.

혹시 저랑 비슷한 상황을 겪고 있는 분들이 있는지요? 여러분들은 문제의 원인이 어디에 있
다고 생각됩니까? 조언을 부탁드립니다.

morning의 이미지

이제야 문제의 원인을 찾았습니다.
익스플로의 결함 내지는
개발자 편의로 원칙을 정확하게 지키지 않은 것이였습니다.

메뉴에 마우스가 올라가면 해당 메뉴를 소개하는 소리를 낼려고
제가 사용한 대그중에 아래와 같은 것이 있는데
그것이 문제의 원인이였습니다.
<bgsound src='#' id='menu_intro' loop='1' autostart='true'>

현재 이 태그를 아래와 같이 바꾸니 중복실행은 사라졌고
제가 원하는 대로 마우스 오버시 소리도 납니다.
<bgsound id='menu_intro' loop='1' autostart='true'>

보통 '#'을 자바스크립트에서 널값으로 많이 사용하지만
원래 의미가 웹페이지 TOP이라는 의미를 가지고 있죠.
웹브라우즈의 상태에 따라 상단이 아니라 다시 읽기로 해석한 모양입니다.
익스플로가 기분 내키는 대로 1 ~ 3번까지 읽어 들였습니다.
제가 사용한 웹브라우즈는 익스프롤는 6.0, 네스케이스 7.1, FireBird 0.7인데
익스프로가 가장 문제가 많았네요.
하기야 익스플로 버전마다 '#'에 대한 반응이 달라 그것의 사용을 배격했는데
제가 잠시 잊고 그것을 사용하고 말았네요.
원래 웹브라우즈 의존적인 자바스크립트를 무척 싫어해서 사용하지 않았는데
사이트를 좀 예쁘게 꾸민다고 보수적으로 몇 개 사용했는데
공교롭게도 그 몇개 사용한 것에 문제가 있었군요. 아휴~~~

일단 좀 쉬었다가 다시 작업에 매진해야겠습니다.
여러분도 분발하시기 바랍니다.

조르바와 함께 춤을....

elflord의 이미지

#이 top의 의미를 가진건 처음 알았네요.

전 폼 이동시 자기자신을 다시부를때 url로 #을 자주 넣었기에
#이 웹페이지에서 호출한 자기자신을 뜻한다고 알고있었는데.

어디서부터 잘못된걸까...


===== ===== ===== ===== =====
그럼 이만 총총...[竹]
http://elflord.egloos.com

nohmad의 이미지

top이 아니라 anchor(닻)라고 합니다. html 문서에 기본으로 소개되는 내용입니다.

<a name="top">여기는 문서의 꼭대기.</a>
....

(중략)
....
<a href="#top">다 읽었으니 다시 꼭대기로 가시렵니까?</a>

또는 http://wiki.kldp.org/wiki.php/BashProgIntroHowto 에서처럼
한 페이지내에서 목차 이동을 할 때 주로 많이 사용됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.