\

Facebook


วันอังคารที่ 24 กุมภาพันธ์ พ.ศ. 2558

[PHP] วิธีจับ Notice มาเป็น Exception ใน TryCatch


ในภาษาพีเฮชพี Notice กับ Warning ไม่ถือเป็น runtime error ครับ ทำให้เวลาเราครอบด้วย try catch มันก็จะไม่เด้งไปที่ส่วนของ Exception  ex เเต่จะขึ้นข้อความขึ้นมาเเจ้งเตือนแทน ซึ่งส่วนใหญ่ก็คุ้นกับการตั้งค่า error_report() ให้ซ่อนข้อความเหล่านั้นไป

เเต่ถ้าอยากตั้งกฎขึ้นมาใหม่ว่า Notice  ก็ถือเป็น Exception ตัวหนึ่ง(เช่น Undefined index เป็นต้น) ก็ต้องจัดการด้วยฟังชั่น set_error_handler() เองครับ

ซึ่งบทความนี้ ผมจะแนะนำการจัดการ error ด้วยฟังชั่นเราเอง เช่นผมจะนับว่าการไม่เจออินเด็กใน array ถึงว่าผิดพลาด ก็ให้สร้างฟังชั่นนี้ขึ้นมาครับ

function errorHandlerCatchUndefinedIndex($errno, $errstr, $errfile, $errline ) {
    // In case Undefined index
    if (substr($errstr, 0, 16) == 'Undefined index:') {
     throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
   } 
    return false;
}

เเล้วเรียกฟังชั่นด้วยคำสั่งนี้ ก่อนเข้า try

   // Set Notice return Error
   set_error_handler("errorHandlerCatchUndefinedIndex");

หลับจบ catch หรือ finally ใส่คำสั่งนี้เพื่อกลับคืนสู่การตั้งค่า error ปกติของระบบ

   // Restore Error
   restore_error_handler();

หน้าตาโค๊ดจะออกมาประมาณนี้

 set_error_handler("errorHandlerCatchUndefinedIndex");
try{
//do something!!
}catch(Exception $e){
restore_error_handler();
}
restore_error_handler();


อ้างอิง http://stackoverflow.com/questions/3261051/how-to-catch-an-undefined-index-e-notice-error-in-simpletest

[XAMPP] เร่งความเร็ว Apache ด้วย mod_log_config


 เคยไหมครับเวลาใช้งาน XAMPP เป็นเซิฟเว่อร์จำลอง แล้วเเต่ละ request ที่ส่งไปใช้เวลานานเหลือเกิน ตั้ง timeout ไว้ 30 วินาที บางครั้งยังไม่พอ แล้วหลังจาก Return ข้อผิดพลาดกลับดันเป็นแค่ Notice ธรรมดา จนบางคนแก้ปัญหาด้วยการ ประกาศปิด Notice กับ Error ไว้ที่หัวไฟล์ซะเลย

แต่พอระบบใหญ่ขึ้นมา เจอโจทย์แบบว่า "Notice เป็นแบบไหนต้องแก้ให้ได้ทั้งหมด" ซึ่งส่วนใหญ่มันจะเกิดจากสาเหตุที่ object ไม่มีอยู่จริง, อินเด็กที่เรียกไม่มีอยู่ หรือ Loop ไม่มีสมาชิกอยู่เลย(count=0)  วนๆกันอยู่ประมาณนี้แหละครับ

เวลาฝั่ง Server เจอข้อผิดพลาด จะทำการเก็บล็อกเอาไว้ ซึ่งวิธีที่จะเร่งความเร็วเพิ่มขึ้นวันนี้ก็คือการ เพิ่มความเร็วในการบันทึก Log นั่นเอง โดยใช้โมดูลที่มีชื่อว่า mod_log_config โดยหากใช้ XAMPP เวอชั่น WINDOWS ก็ทำตามนี้ครับ เปิด "httpd.conf" ขึ้นมาแล้วเพิ่มบรรทัดข้างล่างเข้าไป

<IfModule mod_log_config.c>
  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"**%T/%D**" combined
  CustomLog logs/access.log combined
  <IfModule mod_deflate.c>
    DeflateFilterNote Input instream
    DeflateFilterNote Output outstream
    DeflateFilterNote Ratio ratio
    LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
    CustomLog logs/deflate.log deflate
  </IfModule>
</IfModule>


มันคือการเพิ่ม format ของ Log นั่นเอง ซึ่ง %T คือเวลาที่ใช้ในหน่วย millisec เเทนที่จะเป็นแค่ sec ซึ่งจะออกมาหน้าตาประมาณนี้

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"**%T/%D**" combined

that is logging the time spent to serve the request but in microseconds (10-6) instead of seconds.(อ้างอิง)
 ที่มา: http://www.ducea.com/2008/02/06/apache-logs-how-long-does-it-take-to-serve-a-request/
ปล. ใช้ได้กับ apache version 2.0.x ขึ้นไป

ผมยังไม่ได้เทส จริงจังนะครับ ว่าไวขึ้นจริงๆไหม (ดันมาเจอบทความตอนโปรเจกค์ใกล้จบ) ใครเทสเเล้ว work หรือไวขึ้นจริงๆ post comment ไว้ด้วยนะครับ

วันจันทร์ที่ 23 กุมภาพันธ์ พ.ศ. 2558

PHP Simple HTML DOM Parser API

รวบรวม API ของ Simple HTML DOM เอาไว้ครับ สำหรับ link เต็มๆของหน้าหลักอยู่ที่นี้ คลาสตัวนี้เมื่อโหลดลงมาใช้มีประโยชน์ที่แปลงมาร์คอัพประเภท html ให้เป็น object DOM ทำง่ายต่อการค้นหา node ที่ต้องการไปใช้ต่อ บลาๆๆ ขี้เกียจอธิบาย จริงๆก็รู้กันอยู่เเล้ว แต่อยากรวบรวม ฟังชั่นที่ใช้บ่อยๆ+จำเป็น เอาไว้กันลืมครับ


อันนี้ Method >> ที่ผมใช้บ่อยๆ childNodes() , parentNode() เป็นต้นครับ การลบ element ของ DOM ทำไม่ได้ ต้องเลี่ยงมาใช้ removeAttribute() แทน เช่นลบ link ใน <iframe> เป็นต้น


Method Mapping
array
$e->getAllAttributes ()
array
$e->attr
string
$e->getAttribute ( $name )
string
$e->attribute
void
$e->setAttribute ( $name, $value )
void
$value = $e->attribute
bool
$e->hasAttribute ( $name )
bool
isset($e->attribute)
void
$e->removeAttribute ( $name )
void
$e->attribute = null
element
$e->getElementById ( $id )
mixed
$e->find ( "#$id", 0 )
mixed
$e->getElementsById ( $id [,$index] )
mixed
$e->find ( "#$id" [, int $index] )
element
$e->getElementByTagName ($name )
mixed
$e->find ( $name, 0 )
mixed
$e->getElementsByTagName ( $name [, $index] )
mixed
$e->find ( $name [, int $index] )
element
$e->parentNode ()
element
$e->parent ()
mixed
$e->childNodes ( [$index] )
mixed
$e->children ( [int $index] )
element
$e->firstChild ()
element
$e->first_child ()
element
$e->lastChild ()
element
$e->last_child ()
element
$e->nextSibling ()
element
$e->next_sibling ()
element
$e->previousSibling ()
element
$e->prev_sibling ()

ส่วนอันนี้ เป็น element ท่องไว้เลย ยังไงก็ได้ใช้



May be like this posts