php 스크립트에서 계속 무한 루프를 도는 이유를 모르겠습니다.

dltkddyd의 이미지

for($i=0;$i<count($files);$i++) {
	$command="./managedir -p ".$_POST[path]." -f ".$files[$i]." -s ".$_POST[searching];
	echo $command."<br>";//test
	system($command);
}

위와 같은 소스코드를 실행하면 계속 무한루프롤 돌면서 managedir이라는 실행파일을 실행합니다. 분명 count는 10을 반환하므로 루프는 10번만 돌아야 되고, 따라서 명령어도 10번만 실행되야 하는데, 멈추지 않고 계속 실행됩니다. 이유좀 알려주세요. 그리고 해결책도요.

익명 사용자의 이미지

코드상으로는 별 문제가...
php스크립트의 루프가 계속 도는게 아니고 실행파일 managedir이 무한루프를 도는게 아닌가 의심됩니다.

dltkddyd의 이미지

그런데 터미널에서

./managedir -p /home/board/Documents -f recipe5.html -s 맛있는 레시피 공유

라고 명령을 내리면 무한루프 돌지 않고 제대로 실행이 됩니다. 도대체 원인을 모르겠습니다.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

shori0917의 이미지

count($files) <---- 이 부분의 값이 실시간으로 변하거나 하지 않나요?

$count=count($files) <---- 이렇게 하면 count변수에 한번 할당하는데 위처럼 하면
매번 새로운 값을 요구하기때문에 효율성도 떨어질뿐더러 바뀔 가능성이 있다고 생각하는데요

dltkddyd의 이미지

혹시나 해서 말씀하신 대로

$count=count($files);
for($i=0;$i<$cnt;$i++) {
  //statement
}

위와 같이 변경해보았으나, 여전히 계속 루프를 돕니다. 저 managedir 이라는 프로그램에 대해서 간단히 먼져 설명을 드려야 할 것 같군요. 저 프로그램은

./managedir -p path -f filename -s searching

위와 같이 세 개의 옵션에 따른 값을 갖습니다. path는 파일의 경로명이고 filename은 그 내부에서 문자열을 찾고자 하는 파일 이름이며 searching는 그 파일에서 찾고자 하는 문자열입니다.

./managedir -p /home/board/Documents -f recipe5.html -s 맛있는 레시피 공유

라고 하면 recipe5.html 파일에서 '맛있는 레시피 공유'라는 문자열을 찾아서 그 처음 위치와 문자열이 끝나는 다음의 위치를 managedir 프로그램 내부에서 wcout으로 출력합니다.

검색된 파일의 개수는 25개이고 25번의 루프를 돌면 최대 25번의 출력결과를 반환해야 하는데, 한 번의 루프에 대해서 20번 이상의 출력결과를 내놓습니다. 결과적으로

20번 이상의 출력 결과X25번의 루프=500번의 출력 결과

가 나옵니다.

참고로 외부 프로그램 managedir를 실행하는 php 스크립트 코드는 다음과 같습니다.

<?php
echo "<br>";//test
chdir($_POST[path]);
$files=glob("*.html");
$cnt=count($files);
for($i=0;$i<$cnt;$i++) {
	$command="./managedir -p ".$_POST[path]." -f ".$files[$i]." -s ".$_POST[searching];
	echo $command."   ".$i."<br>";//test
	passthru($command);
}
 
//$command="./managedir -p ".$_POST[path]." -s ".$_POST[searching];
//passthru($command);
?>

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

익명 사용자의 이미지

디버깅 메시지에 더 많은 정보를 출력하게 해서 확인해 보세요.
일단 count($files)하고 $i를 같이 찍어가면서 php 스크립트에 의한 system 호출이 몇번 되는지를 확인해보세요.

echo "File count: " . count($files) . "<br />";
for($i=0;$i<count($files);$i++) {
 
	$command="./managedir -p ".$_POST[path]." -f ".$files[$i]." -s ".$_POST[searching];
        echo "[Command $i] ";
	echo $command."<br>";//test
	system($command);
}

다시 말하지만 php 스크립트 상으로는 별 문제가 없습니다.
문제가 있다면 $command 이거나 managedir 입니다.

shori0917의 이미지

debug_print_backtrace함수를 이용해서 트레이스를 조사해보세요 어디어디 호출되는지
저는 managedir프로그램을 실행하면서 $_POST[path]에 있는 파일개수만큼 조사하는게 아닌가 생각드는데요?
25 * $_POST[path]파일개수 아닌가요?

RurM8Q9g의 이미지

먼저 그 무한루프가 './managedir' 에서 발생하는지, 'php 코드' 상에서 발생하는지 알 필요가 있겠네요.
'php 코드'상에서는 별 문제가 없어보입니다. ($cnt 값이 너무 크지 않다면..)
'passthru($command);' 에서 실행되는 커맨드와 echo $command." ".$i."
";//test 에서 출력하는 커맨드가 확실히 같고, 이 커맨드에서 실행했을 때 프로그램에서 무한루프가 걸리고, './managerdir'은 실행환경과 독립되있고, 똑같은상황에서 똑같은명령을 터미널에서 실행했는데, 그때는 무한루프가 안걸렸다! 는게 확실한가요?
인풋으로 한글이 들어가는것같네요. 혹시 한글로인한 문제일 가능성도 있으니, 영어만으로 해보시는건 어떨까요.

아 그리고 죄송하지만 혹시몰라서..
실제 코드에서도, '입력값'에 대한 별다른 필터링 없이 저렇게 바로 system함수로 넘겨버리면, 위험합니다.
command injection이 가능해지니까요.

dltkddyd의 이미지

chdir 함수에 작업 디렉토리를 제대로 전달하지 않아서 발생하는 문제였습니다. 말씀대로 루프와 외부프로그램 managedir에서 발생한 문제가 아니였습니다. 코드 작성시에는 이런 사소한 문제가 왜 안 보이는 것인지..
그런데 또 다른 문제가 발생하네요. passthru에 의해 실행된 모든 외부프로그램이 끝날 때까지는 단 하나의 결과도 php 파서가 출력하지 않는다는 것입니다. passthru가 한 번 실행될 때마다 그 결과가 바로 바로 출력될 것으로 기대했는데요. 이렇게 되면 검색시 1000개의 문서를 검색한다고 하면 1000개의 문서를 모두 검색할 때까지 단 한 줄의 결과물도 브라우저로 출력되지 않을 텐데. 이런 문제를 어떻게 해결하죠? 바로 바로 결과가 출력될 수 있도록 하는 방법은 없을까요?

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.