PHP에서 HTML DOM 파싱

PHP 내부에서 특정 web page를 읽어서 뭔가를 처리하는 일을 할 때 사용하는 방법이다. 기존에는 나름대로 string 파싱을 해서 사용했는데, 성능도 안 나오고 불편하여 JQuery 처럼 사용할 수 있는 방법을 찾아봤더니, 뜻이 있는 길에 길이 있다고.. 누군가 이미 잘 만들어 놓은 라이브러리가 있었다.

이름하여 simple_html_dom.php 라는 파일이다. (http://simplehtmldom.sourceforge.net/) 이 파일 하나만 include하여 사용하면 간단하게 dom 구조를 읽을 수 있다.

사용 방법은 다음과 같다.

// Create DOM from URL or file
$html = file_get_html('http://www.google.com/');

// Find all images
foreach($html->find('img') as $element)
       echo $element->src . '<br>';

// Find all links
foreach($html->find('a') as $element)
       echo $element->href . '<br>';

$array = $html->find(“div div table tr td”); 식의 찾기가 가능하며, 찾은 결과를 array로 리턴해준다. 위 예제와 같이 foreach로 전체 탐색을 하면서 주로 사용하면 되고, $array[0] 식의 접근도 물론 가능하다.

간단하게 페이지를 파싱할 수 있으니 너무 좋은 것 같다. 🙂

라즈베리파이 lighttpd + mysql + php 환경 설정

라즈베리파이에 lighttpd + mysql + php를 설치하여 저전력 웹 서버로 활용할 수 있다. 필요한 패키지들을 다음과 같이 설치한다.

pi@raspbmc:~$ sudo apt-get install lighttpd mysql-server php5 php-common php5-cgi php5-mysql lighty-enable-mod fastcgi-php
pi@raspbmc:~$ sudo service lighttpd force-reload

설치만 하면 부팅할 때마다 자동으로 lighttpd daemon이 실행된다. 기본적으로 80 포트를 사용하게 되어있지만 xbmc가 이미 사용하고 있으므로 포트를 변경해줘야 한다. 그리고 관리의 편의를 위해서 홈디렉토리 밑에 HTTP 루트 디렉토리를 설정한다.  서비스 포트, 홈디렉토리 변경, 로그 디렉토리 변경 그리고 dir-listing이 가능하도록 설정하였다.

pi@raspbmc:~$ cat /etc/lighttpd/lighttpd.conf 
server.modules = (
	"mod_access",
	"mod_alias",
	"mod_compress",
 	"mod_redirect",
#       "mod_rewrite",
)

server.document-root        = "/home/pi/www"
server.upload-dirs          = ( "/var/cache/lighttpd/uploads" )
server.errorlog             = "/var/log/error.log"
server.pid-file             = "/var/run/lighttpd.pid"
server.username             = "www-data"
server.groupname            = "www-data"
server.port                 = 8080

index-file.names            = ( "index.php", "index.html", "index.lighttpd.html" )
url.access-deny             = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

compress.cache-dir          = "/var/cache/lighttpd/compress/"
compress.filetype           = ( "application/javascript", "text/css", "text/html", "text/plain" )

# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"

# cky
dir-listing.activate        = "enable"
dir-listing.show-readme     = "enable"
dir-listing.hide-readme-file = "enable"
dir-listing.encoding        = "utf-8"
dir-listing.hide-dotfiles   = "enable"

설정을 수정한 후 lighttpd를 실행하면 잘 동작하는 것을 확인할 수 있을 것이다. 🙂

ps. 외부에서 접속하려면 Raspbmc Settings에서 Firewall을 disable하여야 한다.