웹프로그래머 금승훈님의 지식베이스 입니다.

서버에 설치된 php와 같은 버전의 php 압축 해제

소스폴더/ext/설치하고자 하는 모듈/ 디렉토리에서 phpize 실행
(phpize가 없을 경우 yum으로 php-devel 을 설치)

ex) 

cd php-x.y.z/ext/모듈명/; 

phpize; (phpize 실행시 config.m4 관련 메시지 뜰 경우 config0.m4 파일을 config.m4로 이름 변경)

./configure;

./make;
  
모듈.so 파일이 생성되는데 이 .so 파일을 적당한 위치에 복사 후
php.ini에 extension_dir 및 extension으로 등록

Comment +0


  1. 배열을 이용한 방법

    함수
     {
      $contents = "";
      if(!function_exists('xml_parser_create'))
       return array ();
      $parser = xml_parser_create('');
      if(!($fp = @ fopen($url, 'rb')))
       return array ();
      while (!feof($fp))
      {
       $contents .= fread($fp, 8192);
      }
      fclose($fp);
      xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
      xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
      xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
      xml_parse_into_struct($parser, trim($contents), $xml_values);
      xml_parser_free($parser);
      if(!$xml_values)
       return;
      $xml_array = array ();
      $parents = array ();
      $opened_tags = array ();
      $arr = array ();
      $current = & $xml_array;
      $repeated_tag_index = array ();
      foreach ($xml_values as $data)
      {
       unset ($attributes, $value);
       extract($data);
       $result = array ();
       $attributes_data = array ();
       if(isset ($value)){
        if($priority == 'tag')
         $result = $value;
        else
         $result['value'] = $value;
       }
       if(isset ($attributes) and $get_attributes) {
        foreach ($attributes as $attr => $val)
        {
         if($priority == 'tag')
          $attributes_data[$attr] = $val;
         else
          $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr'
        }
       }
       if($type == "open"){
        $parent[$level -1] = & $current;
        if(!is_array($current) or (!in_array($tag, array_keys($current)))){
         $current[$tag] = $result;
         if($attributes_data)
          $current[$tag . '_attr'] = $attributes_data;
         $repeated_tag_index[$tag . '_' . $level] = 1;
         $current = & $current[$tag];
        }
        else{
         if(isset ($current[$tag][0])){
          $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
          $repeated_tag_index[$tag . '_' . $level]++;
         }
         else{
          $current[$tag] = array ($current[$tag], $result);
          $repeated_tag_index[$tag . '_' . $level] = 2;
          if(isset ($current[$tag . '_attr'])){
           $current[$tag]['0_attr'] = $current[$tag . '_attr'];
           unset ($current[$tag . '_attr']);
          }
         }
         $last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1;
         $current = & $current[$tag][$last_item_index];
        }
       }
       elseif($type == "complete"){
        if(!isset ($current[$tag])){
         $current[$tag] = $result;
         $repeated_tag_index[$tag . '_' . $level] = 1;
         if($priority == 'tag' and $attributes_data)
          $current[$tag . '_attr'] = $attributes_data;
        }
        else{
         if(isset ($current[$tag][0]) and is_array($current[$tag])){
          $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
          if($priority == 'tag' and $get_attributes and $attributes_data)
           $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
          $repeated_tag_index[$tag . '_' . $level]++;
         }
         else{
          $current[$tag] = array ($current[$tag], $result);
          $repeated_tag_index[$tag . '_' . $level] = 1;
          if($priority == 'tag' and $get_attributes){
           if(isset ($current[$tag . '_attr'])){
            $current[$tag]['0_attr'] = $current[$tag . '_attr'];
            unset ($current[$tag . '_attr']);
           }
           if($attributes_data)
            $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
          }
          $repeated_tag_index[$tag . '_' . $level]++; //0 and 1 index is already taken
         }
        }
       }
       elseif($type == 'close')
        $current = & $parent[$level -1];
      }
      return ($xml_array);
    출력
    $xmlC= xml2array("price.xml");
    pprint($xmlC);
  2. 클래스를 이용한 방법

    클래스
    {
     var $arrOutput = array();
     var $resParser;
     var $strXmlData;
     function xml2Class($url)
     {
      $this->resParser = xml_parser_create ();
      xml_set_object($this->resParser,$this);
      xml_set_element_handler($this->resParser, "tagOpen", "tagClosed");
      xml_set_character_data_handler($this->resParser, "tagData");
      $strInputXML = file_get_contents($url);
      $this->strXmlData = xml_parse($this->resParser,$strInputXML);
      if(!$this->strXmlData){
       die(sprintf("XML error: %s at line %d",
       xml_error_string(xml_get_error_code($this->resParser)),
       xml_get_current_line_number($this->resParser)));
      }
      xml_parser_free($this->resParser);
      unset($this->resParser, $this->strXmlData);
      return $this->arrOutput;
     }
     function tagOpen($parser, $name, $attrs)
     {
      $tag=array("name"=>$name,"attrs"=>$attrs);
      array_push($this->arrOutput,$tag);
     }
     function tagData($parser, $tagData)
     {
      if(trim($tagData)){
       if(isset($this->arrOutput[count($this->arrOutput)-1]['tagData']))
        $this->arrOutput[count($this->arrOutput)-1]['tagData'] .= $tagData;
       else
        $this->arrOutput[count($this->arrOutput)-1]['tagData'] = $tagData;
      }
     }
     function tagClosed($parser, $name)
     {
      $this->arrOutput[count($this->arrOutput)-2]['children'][] = $this->arrOutput[count($this->arrOutput)-1];
      array_pop($this->arrOutput);
     }
    }
    출력
    $xmlC = new xml2Class($filename);
    pprint($xmlC);

 

Comment +0


폼 내용 유지와 관련하여 session_cache_limiter() 에 대해 잘못 알려진 내용

history.back() 했을 때 폼의 내용을 유지하는 문제와 관련해서
session_cache_limiter("nocache, must-revalidate");
라는 게 자꾸 올라오는데요, 잘못된 글이 자꾸 퍼져나가는 것 같아 씁니다.
(Tip & Tech에 올리는 게 좀 부적당한 것 같기도 하지만;;; 양해해주셔요.)

우선 HTTP 1.1 RFC 중 한 가지만 보죠.

cache-response-directive =
"public"
| "private" [ "=" <"> 1#field-name <"> ]
| "no-cache" [ "=" <"> 1#field-name <"> ]
| "no-store"
| "no-transform"
| "must-revalidate"
| "proxy-revalidate"
| "max-age" "=" delta-seconds
| "s-maxage" "=" delta-seconds
| cache-extension

여기서 no-cache는 말 그대로 캐시하지 말라는 것이므로
브라우저에서 페이지 저장하지 말라는 거고요,
must-revalidate는 멋대로 하지 말고 확인하라는 거죠.
(정확한 역할은 RFC를 찾아 읽어보세요. 강추!)
그러니까 "nocache, must-revalidate"는
원래 "캐시를 절대 하지 마라!" 라는 뜻입니다.

그러니까 이렇게 넣어놓고 "우아~ 폼 내용이 안 사라지네!"라고 하는 건
눈 감고 Copy & Paste 혹은 개그콘서트인 겁니다. ㅡ.ㅡ;
왜 history.back() 해도 폼이 유지되는 걸까? 하고
의문을 가져보지 않으셨나요?



<?php
session_cache_limiter("nocache");
session_start();
?>

위와 같은 파일 하나 만들어서 Response Header 가 어떻게 나오는지 살펴보세요.
살펴보는 방법 중 하나는 간단하게... Linux 쉘에서...

/usr/bin/wget -d -O /dev/null "http://kr.yahoo.com/"

실제 어떻게 나오는지는 직접 확인해보세요.
남의 글 백번 보는 것보다 직접 한번 해보는 게 낫습니다.
자, 눈에 띄는 게 있나요? 없나요? ;;;



이번엔 아무 것도 없는 문자열만 넣어서 확인해보죠.

<?php
session_cache_limiter("");
session_start();
?>

Cache-Control과 관련된 것은 안 나올 겁니다.



이번엔 nocache, must-revalidate를 넣어서
위와 같은 방법으로 확인해보세요.

<?php
session_cache_limiter("nocache, must-revalidate");
session_start();
?>

뭔가 좀 이상한 거 없습니까?
그렇습니다. ""랑 똑같이 Cache-Control 과 관련된 것은 안 나옵니다.
왜 그럴까요? 왜 그럴까요? 알~아~맞~추~어 봅시다. ㅡoㅡ;;;


PHP에서 session_cache_limiter()에 쓸 수 있는 것은
public, private, no-cache 뿐입니다.
(Ver. 4.2.0부터 private와 유사한 private_no_expire 추가되었음.)
http://kr.php.net/manual/en/function.session-cache-limiter.php
그 외에는 어떤 걸 넣든 Cache-Control를 포함하지 않습니다.
그러니까 "" = "nocache, must-revalidate" = "Fencer" = "phpschool"
Response Header에 Cache-Control이 없으면
캐시에 관한 한(!) 세션을 쓰지 않을 때와 같다고 보아도 무방합니다.
즉, 일반 HTML 문서와 별 차이가 안 납니다.




왜 선택할 수 있는 게 이렇게 적은 거지? 라고 의문을 갖는다면
PHP session 부분의 C 소스를 보면 확실합니다.
어떻게 보면 이런 제한 때문에 쉽기도 하고
동시에 자유롭고 세밀한 제어가 힘들기도 하죠.
(필요한 사람은 C 소스를 수정하여 컴파일하면 되겠죠.)

처음에 누군가 확인도 해보지 않고
session_cache_limiter("nocache, must-revalidate"); 를 넣으세요~
하니까 확인도 되지 않은 채 여기저기 퍼져나간 것 같은데요...
[결론] 세상에 믿을 놈 하나 없습니다. ㅡ_ㅡ;;;
물론 제가 뻥 치는 것일 수도 있으니까 위에 적은 거 직접 확인해보세요.

※ 참고하면 좋을 문서. http://www.faqs.org/rfcs/rfc3143.html 

출처 - phpschool.com 게시판에서 어느 무명의 팁 -

Comment +0

function array_sort($array, $sort_data)
 {  
  unset($sort_str,$temp_sort,$sort_num,$sort_array);
  $sort_str="array_multisort(";
  foreach($array as $key => $val)
  {
   $sort_num++;
   for($i=0;$i<count($sort_data);$i++)
   {    
    $temp_sort=explode("^",$sort_data[$i]);
    $sort_array[$i][$key]=$val[$temp_sort[0]];
    if($sort_num==1)  $sort_str .= "\$sort_array[$i]" . ", $temp_sort[1],";
   }
  }
  $sort_str .= " \$array);";
  eval($sort_str);
  reset($array);
  return $array;
 }

Comment +0

 //배열의 열과 행을 바꿔주는 함수
 function array_change_row($arr,$flag=NULL)
 {
  unset($temp_arr);
  foreach ($arr as $key => $val)
  {
   if($flag) foreach ($val as $sub_key => $sub_val) $temp_arr[$sub_key][]=$sub_val;
   else foreach ($val as $sub_key => $sub_val) $temp_arr[$sub_key][$key]=$sub_val;
  }
  return $temp_arr;
 }

Comment +0

//중복삭제하고, 배열 합치기
 function array_remake($item, $key)
 {
  global $remake_item,$remake_key;

  if($remake_key) $remake_key.="^";
  $remake_key.=$key;
 
  for($i=0;$i<count($item);$i++)
  {
   if($remake_item[$i]) $remake_item[$i].="^";
   $remake_item[$i].=$item[$i];
  }
 }

 function array_merge_unique($array1, $array2)
 {
  global $remake_item,$remake_key;

  array_walk(array_merge_recursive($array1,$array2), 'array_remake');
  $remake_item=array_reverse(array_unique($remake_item));
  $remake_key_array=explode("^",$remake_key);

  while($temp_item=array_pop($remake_item))
  {   
   $item=explode("^",$temp_item);
   for($i=0;$i<count($remake_key_array);$i++)
   {  
    $return_unique_array[$remake_key_array[$i]][]=$item[$i];
   }
  }
  $remake_item=null;
  $remake_key=null;
  return $return_unique_array;  
 }
 
 사용법
$merge_array=array_merge_unique($array1, $array2);


Comment +0