<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SpaLinux.com &#187; PHP</title>
	<atom:link href="http://spalinux.com/category/php/feed" rel="self" type="application/rss+xml" />
	<link>http://spalinux.com</link>
	<description>Resources for Relaxing Linux System Administrators</description>
	<lastBuildDate>Sat, 21 Jan 2012 16:07:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>เขียนโปรแกรมโหลดเว็บเพจด้วย PHP cURL</title>
		<link>http://spalinux.com/2011/12/program-php-curl-to-load-web-page</link>
		<comments>http://spalinux.com/2011/12/program-php-curl-to-load-web-page#comments</comments>
		<pubDate>Thu, 22 Dec 2011 16:11:06 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Utility]]></category>
		<category><![CDATA[Web Server]]></category>
		<category><![CDATA[load web page]]></category>
		<category><![CDATA[php curl]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1574</guid>
		<description><![CDATA[จากที่ได้นำเสนอ วิธีการใช้ cURL เพื่อโหลดเว็บเพจ ซึ่งเป็นการรันคำสั่งแบบ command line มาแล้ว คราวนี้จะเป็นการเขียนโปรแกรม PHP โดยเรียกใช้ฟังก์ชั่นในโมดูล curl เพื่อโหลดเว็บเพจ ตรวจสอบโมดูล php curl ก่อนที่เราจะเรียกใช้ฟังก์ชั่นจากโมดูล curl เพื่อเขียนโปรแกรมใน PHP ได้นั้น จำเป็นต้องมีโมดูล curl ติดตั้งอยู่แล้ว ซึ่งสามารถตรวจสอบได้ด้วยการรันคำสั่ง php ตามด้วยออปชั่น &#8216;-m&#8217; ดูผลลัพธ์ที่ได้ ตัวอย่างการรันคำสั่ง php ด้วยออปชั่น &#8216;-m&#8217; เพื่อดูว่ามีโมดูล curl หรือไม่ [user1@dev ~]$ php -m &#124; grep curl curl ถ้าไม่มี ต้องติดตั้งเพิ่มเติม ซึ่งอาจจะด้วยการใช้ rpm หรือ yum ก็ได้ เริ่มใช้ฟังก์ชั่น curl เริ่มต้นด้วยตัวอย่างการเขียนโปรแกรมโดยใช้ฟังก์ชั่น curl [...]]]></description>
			<content:encoded><![CDATA[<p>จากที่ได้นำเสนอ <a href="http://spalinux.com/2011/12/using-curl-to-load-web-page">วิธีการใช้ cURL เพื่อโหลดเว็บเพจ</a> ซึ่งเป็นการรันคำสั่งแบบ command line มาแล้ว</p>
<p>คราวนี้จะเป็นการเขียนโปรแกรม PHP โดยเรียกใช้ฟังก์ชั่นในโมดูล curl เพื่อโหลดเว็บเพจ</p>
<p><span id="more-1574"></span></p>
<h4>ตรวจสอบโมดูล php curl</h4>
<p>ก่อนที่เราจะเรียกใช้ฟังก์ชั่นจากโมดูล curl เพื่อเขียนโปรแกรมใน PHP ได้นั้น จำเป็นต้องมีโมดูล curl ติดตั้งอยู่แล้ว ซึ่งสามารถตรวจสอบได้ด้วยการรันคำสั่ง php ตามด้วยออปชั่น &#8216;-m&#8217; ดูผลลัพธ์ที่ได้</p>
<p>ตัวอย่างการรันคำสั่ง php ด้วยออปชั่น &#8216;-m&#8217; เพื่อดูว่ามีโมดูล curl หรือไม่</p>
<pre>[user1@dev ~]$ <strong>php -m | grep curl</strong>
curl</pre>
<p>ถ้าไม่มี ต้องติดตั้งเพิ่มเติม ซึ่งอาจจะด้วยการใช้ rpm หรือ yum ก็ได้</p>
<h4>เริ่มใช้ฟังก์ชั่น curl</h4>
<p>เริ่มต้นด้วยตัวอย่างการเขียนโปรแกรมโดยใช้ฟังก์ชั่น curl แบบง่ายสุด เพื่อโหลดเว็บเพจ มีสามขั้นตอนคือ</p>
<ul>
<li>curl_init ระบุเว็บไซต์ที่ต้องการโหลด</li>
<li>curl_exec โหลดหน้าเว็บและแสดงผลลัพธ์</li>
<li>curl_close สิ้นสุดการใช้ curl</li>
</ul>
<p>เช่นต้องการโหลดเว็บ www.php.net</p>
<pre>[user1@dev ~]$ <strong>cat curl.php</strong>
&lt;?php

// Create a curl handle
$ch = <span style="color: #0000ff;">curl_init</span>('http://www.php.net');

// Execute
$ret = <span style="color: #0000ff;">curl_exec</span>($ch);

// Close handle
<span style="color: #0000ff;">curl_close</span>($ch);

?&gt;</pre>
<p>ทดลองรันโปรแกรมที่เขียน</p>
<pre>[user1@dev ~]$ <strong>php curl.php</strong>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;
&lt;head&gt;
 &lt;title&gt;PHP: Hypertext Preprocessor&lt;/title&gt;
 &lt;style type="text/css" media="all"&gt;
  @import url("http://static.php.net/www.php.net/styles/site.css");
  @import url("http://static.php.net/www.php.net/styles/phpnet.css");

 &lt;/style&gt;
...</pre>
<p>สังเกตว่าผลลัพธ์การโหลด หรือไฟล์เว็บเพจจะแสดงผลออกหน้าจอเลย เมื่อใช้ฟังก์ชั่น curl_exec() ไม่ได้เก็บไว้ในตัวแปร $ret</p>
<p>หากต้องการเก็บผลลัพธ์ที่ได้ไว้ในตัวแปรก่อน เพื่อนำไปประมวลผล ต้องใช้ฟังก์ชั่น curl_setopt เพื่อตั้งค่า CURLOPT_RETURNTRANSFER ให้เป็น true</p>
<pre>&lt;?php

// Create a curl handle
$ch = curl_init('http://www.php.net');

<span style="color: #0000ff;">// Set curl options</span>
<span style="color: #0000ff;">curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);</span>

// Execute
$ret = curl_exec($ch);

// Return
<span style="color: #0000ff;">print 'return = ' . $ret . "\n";</span>

// Close handle
curl_close($ch);

?&gt;</pre>
<p>ลองรันโปรแกรมหลังจากแก้ไขแล้ว</p>
<pre>[user1@dev ~]$ php curl.php
<span style="color: #0000ff;">return =</span> &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;
&lt;head&gt;
 &lt;title&gt;PHP: Hypertext Preprocessor&lt;/title&gt;
 &lt;style type="text/css" media="all"&gt;
  @import url("http://static.php.net/www.php.net/styles/site.css");
  @import url("http://static.php.net/www.php.net/styles/phpnet.css");

 &lt;/style&gt;
...</pre>
<p>&nbsp;</p>
<h4>ดูรายละเอียดการโหลดเว็บเพจ</h4>
<p>หากต้องการดูข้อมูลรายละเอียดของการโหลดเว็บเพจ สามารถใช้ฟังก์ชั่น curl_getinfo() ได้</p>
<pre>&lt;?php

// Create a curl handle
$ch = curl_init('http://www.php.net');

// Set curl options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Execute
$ret = curl_exec($ch);

<span style="color: #0000ff;">// Get information about the last transfer</span>
<span style="color: #0000ff;">$get_info = curl_getinfo($ch);</span>

<span style="color: #0000ff;">print_r($get_info);</span>

// Close handle
curl_close($ch);

?&gt;</pre>
<p>ผลการรันโปรแกรม จะแสดงค่าเกี่ยวกับการโหลดเว็บเพจทั้งหมด</p>
<pre>[user1@dev ~]$ <strong>php curl.php</strong>
Array
(
    [url] =&gt; http://www.php.net
    [content_type] =&gt; text/html;charset=utf-8
    [http_code] =&gt; 200
    [header_size] =&gt; 382
    [request_size] =&gt; 50
    [filetime] =&gt; -1
    [ssl_verify_result] =&gt; 0
    [redirect_count] =&gt; 0
    [total_time] =&gt; 1.523659
    [namelookup_time] =&gt; 0.006906
    [connect_time] =&gt; 0.249598
    [pretransfer_time] =&gt; 0.249602
    [size_upload] =&gt; 0
    [size_download] =&gt; 45325
    [speed_download] =&gt; 29747
    [speed_upload] =&gt; 0
    [download_content_length] =&gt; -1
    [upload_content_length] =&gt; 0
    [starttransfer_time] =&gt; 0.551071
    [redirect_time] =&gt; 0
    [certinfo] =&gt; Array
        (
        )

)</pre>
<p>&nbsp;</p>
<p>แต่ถ้าต้องการแสดงเฉพาะบางค่า เช่นขนาดไฟล์เว็บเพจที่โหลด ต้องระบุ CURLINFO_SIZE_DOWNLOAD ไว้ในฟังก์ชั่น curl_getinfo() ด้วย</p>
<pre>&lt;?php

// Create a curl handle
$ch = curl_init('http://www.php.net');

// Set curl options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Execute
$ret = curl_exec($ch);

// Get information about the last transfer
$get_info_size_download = curl_getinfo($ch, <span style="color: #0000ff;">CURLINFO_SIZE_DOWNLOAD</span>);

<span style="color: #0000ff;">print 'SIZE_DOWNLOAD = ' . $get_info_size_download . "\n";</span>

// Close handle
curl_close($ch);

?&gt;</pre>
<p>ผลการรันโปรแกรม</p>
<pre>[user1@dev ~]$ <strong>php curl.php</strong>
SIZE_DOWNLOAD = 45325</pre>
<p>&nbsp;</p>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://www.php.net/manual/en/intro.curl.php" target="_blank">PHP: cURL Functions &#8211; Manual</a></li>
<li><a href="http://spalinux.com/2011/12/using-curl-to-load-web-page">วิธีการใช้ cURL เพื่อโหลดเว็บเพจ</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2011/12/program-php-curl-to-load-web-page/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ตัดบางส่วนจากข้อความภาษาไทยด้วย PHP Multibyte String</title>
		<link>http://spalinux.com/2011/11/get-part-from-thai-sentence-using-php-multibyte-string</link>
		<comments>http://spalinux.com/2011/11/get-part-from-thai-sentence-using-php-multibyte-string#comments</comments>
		<pubDate>Tue, 22 Nov 2011 14:02:09 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Thai]]></category>
		<category><![CDATA[mbstring]]></category>
		<category><![CDATA[mutibyte string]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[substr]]></category>
		<category><![CDATA[thai]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1503</guid>
		<description><![CDATA[โปรแกรมประเภทเว็บบอร์ดหรือเว็บ Social ที่ต้องการตัดบางส่วนจากข้อความหรือบทความที่ยาว เพื่อเป็นตัวอย่าง แสดงในหน้าแรก หรือการ Share หัวข้อบทความเป็นตัวอย่าง จากเว็บไซต์อื่นๆ หากเป็นภาษาอังกฤษ สามารถทำได้อย่างง่าย แต่ปัญหาคือเวลาตัดคำภาษาไทย มักจะไม่ได้ตามที่ต้องการ และอาจมีอักษรประหลาดแสดงขึ้นมาด้วย ในบทความนี้จะแสดงการใช้ฟังก์ชั่น PHP Multibyte String เพื่อตัดบางส่วนของข้อความได้ตามต้องการได้ หมายเหตุ เครื่องที่ใช้ทดสอบ ตั้งค่าภาษาในรูปแบบ UTF-8 $ echo $LANG en_US.UTF-8 ถ้าเป็นภาษาอังกฤษ สามารถเขียนโปรแกรม PHP โดยใช้ฟังก์ชั่น substr เช่นต้องการข้อความโดยตัดตั้งแต่อักษรตัวแรก (0) ยาวไปจำนวน 7 ตัว &#60;?php $en_msg = 'This is an example'; print substr($en_msg, 0, 7) . "\n"; ?&#62; รันโปรแกรม ก็จะได้ข้อความตามที่ต้องการ $ php [...]]]></description>
			<content:encoded><![CDATA[<p>โปรแกรมประเภทเว็บบอร์ดหรือเว็บ Social ที่ต้องการตัดบางส่วนจากข้อความหรือบทความที่ยาว เพื่อเป็นตัวอย่าง แสดงในหน้าแรก หรือการ Share หัวข้อบทความเป็นตัวอย่าง จากเว็บไซต์อื่นๆ</p>
<p>หากเป็นภาษาอังกฤษ สามารถทำได้อย่างง่าย แต่ปัญหาคือเวลาตัดคำภาษาไทย มักจะไม่ได้ตามที่ต้องการ และอาจมีอักษรประหลาดแสดงขึ้นมาด้วย</p>
<p>ในบทความนี้จะแสดงการใช้ฟังก์ชั่น PHP Multibyte String เพื่อตัดบางส่วนของข้อความได้ตามต้องการได้</p>
<p><span id="more-1503"></span>หมายเหตุ เครื่องที่ใช้ทดสอบ ตั้งค่าภาษาในรูปแบบ UTF-8</p>
<pre>$ <strong>echo $LANG</strong>
en_US.UTF-8</pre>
<p>ถ้าเป็นภาษาอังกฤษ สามารถเขียนโปรแกรม PHP โดยใช้ฟังก์ชั่น substr เช่นต้องการข้อความโดยตัดตั้งแต่อักษรตัวแรก (0) ยาวไปจำนวน 7 ตัว</p>
<pre><!--?php <br ?-->&lt;?php
$en_msg = 'This is an example';
print <span style="color: #0000ff;">substr($en_msg, 0, 7)</span> . "\n";
?&gt;</pre>
<p>รันโปรแกรม ก็จะได้ข้อความตามที่ต้องการ</p>
<pre>$ <strong>php test-substr.php</strong>
This is</pre>
<p>แต่ถ้าเป็นข้อความภาษาไทย ข้อความที่ตัดได้จะไม่ใช่ เช่น ต้องการตั้งแต่อักษรตัวแรก (0) ยาวไปจำนวน 15 ตัวอักษร&lt;</p>
<pre><!--?php <br ?-->&lt;?php
$th_msg = 'ตัวอย่างข้อความภาษาไทยที่ใช้ทดสอบ';
print substr($th_msg, 0, 15) . "\n";
?&gt;</pre>
<p>ทดลองรันจะได้ตามตัวอย่าง</p>
<pre>$ <strong>php test-substr.php</strong>
ตัวอย</pre>
<p>เนื่องมาจากฟังก์ชั่น substr ไม่สามารถจัดการตัวอักษร UTF-8 ได้อย่างถูกต้อง จำเป็นต้องเปลี่ยนไปใช้ฟังก์ชั่น Multibyte String substr (mb_substr)</p>
<p>รูปแบบการใช้ฟังก์ชั่น mb_substr จะเหมือนกับ substr เพียงแต่ต้องระบุรูปแบบของภาษาด้วย&lt;</p>
<pre><!--?php <br ?-->&lt;?php
$th_msg = 'ตัวอย่างข้อความภาษาไทยที่ใช้ทดสอบ';
print <span style="color: #0000ff;">mb_substr($th_msg, 0, 15, 'UTF-8')</span>;
?&gt;</pre>
<p>ทดลองรันโปรแกรม</p>
<pre>$ <strong>php test-substr.php</strong>
<span style="color: #ff0000;">PHP Fatal error:  Call to undefined function mb_substr() in /home/user1/mbstring/test-substr.php on line 3</span>
หากขึ้น error แบบนี้ แสดงว่าไม่ได้ติดตั้งโมดูล Multibyte String ใน PHP</pre>
<p>ต้องคอมไพล์ PHP ใหม่ หรือติดตั้งไฟล์ rpm ชื่อ php-mbstring เพิ่มเติม</p>
<p>สามารถรัน php ตามด้วยออปชั่น &#8216;-m&#8217; เพื่อดูว่ามีโมดูล mbstring แล้วหรือไม่</p>
<p>หากติดตั้งเพิ่มเติมเรียบร้อยแล้ว</p>
<pre>$ <strong>php -m | grep mbstring</strong>
mbstring</pre>
<p>ทดลองรันอีกครั้ง ก็จะขึ้นจำนวนตัวอักษรถูกต้อง</p>
<pre>$ <strong>php test-substr.php</strong>
ตัวอย่างข้อความ</pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://www.php.net/manual/en/function.substr.php" target="_blank">PHP: substr &#8211; Manual</a></li>
<li><a href="http://www.php.net/manual/en/function.mb-substr.php" target="_blank">PHP: mb_substr &#8211; Manual</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2011/11/get-part-from-thai-sentence-using-php-multibyte-string/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>เขียนโปรแกรมด้วย PHP DOM เพื่อดึงข้อมูลจากไฟล์ HTML</title>
		<link>http://spalinux.com/2011/11/programming-using-php-dom-to-parse-html-file</link>
		<comments>http://spalinux.com/2011/11/programming-using-php-dom-to-parse-html-file#comments</comments>
		<pubDate>Sat, 12 Nov 2011 17:02:54 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1493</guid>
		<description><![CDATA[ได้รับข้อมูลในรูปแบบไฟล์ HTML เพื่อให้ดึงค่าจากบางฟิลด์ (field) ออกมา ใช้ในการทำรายงาน ในตอนแรกลองเขียนโปรแกรม PHP ขึ้นมาเอง โดยใช้ Regular Expression ทำไปซักพัก เริ่มยากขึ้น เหตุเพราะรูปแบบอันหลากหลายของไฟล์ HTML ไม่ว่าจะเป็นตัวอักษรพิมพ์ใหญ่เล็ก การเรียงลำดับ tag การเว้นวรรค พบวิธีการดึงข้อมูลโดยใช้ PHP DOM ง่ายขึ้นเยอะ เลยนำมาแชร์เล่าสู่กันฟัง ตัวอย่างไฟล์ test.html เพื่อจะดึงข้อมูล $ cat test.html &#60;html&#62; &#60;head&#62; &#60;title&#62;My Page&#60;/title&#62; &#60;/head&#62; &#60;body&#62; &#60;table&#62;  &#60;tr&#62;   &#60;td id="head_id"&#62;Id&#60;/td&#62;   &#60;td id="head_name"&#62;Name&#60;/td&#62;  &#60;/tr&#62;  &#60;tr&#62;   &#60;td id="data_id1"&#62;&#60;a href="view.php?id=1"&#62;1&#60;/a&#62;&#60;/td&#62;   &#60;td id="data_name1"&#62;Alice&#60;/td&#62;  &#60;/tr&#62;  &#60;tr&#62;   [...]]]></description>
			<content:encoded><![CDATA[<p>ได้รับข้อมูลในรูปแบบไฟล์ HTML เพื่อให้ดึงค่าจากบางฟิลด์ (field) ออกมา ใช้ในการทำรายงาน</p>
<p>ในตอนแรกลองเขียนโปรแกรม PHP ขึ้นมาเอง โดยใช้ Regular Expression ทำไปซักพัก เริ่มยากขึ้น เหตุเพราะรูปแบบอันหลากหลายของไฟล์ HTML ไม่ว่าจะเป็นตัวอักษรพิมพ์ใหญ่เล็ก การเรียงลำดับ tag การเว้นวรรค</p>
<p>พบวิธีการดึงข้อมูลโดยใช้ PHP DOM ง่ายขึ้นเยอะ เลยนำมาแชร์เล่าสู่กันฟัง</p>
<p><span id="more-1493"></span></p>
<p>ตัวอย่างไฟล์ test.html เพื่อจะดึงข้อมูล</p>
<pre>$ <strong>cat test.html</strong>

&lt;html&gt;
&lt;head&gt;
&lt;title&gt;My Page&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;table&gt;
 &lt;tr&gt;
  &lt;td id="head_id"&gt;Id&lt;/td&gt;
  &lt;td id="head_name"&gt;Name&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td id="data_id1"&gt;&lt;a href="view.php?id=1"&gt;1&lt;/a&gt;&lt;/td&gt;
  &lt;td id="data_name1"&gt;Alice&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td id="data_id2"&gt;&lt;a href="view.php?id=2"&gt;2&lt;/a&gt;&lt;/td&gt;
  &lt;td id="data_name2"&gt;Bob&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td id="data_id3"&gt;&lt;a href="view.php?id=3"&gt;3&lt;/a&gt;&lt;/td&gt;
  &lt;td id="data_name3"&gt;Carl&lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<h4>เริ่มต้นโหลดไฟล์ html ด้วย php dom</h4>
<p>เขียนไฟล์ php เริ่มต้นโหลดไฟล์ html</p>
<pre>&lt;?php
$html = new <span style="color: #0000ff;">DOMDocument</span>();
$html-&gt;<span style="color: #0000ff;">loadHTMLFile</span>('test.html');
var_dump($html);
?&gt;</pre>
<p>คำอธิบาย</p>
<ul>
<li>สร้าง object จาก class ชื่อ DOMDocument ตั้งไว้เป็นตัวแปรชื่อ $html</li>
<li>เรียก method ชื่อ loadHTMLFile เพื่อโหลดไฟล์ HTML ที่ต้องการดึงข้อมูล (parse)</li>
</ul>
<p>ทดลองรันโปรแกรม</p>
<pre>$ <strong>php parse-dom.php</strong>
<span style="color: #ff0000;">PHP Fatal error:  Class 'DOMDocument' not found in /var/www/html/php/dom/parse-dom.php on line 3</span>
$</pre>
<p>รันแล้ว error แบบนี้ เพราะว่าไม่มี php module ที่ชื่อ dom</p>
<p>ต้องติดตั้ง extension ชื่อ libxml เพิ่มเติม ทำได้สองแบบ</p>
<p>หากคอมไพล์ php เอง ต้อง คอมไพล์ใหม่ด้วยการระบุออปชั่น &#8211;enable-libxml เพิ่มเติมตอนรัน configure</p>
<p>แต่ถ้าติดตั้ง php จาก rpm บน Fedora, RedHat หรือ CentOS ต้องติดตั้งไฟล์ php-xml เพิ่มเติม</p>
<p>ตัวอย่างติดตั้ง rpm เพิ่มเติม บน CentOS 5.5 (updates)</p>
<pre>[root@web updates]# <strong>rpm -ivh php53-xml-5.3.3-1.el5.x86_64.rpm</strong>
Preparing...                ########################################### [100%]
   1:php53-xml              ########################################### [100%]</pre>
<p>รัน php ด้วยออปชั่น -m เพื่อดู  module ที่เพิ่มขึ้นมา</p>
<pre>$ <strong>php -m</strong>
...
<span style="color: #0000ff;">dom</span>
wddx
xmlreader
xmlwriter
xsl</pre>
<p>ทดลองรันโปรแกรมอีกครั้ง</p>
<pre>$ <strong>php parse-dom.php</strong>
object(DOMDocument)#1 (0) {
}</pre>
<h4>ดึงข้อมูลตาม html tag ที่ต้องการ</h4>
<p>ทำได้โดยง่ายด้วย method ชื่อ getElementsByTagName() ระบุชื่อ tag ที่ต้องการค้นหา</p>
<p>ตัวอย่าง ต้องการดึงข้อมูลที่อยู่ใน tag &#8220;td&#8221; หรือระหว่าง &lt;td&gt;&lt;/td&gt;</p>
<pre>&lt;?php
$html = new DOMDocument();
$html-&gt;loadHTMLFile('test.html');
$tds = $html-&gt;<span style="color: #0000ff;">getElementsByTagName</span>('td');
foreach ($tds as $td) {
    print $td-&gt;<span style="color: #0000ff;">nodeValue</span> . "\n";
}
?&gt;</pre>
<p>ทดลองรันโปรแกรม จะเห็นผลลัพธ์ที่ได้</p>
<pre>$ <strong>php parse-dom.php</strong>
Id
Name
1
Alice
2
Bob
3
Carl</pre>
<h4>ดึงข้อมูลตาม id ในไฟล์ html ที่ต้องการ</h4>
<p>ทำได้โดยใช้ method ชื่อ <span style="color: #0000ff;">getElementById</span>() ระบุ id ที่ต้องการค้นหา</p>
<p>ตัวอย่าง ต้องการดึงข้อมูลที่อยู่ใน tag ที่ระบุด้วย id &#8220;data_name2&#8243;</p>
<pre>&lt;?php
$html = new DOMDocument();
$html-&gt;loadHTMLFile('test.html');
$id2 = $html-&gt;<span style="color: #0000ff;">getElementById</span>('data_name2');
print $id2-&gt;<span style="color: #0000ff;">nodeValue</span> . "\n";
?&gt;</pre>
<p>ทดลองรันโปรแกรม จะเห็นผลลัพธ์ที่ได้</p>
<pre>$ <strong>php parse-dom.php</strong>
Bob</pre>
<p>ลองนำไปต่อยอด พัฒนากันต่อครับ</p>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://www.php.net/manual/en/book.dom.php" target="_blank">PHP: DOM &#8211; Manual</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2011/11/programming-using-php-dom-to-parse-html-file/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ปรับหน้าเว็บเพจให้พอดีหน้าจอ iPhone</title>
		<link>http://spalinux.com/2011/11/how-to-make-web-page-fit-on-iphone-screen</link>
		<comments>http://spalinux.com/2011/11/how-to-make-web-page-fit-on-iphone-screen#comments</comments>
		<pubDate>Mon, 07 Nov 2011 17:47:56 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[Safari]]></category>
		<category><![CDATA[viewport]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1475</guid>
		<description><![CDATA[อยู่ในช่วงปรับเว็บเพจที่พัฒนาใช้งานบน PC ให้สามารถรันบน browser ใน มือถือได้ด้วย เลยต้องปรับแต่งหน้าจอเพื่อให้ผู้ใช้งานได้สะดวก ในที่นี้ขอแชร์วิธีการเพิ่มขนาดเว็บเพจ เพื่อให้พอดีกับหน้าจอ Safari บน iPhone ด้วยการใช้ &#8220;viewport&#8221; ตัวอย่างไฟล์ HTML แบบง่ายๆ สำหรับหน้าจอการ Login &#60;html&#62; &#60;head&#62; &#60;title&#62;Login&#60;/title&#62; &#60;/head&#62; &#60;body&#62; &#60;div style="padding: 5px; background-color: #cccccc"&#62; &#60;form&#62; Username:&#60;br&#62; &#60;input type="text" name="username"&#62; &#60;br&#62; Password:&#60;br&#62; &#60;input type="text" name="password"&#62;&#60;br&#62; &#60;br&#62; &#60;input type="submit" value="login"&#62; &#60;/form&#62; &#60;/div&#62; &#60;/body&#62; &#60;/html&#62; เมื่อเปิดด้วย Safari บน iPhone จะเป็นแบบนี้ จะเห็นว่า ขนาดของฟอร์มมีขนาดเล็กเกินไป ผู้ใช้จำต้องขยายขนาด [...]]]></description>
			<content:encoded><![CDATA[<p>อยู่ในช่วงปรับเว็บเพจที่พัฒนาใช้งานบน PC ให้สามารถรันบน browser ใน มือถือได้ด้วย เลยต้องปรับแต่งหน้าจอเพื่อให้ผู้ใช้งานได้สะดวก</p>
<p>ในที่นี้ขอแชร์วิธีการเพิ่มขนาดเว็บเพจ เพื่อให้พอดีกับหน้าจอ Safari บน iPhone ด้วยการใช้ &#8220;viewport&#8221;</p>
<p><span id="more-1475"></span></p>
<p>ตัวอย่างไฟล์ HTML แบบง่ายๆ สำหรับหน้าจอการ Login</p>
<pre>&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Login&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div style="padding: 5px; background-color: #cccccc"&gt;
&lt;form&gt;
Username:&lt;br&gt;
&lt;input type="text" name="username"&gt;
&lt;br&gt;
Password:&lt;br&gt;
&lt;input type="text" name="password"&gt;&lt;br&gt;
&lt;br&gt;
&lt;input type="submit" value="login"&gt;
&lt;/form&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>เมื่อเปิดด้วย Safari บน iPhone จะเป็นแบบนี้</p>
<p><a href="http://spalinux.com/wp-content/uploads/2011/11/Picture-001.png"><img class="alignnone size-full wp-image-1477" title="Picture 001" src="http://spalinux.com/wp-content/uploads/2011/11/Picture-001.png" alt="" width="447" height="211" /></a></p>
<p>จะเห็นว่า ขนาดของฟอร์มมีขนาดเล็กเกินไป ผู้ใช้จำต้องขยายขนาด เพื่อจะกดใช้งาน ทำให้ไม่สะดวก</p>
<p>ได้ไอเดียมาจากหน้า login ของโปรแกรม wordpress โดยต้องเพิ่ม tag meta &#8220;viewport&#8221; ในไฟล์ HTML เพื่อให้ขนาดของเว็บเพจมีขนาดใหญ่ขึ้น</p>
<pre>&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Login&lt;/title&gt;
<span style="color: #0000ff;">&lt;meta name="viewport" content="width=320; initial-scale=0.9; maximum-scale=1.0; user-scalable=0;" /&gt;</span>
&lt;/head&gt;
&lt;body&gt;
&lt;div style="padding: 5px; background-color: #cccccc"&gt;
&lt;form&gt;
Username:&lt;br&gt;
&lt;input type="text" name="username"&gt;
&lt;br&gt;
Password:&lt;br&gt;
&lt;input type="text" name="password"&gt;&lt;br&gt;
&lt;br&gt;
&lt;input type="submit" value="login"&gt;
&lt;/form&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>เมื่อเปิดด้วย Safari บน iPhone ขนาดก็จะเพิ่มขึ้นมา</p>
<p><a href="http://spalinux.com/wp-content/uploads/2011/11/Picture-002.png"><img class="alignnone size-full wp-image-1478" title="Picture 002" src="http://spalinux.com/wp-content/uploads/2011/11/Picture-002.png" alt="" width="448" height="285" /></a><br />
สามารถปรับเปลี่ยนตามที่ต้องการได้ ทดลองดูให้เหมาะกับเว็บเพจของคุณ</p>
<pre>&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Login&lt;/title&gt;
<span style="color: #0000ff;">&lt;meta name="viewport" content="width=100%; initial-scale=1.4; maximum-scale=1.4; user-scalable=0;" /&gt; </span>&lt;/head&gt;
&lt;body&gt;
&lt;div style="padding: 5px; background-color: #cccccc"&gt;
&lt;form&gt;
Username:&lt;br&gt;
&lt;input type="text" name="username"&gt;
&lt;br&gt;
Password:&lt;br&gt;
&lt;input type="text" name="password"&gt;&lt;br&gt;
&lt;br&gt;
&lt;input type="submit" value="login"&gt;
&lt;/form&gt;
&lt;/div&gt;</pre>
<pre>&lt;/body&gt;
&lt;/html&gt;</pre>
<p><a href="http://spalinux.com/wp-content/uploads/2011/11/Picture-003.png"><img class="alignnone size-full wp-image-1479" title="Picture 003" src="http://spalinux.com/wp-content/uploads/2011/11/Picture-003.png" alt="" width="448" height="398" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2011/11/how-to-make-web-page-fit-on-iphone-screen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>คอนฟิก SNMP บน Solaris 10</title>
		<link>http://spalinux.com/2010/07/configure_snmp_on_solaris_10</link>
		<comments>http://spalinux.com/2010/07/configure_snmp_on_solaris_10#comments</comments>
		<pubDate>Sat, 17 Jul 2010 07:36:11 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SNMP]]></category>
		<category><![CDATA[Solaris]]></category>
		<category><![CDATA[solaris 10]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1132</guid>
		<description><![CDATA[SNMP เป็นเครื่องมือหนึ่งที่สามารถใช้ดูการทำงานของเครื่อง เก็บประวัติการใช้ resource ต่างๆ ของเครื่อง ไม่ว่าจะเป็น CPU, Memory, Disk, Network แล้วสามารถนำมาใช้สร้างเป็นกราฟ รายงาน เพื่อวางแผนการเพิ่ม hardware เมื่อจำเป็นได้ ในบทความนี้จะอธิบายวิธีการคอนฟิกและรัน SNMP Server บน Solaris 10 เพื่อให้สามารถใช้โปรแกรม SNMP เช่น MRTG, Cacti, NMS  มาเก็บค่าต่างๆ ได้ ระบบทดสอบ บทความนี้ทดสอบบน Solaris 10 (x86) 10/09 # cat /etc/release                        Solaris 10 10/09 s10x_u8wos_08a X86            Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.                         [...]]]></description>
			<content:encoded><![CDATA[<p>SNMP เป็นเครื่องมือหนึ่งที่สามารถใช้ดูการทำงานของเครื่อง เก็บประวัติการใช้ resource ต่างๆ ของเครื่อง ไม่ว่าจะเป็น CPU, Memory, Disk, Network แล้วสามารถนำมาใช้สร้างเป็นกราฟ รายงาน เพื่อวางแผนการเพิ่ม hardware เมื่อจำเป็นได้</p>
<p>ในบทความนี้จะอธิบายวิธีการคอนฟิกและรัน SNMP Server บน Solaris 10 เพื่อให้สามารถใช้โปรแกรม SNMP เช่น MRTG, Cacti, NMS  มาเก็บค่าต่างๆ ได้</p>
<p><span id="more-1132"></span></p>
<h4>ระบบทดสอบ</h4>
<p>บทความนี้ทดสอบบน Solaris 10 (x86) 10/09</p>
<pre># <strong>cat /etc/release
</strong>                       Solaris 10 10/09 s10x_u8wos_08a X86
           Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
                        Use is subject to license terms.
                           Assembled 16 September 2009</pre>
<h4>รันเซอร์วิส sma</h4>
<p>โปรแกรมชุด SNMP หรือ System Management Agent ใน Solaris 10 ได้มาจาก Net-SNMP ซึ่งเป็น freeware โดยจะถูกติดตั้งใน path ที่ชื่อ /usr/sfw/ ดังนี้น เวลารันคำสั่ง อาจต้องมีการระบุ PATH เพิ่มเติม</p>
<p>System Management Agent บน Solaris 10 ถูกควบคุมด้วยเซอร์วิสที่ชื่อ sma</p>
<p>ใช้คำสั่ง svcs เพื่อตรวจสอบว่ารันเซอร์วิส sma อยู่หรือไม่</p>
<pre># <strong>svcs -a | grep sma
</strong>disabled       13:50:30 svc:/application/management/sma:default</pre>
<p>หมายเหตุ ต้องระบุออปชั่น &#8216;-a&#8217; เพื่อดูชื่อเซอร์วิสทั้งหมด ทั้งที่ enable และ disable ไว้</p>
<p>ไฟล์คอนฟิกของ SNMP Server คือ /etc/sma/snmp/snmpd.conf</p>
<pre># <strong>cat /etc/sma/snmp/snmpd.conf
</strong>...
###########################################################################
#
# SECTION: Access Control Setup
#
#   This section defines who is allowed to talk to your running
#   snmp agent.</pre>
<pre># rocommunity: a SNMPv1/SNMPv2c read-only access community name
#   arguments:  community [default|hostname|network/bits] [oid]</pre>
<pre>rocommunity  public
...</pre>
<p>ดีฟอลต์ SNMP Community String แบบ read-only คือ &#8220;public&#8221; แนะนำให้เปลี่ยน เช่นเปลี่ยนเป็น &#8220;test_public_read&#8221;</p>
<pre># <strong>cat /etc/sma/snmp/snmpd.conf
</strong>...
rocommunity  <strong>test_public_read
</strong>...</pre>
<p>ใช้คำสั่ง svcadm เพื่อรันเซอร์วิส sma</p>
<pre># <strong>svcadm enable svc:/application/management/sma:default</strong></pre>
<pre># <strong>svcs -a  | grep sma
</strong>online         14:18:37 svc:/application/management/sma:default</pre>
<p>ใช้คำสั่ง ps เพื่อตรวจสอบ process ของ snmpd (SNMP Server)</p>
<pre># <strong>ps -ef | grep snmp
</strong>    root  1008     1   0 14:18:38 ?           0:00 /usr/sfw/sbin/snmpd</pre>
<p>ทดลองใช้คำสั่ง snmpwalk เพื่อ walk ค่าต่างๆ ผ่านทาง SNMP</p>
<pre># <strong>/usr/sfw/bin/snmpwalk -v 1 -c test_public_read 127.0.0.1 system
</strong>SNMPv2-MIB::sysDescr.0 = STRING: SunOS sol10u8-zfs64a 5.10 Generic_141445-09 i86pc
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.3
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (12062) 0:02:00.62
SNMPv2-MIB::sysContact.0 = STRING: "System administrator"
SNMPv2-MIB::sysName.0 = STRING: sol10u8-zfs64a
SNMPv2-MIB::sysLocation.0 = STRING: "System administrators office"
SNMPv2-MIB::sysServices.0 = INTEGER: 72
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (64) 0:00:00.64
SNMPv2-MIB::sysORID.1 = OID: IF-MIB::ifMIB
SNMPv2-MIB::sysORID.2 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.3 = OID: TCP-MIB::tcpMIB
...</pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://docs.sun.com/app/docs/doc/817-3000/introduction-1?l=en&amp;a=view" target="_blank">Solaris System Management Agent Administration Guide</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2010/07/configure_snmp_on_solaris_10/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>การแสดงผล Error ของ PHP</title>
		<link>http://spalinux.com/2010/02/configure_display_php_errors</link>
		<comments>http://spalinux.com/2010/02/configure_display_php_errors#comments</comments>
		<pubDate>Fri, 12 Feb 2010 08:21:45 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[php error]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1077</guid>
		<description><![CDATA[การตรวจสอบข้อผิดพลาด (error) เวลาพัฒนาโปรแกรม หรือเมื่อรันโปรแกรม ถือว่ามีความสำคัญอย่างหนึ่ง เพื่อที่จะทำให้ระบบทำงานได้อย่างถูกต้อง สำหรับการพัฒนา Web Application ด้วย PHP การตรวจสอบหรือแสดงผลข้อผิดพลาด สามารถทำได้ สองวิธีหลักๆ คือ แสดงข้อผิดพลาด (error) ผ่านหน้าเว็บ เก็บข้อผิดพลาดไว้ในไฟล์ (log file) เพื่อการตรวจสอบ วิธีแรก การแสดงผลข้อผิดพลาด ผ่านหน้าเว็บเมื่อรันโปรแกรมเลย ถือว่ามีความสะดวกสบายมาก คือเมื่อโปรแกรมเมอร์พัฒนาโปรแกรมไป รันผ่านหน้าเว็บ ก็สามารถเห็นข้อผิดพลาดที่เกิดขึ้นได้เลย ว่าเกิดปัญหาที่ไหน ไฟล์อะไร บรรทัดเท่าไร แต่จะมีข้อเสียอย่างมาก หากปล่อยให้มีการแสดงผลข้อผิดพลาดนี้ แก่ผู้ใช้งานทั่วไป เพราะอาจแสดงรายละเอียดโปรแกรมมากเกินไป ซึ่งอาจทำให้เปิดเผยช่องโหว่ของโปรแกรมได้ คำแนะนำคือ ในขณะที่กำลังพัฒนาโปรแกรม (development) หรือบนเครื่องเซิร์ฟเวอร์สำหรับทดสอบโปรแกรม เราอาจเปิดการแสดงผลข้อผิดพลาดผ่านหน้าเว็บเลย เพื่อสะดวกต่อโปรแกรมเมอร์ ในการตรวจสอบ แต่เมื่อไรก็ตาม ระบบเริ่มใช้งานจริง (production) แนะนำให้ปิดการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ ให้เก็บข้อผิดพลาดไว้ในแบบที่ 2 คือเก็บไว้ในไฟล์ (log file) แล้วดูข้อผิดพลาดจากในไฟล์ ตัวอย่างข้อผิดพลาดในการเขียน [...]]]></description>
			<content:encoded><![CDATA[<p>การตรวจสอบข้อผิดพลาด (error) เวลาพัฒนาโปรแกรม หรือเมื่อรันโปรแกรม ถือว่ามีความสำคัญอย่างหนึ่ง เพื่อที่จะทำให้ระบบทำงานได้อย่างถูกต้อง</p>
<p>สำหรับการพัฒนา Web Application ด้วย PHP การตรวจสอบหรือแสดงผลข้อผิดพลาด สามารถทำได้ สองวิธีหลักๆ คือ</p>
<ol>
<li>แสดงข้อผิดพลาด (error) ผ่านหน้าเว็บ</li>
<li>เก็บข้อผิดพลาดไว้ในไฟล์ (log file) เพื่อการตรวจสอบ</li>
</ol>
<p><span id="more-1077"></span></p>
<p>วิธีแรก การแสดงผลข้อผิดพลาด ผ่านหน้าเว็บเมื่อรันโปรแกรมเลย ถือว่ามีความสะดวกสบายมาก คือเมื่อโปรแกรมเมอร์พัฒนาโปรแกรมไป รันผ่านหน้าเว็บ ก็สามารถเห็นข้อผิดพลาดที่เกิดขึ้นได้เลย ว่าเกิดปัญหาที่ไหน ไฟล์อะไร บรรทัดเท่าไร</p>
<p>แต่จะมีข้อเสียอย่างมาก หากปล่อยให้มีการแสดงผลข้อผิดพลาดนี้ แก่ผู้ใช้งานทั่วไป เพราะอาจแสดงรายละเอียดโปรแกรมมากเกินไป ซึ่งอาจทำให้เปิดเผยช่องโหว่ของโปรแกรมได้</p>
<p>คำแนะนำคือ ในขณะที่กำลังพัฒนาโปรแกรม (development) หรือบนเครื่องเซิร์ฟเวอร์สำหรับทดสอบโปรแกรม เราอาจเปิดการแสดงผลข้อผิดพลาดผ่านหน้าเว็บเลย เพื่อสะดวกต่อโปรแกรมเมอร์ ในการตรวจสอบ</p>
<p>แต่เมื่อไรก็ตาม ระบบเริ่มใช้งานจริง (production) แนะนำให้ปิดการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ ให้เก็บข้อผิดพลาดไว้ในแบบที่ 2 คือเก็บไว้ในไฟล์ (log file) แล้วดูข้อผิดพลาดจากในไฟล์</p>
<p>ตัวอย่างข้อผิดพลาดในการเขียน PHP เช่น พิมพ์เครื่องหมาย : แทนที่เป็น ;</p>
<pre>$ <strong>cat /var/www/html/test.php
</strong>&lt;?php</pre>
<pre>print 'hello'<span style="color: #ff0000;"><strong>:</strong></span></pre>
<pre>?&gt;</pre>
<h4>แสดงข้อผิดพลาดผ่านหน้าเว็บ (display_errors)</h4>
<p>PHP เวอร์ชั่นหลังๆ จะปิดการแสดงข้อผิดพลาดผ่านหน้าเว็บ หากต้องการเปิดคุณสมบัตินี้ทำได้สองวิธีคือ</p>
<p>1. แก้ไฟล์ /etc/php.ini จะมีผลทั้งเซิร์ฟเวอร์</p>
<p>ออปชั่นที่ต้องแก้ไขคือ &#8220;display_errors&#8221;</p>
<ul>
<li>&#8220;On&#8221; หากต้องการเปิดการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ เหมาะสำหรับการพัฒนาโปรแกรม (development)</li>
<li>&#8220;Off&#8221; หากไม่ต้องการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ สำหรับระบบที่ใช้งานจริงแล้ว (production)</li>
</ul>
<p>ตัวอย่างการคอนฟิกในไฟล์ /etc/php.ini</p>
<pre>...
display_errors = On
...</pre>
<p>หลังจากแก้ไขไฟล์ ต้องรีโหลด Web Server เพื่อให้คอนฟิกใหม่มีผล</p>
<pre># <strong>service httpd reload
</strong>Reloading httpd:                                           [  OK  ]</pre>
<p>ตัวอย่างการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ</p>
<p><a href="http://spalinux.com/wp-content/uploads/2010/02/02-display_errors_with_html_errors.png"><img title="display_errors = On" src="http://spalinux.com/wp-content/uploads/2010/02/02-display_errors_with_html_errors.png" alt="" width="595" height="272" /></a></p>
<p>2. หากไม่สามารถแก้ไขไฟล์ /etc/php.ini ได้ สามารถใช้ฟังก์ชั่น &#8220;ini_set&#8221; เพื่อเปิดคุณสมบัตินี้ได้</p>
<p>ตัวอย่างการใช้ฟังก์ชั่น &#8220;ini_set&#8221; เพื่อตั้งค่าคอนฟิก &#8220;display_errors&#8221;</p>
<pre>&lt;?php

ini_set('display_errors', TRUE);
...
?&gt;</pre>
<h4>เก็บข้อผิดพลาดไว้ในไฟล์ (error_log)</h4>
<p>เมื่อระบบใช้งานจริง (production) แล้ว แนะนำให้ปิดการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ แต่ให้เก็บไว้ในไฟล์ ไว้ดูย้อนหลังได้</p>
<p>ตัวอย่างคอนฟิกให้เก็บข้อผิดพลาดของการรัน PHP ไว้ในไฟล์ /var/log/httpd/php_errors.log</p>
<pre>...
html_errors = Off
log_errors = On
error_log = /var/log/httpd/php_errors.log
...</pre>
<p>ต้องสร้างไฟล์สำหรับเก็บ และตั้งค่าเจ้าของไฟล์ (owner) เพื่อให้โปรเซสเว็บเซิร์ฟเวอร์ เช่น apache เขียนไฟล์ได้</p>
<pre># <strong>touch /var/log/httpd/php_errors.log
</strong># <strong>chown apache /var/log/httpd/php_errors.log</strong></pre>
<p>หลังจากแก้ไขไฟล์ ต้องรีโหลด Web Server เพื่อให้คอนฟิกใหม่มีผล</p>
<pre># <strong>service httpd reload
</strong>Reloading httpd:                                           [  OK  ]</pre>
<p>ตัวอย่างข้อผิดพลาดที่ถูกเก็บไว้ในไฟล์</p>
<pre># <strong>tail -f /var/log/httpd/php_errors.log
</strong>[12-Feb-2010 12:49:25] PHP Parse error:  syntax error, unexpected ':' in /var/www/html/test.php on line 3</pre>
<p>หรือถ้าต้องการเก็บไว้ใน syslog ก็แก้คอนฟิก &#8220;error_log&#8221; ให้เป็น syslog ได้</p>
<pre>...
html_errors = Off
log_errors = On
error_log = syslog
...</pre>
<p>ตัวอย่างการแสดงผลในไฟล์ /var/log/messages</p>
<pre># <strong>tail -f /var/log/messages
</strong>Feb 12 15:05:08 web httpd: PHP Parse error:  syntax error, unexpected ':' in /var/www/html/test.php on line 3</pre>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2010/02/configure_display_php_errors/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>เขียนโปรแกรมเรียง ip address</title>
		<link>http://spalinux.com/2009/09/how_to_sort_ip_address</link>
		<comments>http://spalinux.com/2009/09/how_to_sort_ip_address#comments</comments>
		<pubDate>Sun, 13 Sep 2009 14:06:28 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[sort ip address]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=912</guid>
		<description><![CDATA[ช่วงนี้รับงานเขียนโปรแกรมเพื่อเก็บข้อมูลอุปกรณ์เน็ตเวิร์ค เพื่อตรวจสอบสถานะการใช้งาน และเก็บสถิติไว้ ข้อมูลอย่างหนึ่งที่เก็บคือ IP Address ของเครื่อง ปัญหาที่เจอคือเวลาสร้างรายชื่ออุปกรณ์ แล้วต้องการเรียง IP Address จากมากไปน้อย ผลลัพธ์ที่แสดงออกมาจะไม่ถูกต้องตามที่ต้องการ ตัวอย่างโครงสร้าง table ที่เก็บข้อมูล mysql&#62; DESCRIBE devices; +-----------+------------------+------+-----+---------+----------------+ &#124; Field     &#124; Type             &#124; Null &#124; Key &#124; Default &#124; Extra          &#124; +-----------+------------------+------+-----+---------+----------------+ &#124; device_id &#124; int(10) unsigned &#124; NO   &#124; PRI &#124; NULL    &#124; auto_increment &#124; &#124; device_ip &#124; varchar(15)      &#124; YES  &#124;     [...]]]></description>
			<content:encoded><![CDATA[<p>ช่วงนี้รับงานเขียนโปรแกรมเพื่อเก็บข้อมูลอุปกรณ์เน็ตเวิร์ค เพื่อตรวจสอบสถานะการใช้งาน และเก็บสถิติไว้ ข้อมูลอย่างหนึ่งที่เก็บคือ IP Address ของเครื่อง</p>
<p>ปัญหาที่เจอคือเวลาสร้างรายชื่ออุปกรณ์ แล้วต้องการเรียง IP Address จากมากไปน้อย ผลลัพธ์ที่แสดงออกมาจะไม่ถูกต้องตามที่ต้องการ</p>
<p><span id="more-912"></span></p>
<p>ตัวอย่างโครงสร้าง table ที่เก็บข้อมูล</p>
<pre>mysql&gt; <strong>DESCRIBE devices;
</strong>+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| device_id | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| device_ip | varchar(15)      | YES  |     | NULL    |                |
+-----------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)</pre>
<p>ตัวอย่างข้อมูลที่เก็บ</p>
<pre>mysql&gt; <strong>SELECT * FROM devices;
</strong>+-----------+-----------------+
| device_id | device_ip       |
+-----------+-----------------+
|         1 | 192.168.3.9     |
|         2 | 192.168.10.20   |
|         3 | 192.168.1.1     |
|         4 | 192.168.200.254 |
|         5 | 192.168.5.132   |
+-----------+-----------------+
5 rows in set (0.00 sec)</pre>
<p>ตัวอย่างผลลัพธ์จากการเรียง IP Address โดยใช้ ORDER BY</p>
<pre>mysql&gt; <strong>SELECT * FROM devices ORDER BY device_ip;
</strong>+-----------+-----------------+
| device_id | device_ip       |
+-----------+-----------------+
|         3 | 192.168.1.1     |
|         2 | 192.168.10.20   |
|         4 | 192.168.200.254 |
|         1 | 192.168.3.9     |
|         5 | 192.168.5.132   |
+-----------+-----------------+
5 rows in set (0.00 sec)</pre>
<p>ผลลัพธ์ที่ได้ เนื่องจากฟิลด์ device_ip ถูกกำหนดเป็น VARCHAR ทำให้การใช้ ORDER BY จะเป็นเรียงตามตัวอักษร คือเรียง 1, 2, 3</p>
<p>เพื่อให้การผลลัพธ์การเรียงถูกต้อง จำเป็นต้องแปลง IP Address จาก VARCHAR ให้เป็น ค่าตัวเลข โดยใช้ฟังก์ชั่น INET_ATON ใน MySQL</p>
<p>ดูวิธีการใช้ฟังก์ชั่น INET_ATON ใน MySQL</p>
<pre>mysql&gt; <strong>HELP INET_ATON;
</strong>Name: 'INET_ATON'
Description:
Syntax:
INET_ATON(expr)</pre>
<pre>Given the dotted-quad representation of a network address as a string,
returns an integer that represents the numeric value of the address.
Addresses may be 4- or 8-byte addresses.</pre>
<pre>URL: http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html</pre>
<pre>Examples:
mysql&gt; SELECT INET_ATON('209.207.224.40');
        -&gt; 3520061480</pre>
<p>การเรียง IP Address โดยใช้ฟังก์ชั่น INET_ATON แปลงค่า</p>
<pre>mysql&gt; <strong>SELECT * FROM devices ORDER BY INET_ATON(device_ip);
</strong>+-----------+-----------------+
| device_id | device_ip       |
+-----------+-----------------+
|         3 | 192.168.1.1     |
|         1 | 192.168.3.9     |
|         5 | 192.168.5.132   |
|         2 | 192.168.10.20   |
|         4 | 192.168.200.254 |
+-----------+-----------------+
5 rows in set (0.01 sec)</pre>
<p>ผลลัพธ์ที่ได้จะเรียงได้อย่างถูกต้อง</p>
<h4>ฟังก์ชั่น MySQL ที่เกี่ยวข้อง</h4>
<p>ฟังก์ชั่น INET_ATON แปลงจาก IP Address เป็นตัวเลข</p>
<pre>mysql&gt; <strong>SELECT INET_ATON('192.168.1.1');
</strong>+--------------------------+
| INET_ATON('192.168.1.1') |
+--------------------------+
|               3232235777 |
+--------------------------+
1 row in set (0.00 sec)</pre>
<p>ฟังก์ชั่น INET_NTOA แปลงจากตัวเลขเป็น IP Address</p>
<pre>mysql&gt; <strong>SELECT INET_NTOA('3232235777');
</strong>+-------------------------+
| INET_NTOA('3232235777') |
+-------------------------+
| 192.168.1.1             |
+-------------------------+
1 row in set (0.00 sec)</pre>
<h4>ฟังก์ชั่น PHP ที่เกี่ยวข้อง</h4>
<p>ฟังก์ชั่น ip2long แปลงจาก IP Address เป็นตัวเลข</p>
<pre><strong>print ip2long('192.168.1.1');</strong></pre>
<pre>// return
3232235777</pre>
<p>ฟังก์ชั่น long2ip แปลงจากตัวเลขเป็น IP Address</p>
<pre><strong>print long2ip('3232235777');</strong></pre>
<pre>// return
192.168.1.1</pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/miscellaneous-functions.html" target="_blank">MySQL 5.1 Reference Manual :: Miscellaneous Functions</a></li>
<li><a href="http://www.php.net/ip2long" target="_blank">PHP: ip2long &#8211; Manual</a></li>
<li><a href="http://www.php.net/long2ip" target="_blank">PHP: long2ip &#8211; Manual</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2009/09/how_to_sort_ip_address/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>โหลดข้อมูลเข้า MySQL ด้วย LOAD DATA INFILE</title>
		<link>http://spalinux.com/2009/08/mysql_load_data_infile</link>
		<comments>http://spalinux.com/2009/08/mysql_load_data_infile#comments</comments>
		<pubDate>Sat, 15 Aug 2009 08:08:21 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[mysql load data]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=901</guid>
		<description><![CDATA[บ่อยครั้งที่เราได้ข้อมูลเป็นไฟล์ธรรมดาแบบ text แล้วเราต้องการนำข้อมูลนี้ใส่เข้าไปในฐานข้อมูลเช่น MySQL มีหลายวิธีในการเขียนโปรแกรม เพื่อจะโหลดข้อมูลเข้า MySQL ได้ ในบทความนี้ขอแนะนำวิธีการใช้คำสั่ง LOAD DATA INFILE ซึ่งเป็นคำสั่งใน MySQL เพื่อทำหน้าที่นี้โดยเฉพาะ และมีประสิทธิภาพ ความเร็วในการโหลดข้อมูลลงฐานข้อมูลสูงมาก ในที่นี้จะเปรียบเทียบความเร็วการเขียนโปรแกรมแบบเปิดไฟล์แล้ววนลูปทีละบรรทัดเพื่อโหลดข้อมูล กับการใช้คำสั่ง LOAD DATA INFILE ทีเดียวเลย ตัวอย่างข้อมูลที่ทดสอบ ในการทดสอบ เราจะสร้าง table ขึ้นมาแบบง่ายๆ มี 3 column ดังนี้ CREATE TABLE test_load (  id     INTEGER UNSIGNED AUTO_INCREMENT,  dat1   INTEGER UNSIGNED,  dat2   INTEGER UNSIGNED,  PRIMARY KEY(id) ); ส่วนไฟล์ข้อมูลที่เราจะโหลดทั้งหมด 10,000 บรรทัด มีสองฟิลด์คั่นด้วยเครื่องหมาย comma &#8220;,&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>บ่อยครั้งที่เราได้ข้อมูลเป็นไฟล์ธรรมดาแบบ text แล้วเราต้องการนำข้อมูลนี้ใส่เข้าไปในฐานข้อมูลเช่น MySQL มีหลายวิธีในการเขียนโปรแกรม เพื่อจะโหลดข้อมูลเข้า MySQL ได้</p>
<p>ในบทความนี้ขอแนะนำวิธีการใช้คำสั่ง LOAD DATA INFILE ซึ่งเป็นคำสั่งใน MySQL เพื่อทำหน้าที่นี้โดยเฉพาะ และมีประสิทธิภาพ ความเร็วในการโหลดข้อมูลลงฐานข้อมูลสูงมาก</p>
<p>ในที่นี้จะเปรียบเทียบความเร็วการเขียนโปรแกรมแบบเปิดไฟล์แล้ววนลูปทีละบรรทัดเพื่อโหลดข้อมูล กับการใช้คำสั่ง LOAD DATA INFILE ทีเดียวเลย</p>
<p><span id="more-901"></span></p>
<h4>ตัวอย่างข้อมูลที่ทดสอบ</h4>
<p>ในการทดสอบ เราจะสร้าง table ขึ้นมาแบบง่ายๆ มี 3 column ดังนี้</p>
<pre>CREATE TABLE test_load (
 id     INTEGER UNSIGNED AUTO_INCREMENT,
 dat1   INTEGER UNSIGNED,
 dat2   INTEGER UNSIGNED,
 PRIMARY KEY(id)
);</pre>
<p>ส่วนไฟล์ข้อมูลที่เราจะโหลดทั้งหมด 10,000 บรรทัด มีสองฟิลด์คั่นด้วยเครื่องหมาย comma &#8220;,&#8221; ตัวอย่างไฟล์เป็นดังนี้</p>
<pre>[user@db-server ~]$ <strong>cat data.txt
</strong>2436,156
1732,9161
3016,49
1833,963
5430,434
2092,3929
5430,444
4123,120
...</pre>
<h4>เปิดไฟล์ วนลูป แล้ว INSERT ข้อมูล</h4>
<p>ตัวอย่างโปรแกรม PHP ที่เปิดไฟล์  วนลูปทีละบรรทัด แล้ว INSERT ข้อมูลลง MySQL</p>
<pre>&lt;?php</pre>
<pre>// connect database
mysql_connect("localhost", "db_user", "db_pass");
mysql_select_db("test");</pre>
<pre>$fname  = $argv[1];</pre>
<pre>// open file
$fh = fopen($fname, "r");</pre>
<pre>while ( $fline = fgetcsv($fh, "4096", ",") ) {
    $_dat1 = $fline[0];
    $_dat2 = $fline[1];</pre>
<pre>    // loop insert data
    $db_sql = "INSERT INTO test_load ( dat1, dat2 )  VALUES ( '$_dat1', '$_dat2' );";
    $db_res = mysql_query($db_sql) or die($db_sql);</pre>
<pre>}</pre>
<pre>fclose($fh);
?&gt;</pre>
<p>รันโปรแกรม และใช้คำสั่ง time เพื่อจับเวลาที่ใช้ในการรัน</p>
<pre>[user@db-server ~]$ <strong>time php insert-data.php data.txt</strong></pre>
<pre><span style="color: #0000ff;"><strong>real    0m0.898s
</strong></span>user    0m0.100s
sys     0m0.564s</pre>
<h4>ใช้คำสั่ง LOAD DATA INFILE</h4>
<p>รูปแบบการใช้คำสั่ง LOAD DATA INFILE มีดังนี้</p>
<pre><strong>LOAD DATA</strong> [LOW_PRIORITY | CONCURRENT] [<strong>LOCAL</strong>] <strong>INFILE 'file_name'
</strong>    [REPLACE | IGNORE]
<strong>    INTO TABLE tbl_name
</strong>    [CHARACTER SET charset_name]
    [{<strong>FIELDS</strong> | COLUMNS}
        [<strong>TERMINATED BY 'string'</strong>]
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number LINES]
    [<strong>(col_name_or_user_var,...)</strong>]
    [SET col_name = expr,...]</pre>
<p>คำอธิบายการใช้คำสั่งโดยย่อ</p>
<ul>
<li>INFILE &#8216;file_name&#8217; ระบุว่าโหลดจากไฟล์ไหน </li>
<li>INTO TABLE tbl_name  ระบุชื่อ table ที่จะโหลดข้อมูลลง</li>
<li>FIELDS TERMINATED BY &#8216;string&#8217;  แต่ละฟิลด์คั่นด้วยเครื่องหมายอะไร</li>
<li>(col_name_or_user_var,&#8230;) ในกรณีที่โหลดไม่ครบทุกฟิลด์ตามโครงสร้างของ table ต้องมีการระบุด้วยว่าโหลดใส่ชื่อฟิลด์อะไรบ้างตามลำดับ</li>
</ul>
<p>ตัวอย่างการเขียนโปรแกรม เพื่อโหลดข้อมูลจากไฟล์ ลง table ชื่อ test_load แต่ละฟิลด์คั่นด้วยเครื่องหมาย &#8220;,&#8221; และโหลดเฉพาะฟิลด์ที่ชื่อ dat1, dat2 ตามลำดับ</p>
<pre>&lt;?php</pre>
<pre>// connect database
mysql_connect("localhost", "db_user", "db_pass");
mysql_select_db("test");</pre>
<pre>$fname  = $argv[1];</pre>
<pre>// load data
$db_sql = "LOAD DATA LOCAL INFILE '$fname' INTO TABLE test_load
             FIELDS TERMINATED BY ',' ( dat1, dat2 );";
$db_res = mysql_query($db_sql) or die($db_sql);</pre>
<pre>?&gt;</pre>
<p>รันโปรแกรมเพื่อโหลดข้อมูลลง MySQL ใช้คำสั่ง time เพื่อจับเวลาที่ใช้ในการรันโปรแกรม</p>
<pre>[user@db-server ~]$ <strong>time php load-data.php data.txt</strong></pre>
<pre><strong><span style="color: #0000ff;">real    0m0.117s
</span></strong>user    0m0.054s
sys     0m0.023s</pre>
<p>สังเกตว่าเวลาที่ใช้ในการรันเพื่อโหลดข้อมูลด้วย LOAD DATA INFILE เร็วกว่าการ เปิดไฟล์และวนลูปมาก</p>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/load-data.html" target="_blank">MySQL 5.1 Reference Manual :: 12.2.6 LOAD DATA INFILE Syntax</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2009/08/mysql_load_data_infile/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ติดตั้ง Cacti บน Fedora 11 ตอนที่ 3</title>
		<link>http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_3</link>
		<comments>http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_3#comments</comments>
		<pubDate>Sat, 18 Jul 2009 09:52:26 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[SNMP]]></category>
		<category><![CDATA[install cacti]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=874</guid>
		<description><![CDATA[ขั้นตอนนี้จะเป็นการคอนฟิก Cacti ผ่านหน้าเว็บ ซึ่งเป็นค่าคอนฟิกต่างๆ ที่ใช้รัน   เลือกชนิดการติดตั้ง ถ้าเป็นการติดตั้งใหม่ เลือกเป็น &#8220;New Install&#8221;   หน้าเว็บจะแสดงโปรแกรมต่างๆ ที่ Cacti เรียกใช้ หากมีครบทุกอย่างก็สามารถกดปุ่ม [Finish] ได้      การล็อกอินครั้งแรก ใส่ User Name เป็น &#8220;admin&#8221; โดยไม่ต้องใส่ Password    เพื่อความปลอดภัย ในการล็อกอินครั้งแรก โปรแกรม Cacti จะบังคับให้เปลียน Password   หลังจากล็อกอินเรียบร้อยแล้ว ก็จะขึ้นหน้าเว็บของ Cacti   เปิดการ polling การติดตั้ง cacti โดยใช้ไฟล์ rpm จะติดตั้ง cron สำหรับการ poll data ทุกๆ 5 นาที ไว้ในไฟล์ /etc/cron.d/cacti เพียงแต่โดยดีฟอลต์จะปิดไว้ [...]]]></description>
			<content:encoded><![CDATA[<p>ขั้นตอนนี้จะเป็นการคอนฟิก Cacti ผ่านหน้าเว็บ ซึ่งเป็นค่าคอนฟิกต่างๆ ที่ใช้รัน</p>
<p><span id="more-874"></span></p>
<p><img title="Cacti Web Install - Step 1" src="http://spalinux.com/wp-content/uploads/2009/07/01_cacti_install_step-1.png" alt="Cacti Web Install - Step 1" width="816" height="571" /></p>
<p> </p>
<p>เลือกชนิดการติดตั้ง ถ้าเป็นการติดตั้งใหม่ เลือกเป็น &#8220;New Install&#8221;</p>
<p><img title="Cacti Web Install - Step 2" src="http://spalinux.com/wp-content/uploads/2009/07/02_cacti_install_step-2.png" alt="Cacti Web Install - Step 2" width="816" height="571" /></p>
<p> </p>
<p>หน้าเว็บจะแสดงโปรแกรมต่างๆ ที่ Cacti เรียกใช้ หากมีครบทุกอย่างก็สามารถกดปุ่ม [Finish] ได้ </p>
<p><img class="alignnone size-full wp-image-878" title="Cacti Web Install - Step 3" src="http://spalinux.com/wp-content/uploads/2009/07/03_cacti_install_step-3.png" alt="Cacti Web Install - Step 3" width="816" height="571" /></p>
<p> </p>
<p>  การล็อกอินครั้งแรก ใส่ User Name เป็น &#8220;admin&#8221; โดยไม่ต้องใส่ Password </p>
<p><img title="Cacti - User Login" src="http://spalinux.com/wp-content/uploads/2009/07/04_cacti_user_login.png" alt="Cacti - User Login" width="816" height="571" /></p>
<p> </p>
<p>เพื่อความปลอดภัย ในการล็อกอินครั้งแรก โปรแกรม Cacti จะบังคับให้เปลียน Password</p>
<p><img title="Cacti Forced Password Change" src="http://spalinux.com/wp-content/uploads/2009/07/05_cacti_forced_password_change.png" alt="Cacti Forced Password Change" width="816" height="571" /></p>
<p> </p>
<p>หลังจากล็อกอินเรียบร้อยแล้ว ก็จะขึ้นหน้าเว็บของ Cacti</p>
<p><img title="Cacti Web Console" src="http://spalinux.com/wp-content/uploads/2009/07/06_cacti_web_console.png" alt="Cacti Web Console" width="816" height="571" /></p>
<p> </p>
<h4>เปิดการ polling</h4>
<p>การติดตั้ง cacti โดยใช้ไฟล์ rpm จะติดตั้ง cron สำหรับการ poll data ทุกๆ 5 นาที ไว้ในไฟล์ /etc/cron.d/cacti เพียงแต่โดยดีฟอลต์จะปิดไว้ โดยใส่เครื่องหมาย &#8216;#&#8217; ไว้หน้าบรรทัด</p>
<pre>[root@fc11-64min ~]# <strong>cat /etc/cron.d/cacti
</strong><span style="color: #0000ff;">#</span>*/5 * * * *    cacti   /usr/bin/php /usr/share/cacti/poller.php &gt; /dev/null 2&gt;&amp;1</pre>
<p>ต้องแก้ไขไฟล์นี้โดยเอาเครื่องหมาย &#8216;#&#8217; ออก</p>
<pre>[root@fc11-64min ~]# <strong>cat /etc/cron.d/cacti
</strong>*/5 * * * *    cacti   /usr/bin/php /usr/share/cacti/poller.php &gt; /dev/null 2&gt;&amp;1 </pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_1">ติดตั้ง Cacti บน Fedora 11 ตอนที่ 1</a></li>
<li><a href="http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_2">ติดตั้ง Cacti บน Fedora 11 ตอนที่ 2</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ติดตั้ง Cacti บน Fedora 11 ตอนที่ 2</title>
		<link>http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_2</link>
		<comments>http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_2#comments</comments>
		<pubDate>Sat, 18 Jul 2009 09:30:56 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[install cacti]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=863</guid>
		<description><![CDATA[หลังจากติดตั้งไฟล์โปรแกรม cacti เรียบร้อยแล้ว ต้องแก้ไขคอนฟิกไฟล์รวมทั้งสร้าง database เพื่อใช้ในการเก็บข้อมูลของ cacti เองด้วย คอนฟิกเว็บเซิร์ฟเวอร์ในส่วนของ cacti ส่วนแรกคือคอนฟิกของเว็บเซิร์ฟเวอร์ โดยดีฟอลต์จากการติดตั้ง cacti โดยใช้ไฟล์ rpm ของ Fedora 11 จะมีคอนฟิกเว็บในส่วนของ cacti สร้างเป็นไฟล์ชื่อ /etc/httpd/conf.d/cacti.conf [root@fc11-64min ~]# cat /etc/httpd/conf.d/cacti.conf # # Cacti: An rrd based graphing tool # Alias /cacti    /usr/share/cacti &#60;Directory /usr/share/cacti/&#62;         Order Deny,Allow         Deny from all         Allow from 127.0.0.1 &#60;/Directory&#62; ความหมายของคอนฟิกไฟล์ด้านบนคือ ผู้ใช้สามารถเรียกใช้เว็บโปรแกรม cati [...]]]></description>
			<content:encoded><![CDATA[<p>หลังจากติดตั้งไฟล์โปรแกรม cacti เรียบร้อยแล้ว ต้องแก้ไขคอนฟิกไฟล์รวมทั้งสร้าง database เพื่อใช้ในการเก็บข้อมูลของ cacti เองด้วย</p>
<p><span id="more-863"></span></p>
<h4>คอนฟิกเว็บเซิร์ฟเวอร์ในส่วนของ cacti</h4>
<p>ส่วนแรกคือคอนฟิกของเว็บเซิร์ฟเวอร์ โดยดีฟอลต์จากการติดตั้ง cacti โดยใช้ไฟล์ rpm ของ Fedora 11 จะมีคอนฟิกเว็บในส่วนของ cacti สร้างเป็นไฟล์ชื่อ /etc/httpd/conf.d/cacti.conf</p>
<pre>[root@fc11-64min ~]# <strong>cat /etc/httpd/conf.d/cacti.conf
</strong>#
# Cacti: An rrd based graphing tool
#
Alias /cacti    /usr/share/cacti</pre>
<pre>&lt;Directory /usr/share/cacti/&gt;
        Order Deny,Allow
        Deny from all
        Allow from 127.0.0.1
&lt;/Directory&gt;</pre>
<p>ความหมายของคอนฟิกไฟล์ด้านบนคือ ผู้ใช้สามารถเรียกใช้เว็บโปรแกรม cati โดยใส่ path เป็น /cacti เช่น http://&lt;ip-address&gt;/cacti/ แต่ดีฟอลต์จะอนุญาตให้เรียกมาจากเครื่อง ip 127.0.0.1 หรือตัวมันเองเท่านั้น</p>
<p>ถ้าต้องการแก้ไขให้เรียกเว็บ cacti จากเครื่องอื่นได้ ต้องแก้ไขคอนฟิกไฟล์นี้เป็น</p>
<pre>[root@fc11-64min ~]# <strong>cat /etc/httpd/conf.d/cacti.conf
</strong>#
# Cacti: An rrd based graphing tool
#
Alias /cacti    /usr/share/cacti</pre>
<pre>&lt;Directory /usr/share/cacti/&gt;
<span style="color: #0000ff;">        Order Allow,Deny
        Allow from all
</span>&lt;/Directory&gt;</pre>
<p>หลังแก้ไขไฟล์คอนฟิกของเว็บเซิร์ฟเวอร์ ต้องใช้คำสั่ง service เพื่อรีสตาร์ตให้คอนฟิกใหม่มีผล</p>
<pre>[root@fc11-64min Packages]# <strong>service httpd restart
</strong>Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]</pre>
<p>ทดลองเรียกเว็บ cacti ผ่าน web browser</p>
<p><img title="01 - Cannot connect database" src="http://spalinux.com/wp-content/uploads/2009/07/01-cacti-error-cannot-conne.png" alt="01 - Cannot connect database" width="816" height="255" /></p>
<h4>สร้างฐานข้อมูลของ cacti</h4>
<p>จากตัวอย่างด้านบน มี error เกิดขึ้น ยังไม่สามารถใช้งานได้</p>
<pre><span style="color: #ff0000;">FATAL: Cannot connect to MySQL server on 'localhost'. Please make sure you have specified a valid MySQL database name in 'include/config.php'</span></pre>
<p>คือต้องสร้าง user, database และ table สำหรับเก็บข้อมูลของ cacti ใน MySQL ก่อน</p>
<p>คอนฟิกของ cacti ในส่วน database จะถูกเก็บอยู่ในไฟล์ /etc/cacti/db.php</p>
<pre>[root@fc11-64min ~]# <strong>cat /etc/cacti/db.php
</strong>&lt;?php
...
/* make sure these values refect your actual database/host/user/password */
$database_type = "mysql";
$database_default = "cacti";
$database_hostname = "localhost";
$database_username = "cactiuser";
$database_password = "cactiuser";
$database_port = "3306";</pre>
<pre>/* Default session name - Session name must contain alpha characters */
#$cacti_session_name = "Cacti";</pre>
<pre>?&gt;</pre>
<p><strong>หมายเหตุ </strong>ในที่นี้จะสร้าง database และ user ตามค่าดีฟอลต์เลย ซึ่งเหมาะสำหรับการทดสอบเพื่อเรียนรู้โปรแกรม cacti แต่ถ้านำไปใช้จริง production แนะนำให้เปลี่ยนค่าตัวแปรเหล่านี้เพื่อความปลอดภัย</p>
<p>ขั้นแรกต้องสร้าง database ให้ cacti ก่อน โดยสร้างชื่อตามตัวแปร $database_default</p>
<p>ในที่นี้จะใช้คำสั่ง mysql สร้างเลย คุณสามารถใช้โปรแกรมอื่นๆ ได้เช่น phpmyadmin</p>
<pre>[root@fc11-64min ~]# <strong>mysql -u root -p
</strong>Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 140
Server version: 5.1.32 Source distribution</pre>
<pre>Type 'help;' or '\h' for help. Type '\c' to clear the buffer.</pre>
<pre>mysql&gt; <strong>CREATE DATABASE <span style="color: #0000ff;">cacti</span>;
</strong>Query OK, 1 row affected (0.00 sec)</pre>
<pre>mysql&gt;</pre>
<p>ขั้นต่อไปต้องสร้าง user และ password สำหรับการเชื่อมเข้า database ตามค่าตัวแปร $database_username, $database_password</p>
<pre>mysql&gt; <strong>GRANT ALL ON cacti.* TO <span style="color: #0000ff;">cactiuser </span>IDENTIFIED BY '<span style="color: #0000ff;">cactiuser</span>';
</strong>Query OK, 0 rows affected (0.09 sec)</pre>
<pre>mysql&gt; <strong>quit
</strong>Bye</pre>
<h4>สร้าง table ใน cacti database</h4>
<p>สุดท้ายต้องสร้าง table ต่างๆ เพื่อเก็บค่าของ cacti โดยสามารถใช้ไฟล์โครงสร้าง table ที่ติดตั้งมาให้อยู่แล้วใน /usr/share/doc/cacti-0.8.7d/cacti.sql</p>
<pre>[root@fc11-64min ~]# <strong>cat /usr/share/doc/cacti-0.8.7d/cacti.sql | mysql -u cactiuser -p cacti
</strong>Enter password:
[root@fc11-64min ~]#</pre>
<p>ทดลองใช้ user ที่สร้างขึ้นเข้า database</p>
<pre>[root@fc11-64min ~]# <strong>mysql -u cactiuser -p
</strong>Enter password:</pre>
<pre>Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 142
Server version: 5.1.32 Source distribution</pre>
<pre>Type 'help;' or '\h' for help. Type '\c' to clear the buffer.</pre>
<pre>mysql&gt; <strong>SHOW DATABASES;
</strong>+--------------------+
| Database           |
+--------------------+
| information_schema |
| <strong><span style="color: #0000ff;">cacti</span></strong>              |
+--------------------+
2 rows in set (0.08 sec)</pre>
<pre>mysql&gt; <strong>CONNECT cacti;
</strong>Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A</pre>
<pre>Connection id:    149
Current database: cacti</pre>
<pre>mysql&gt; <strong>SHOW TABLES;
</strong>+---------------------------+
| Tables_in_cacti           |
+---------------------------+
| cdef                      |
| cdef_items                |
| colors                    |
| data_input                |
| data_input_data           |
| data_input_fields         |
| data_local                |
| data_template             |
| data_template_data        |
| data_template_data_rra    |
| data_template_rrd         |
| graph_local               |
| graph_template_input      |
| graph_template_input_defs |
| graph_templates           |
| graph_templates_gprint    |
| graph_templates_graph     |
| graph_templates_item      |
| graph_tree                |
| graph_tree_items          |
| host                      |
| host_graph                |
| host_snmp_cache           |
| host_snmp_query           |
| host_template             |
| host_template_graph       |
| host_template_snmp_query  |
| poller                    |
| poller_command            |
| poller_item               |
| poller_output             |
| poller_reindex            |
| poller_time               |
| rra                       |
| rra_cf                    |
| settings                  |
| settings_graphs           |
| settings_tree             |
| snmp_query                |
| snmp_query_graph          |
| snmp_query_graph_rrd      |
| snmp_query_graph_rrd_sv   |
| snmp_query_graph_sv       |
| user_auth                 |
| user_auth_perms           |
| user_auth_realm           |
| user_log                  |
| version                   |
+---------------------------+
48 rows in set (0.00 sec)</pre>
<pre>mysql&gt; <strong>quit</strong>
Bye
[root@fc11-64min ~]#</pre>
<p>เปิด web browser อีกครั้ง เรียกไปที่ http://&lt;ip-address&gt;/cacti/ หน้าจอจะ redirect ไปยังหน้าสำหรับการติดตั้งต่อไป</p>
<p><img title="Cacti Installation Guide" src="http://spalinux.com/wp-content/uploads/2009/07/02-cacti-installation-guide.png" alt="Cacti Installation Guide" width="816" height="571" /></p>
<p> </p>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_1">ติดตั้ง Cacti บน Fedora 11 ตอนที่ 1</a></li>
<li><a href="http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_3">ติดตั้ง Cacti บน Fedora 11 ตอนที่ 3</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

