มีวิธีเก็บ log เมื่อเกิด fatal error ไหมครับ payment gateway

สำหรับผู้ที่ เริ่มต้น Programming - PHP มีอะไร แนะนำ หรือข้อสงสัยต้องบอร์ด นี้ คนที่มีความรู้ แบ่งปันคนอื่นบ้างนะ ปัญหาการเขียนโปรแกรม แบบ OOP Session Cookies php network

Moderators: mindphp, ผู้ดูแลกระดาน

User avatar
secivon
PHP Full Member
PHP Full Member
Posts: 35
Joined: 24/03/2009 5:15 pm

มีวิธีเก็บ log เมื่อเกิด fatal error ไหมครับ payment gateway

Post by secivon »

ตอนนี้ผมมีระบบสมาชิกอยู่ครับ โดยระบบจะตัดเงินที่ได้ authorized ผ่าน payment gateway ไว้ก่อนหน้านี้แล้ว โดย run ผ่าน crontab ในช่วงเวลาประมาณ ตีสองของแต่ละวัน

โดน process จะเป็นการไป query เอา record ที่ถึง due มา authorize ผ่าน Payment Gateway Provider ผ่านทาง API ( CURL ) แล้วก็จะทำการออก invoice / receipt ตามเรื่องตามราว และจะส่ง copy ไปที่ email ผม และสุดท้าย เมื่อจบ loop ก็จะส่ง summary mail มาหาผม ซึ่งเป็น web slave T_T


ปัญหาคือ พักหลังๆ ผมจะได้ summary mail บ้าง ไม่ได้บ้าง ซึ่งเมื่อเรียก script อีกครั้งผ่านทาง browser ก็มักจะทำงานได้ตามปกติ ( ได้ summary mail ) มีบางครั้งที่เรียกผ่าน browser แล้วก็ยังไม่ได้เมลล์ summary ( แต่ได้ receipt copy )


พยายามทบทวนว่า script ที่เขียนได้มีการ die() ออกไปตอนไหนบ้างหรือเปล่า ก็เลยใช้วิธีเขียน function มาครอบ die() เป็น SystemDie() โดยที่ SystemDie() นี่จะ write content ลง log file ก่อนจะ die() ตามปกติไป
พอวันที่ไม่มี summary mail ส่งมาก็จะไปหาดู ก็ปรากฎว่า ไม่มี log file ที่ว่า -*-

ตอนนี้ก็เลยตั้งข้อสงสัยไปที่ fatal error อื่นๆที่อาจ generate ขึ้นมาระหว่าง วน loop ซึ่งคาดว่า อาจเป็นไปได้หลาย case มากๆ
( ที่เจอไปตัวหนึ่งก็คือ memory เต็ม เพราะดันเก็บ log ไว้ในตัวแปรทั้งหมด ก่อนจะ flush ทีเดียว พอเจอ loop หลักหมื่นปลายๆ ก็เลยเดี้ยง )
รวมถึง 3rd party payment gateway ที่ล่มบ่อยๆ -*-


ก็เลยอยากถามว่า มีวิธีเก็บ log ว่าเกิด error เพราะอะไร ก่อนที่จะโดน fatal error ไหมครับ

ขอบคุณครับ
"อย่าเอาแต่โทษเด็ก ถ้าเด็กมันจะห่วย ดูตัวเองบ้างว่าทำบ้านเมืองไว้เป็นยังไง"
User avatar
mindphp
ผู้ดูแลระบบ MindPHP
ผู้ดูแลระบบ MindPHP
Posts: 25514
Joined: 22/09/2008 6:18 pm
Contact:

Re: มีวิธีเก็บ log เมื่อเกิด fatal error ไหมครับ

Post by mindphp »

ตอนนี้ ใช้ payment gateway ของที่ไหนอยู่ครับ คุยเรื่องนี้กันได้นะครับ ผมก็ทำทำโปรเจคที่ต้องใช้ พวกนี้เสร็จไปสดๆ ร้อนๆ เลยครับ
ลองดู 2 แบบนะครับ
1. ถ้าข้อมูลที่จะเก็บ log เยอะ มากๆ ใช้วิธี ค่อยๆ เขียนไฟล์ต่อๆ ลงไปเรื่อยๆ อย่าเก็บในตัวแปลตัวเดียว
หรือเก็บลงฐานข้อมูลไปเลยก็ได้ครับ และ ตอนที่เขียน log ลงไฟล์ใช้ @ วางกันไว้ก่อนนะครับ เพื่อป้องการ มันหลุดทำงานเพราะการเขียน log ผิดพลาดด้วย

2. ลองใช้ try catch เข้ามาช่วยครับ ถ้าเคยเขียน java มา การใช้งานแบบเดียวกันเลยครับ
ถ้าไม่เคยใช้ลองดู ตัวอย่างของ php
ตัวอย่างเพื่อความเข้าใจ

Code: Select all

try {
    $error = 'ความผิดพลาด';
    throw new Exception($error);
    echo 'Never get here';
} catch (Exception $e) {
    echo 'Exception caught: ',  $e->getMessage(), "\n";
}
 
ตัวอย่างเพื่อประยุกต์ใช้งานจริง

Code: Select all

<?php
//create function with an exception
function checkNum($number)
  {
  if($number>1)
    {
    throw new Exception("Value must be 1 or below");
    }
  return true;
  }

//trigger exception in a "try" block
try
  {
  checkNum(2);
  //If the exception is thrown, this text will not be shown
  echo 'If you see this, the number is 1 or below';
  }

//catch exception
catch(Exception $e)
  {
  echo 'Message: ' .$e->getMessage();
  }
?> 
ตัวอย่างบางส่วนจาก http://www.w3schools.com
ติดตาม VDO: http://www.youtube.com/c/MindphpVideoman
ติดตาม FB: https://www.facebook.com/pages/MindphpC ... 9517401606
หมวดแชร์ความรู้: https://www.mindphp.com/forums/viewforum.php?f=29
รับอบรม และพัฒนาระบบ: https://www.mindphp.com/forums/viewtopic.php?f=6&t=2042
User avatar
secivon
PHP Full Member
PHP Full Member
Posts: 35
Joined: 24/03/2009 5:15 pm

Re: มีวิธีเก็บ log เมื่อเกิด fatal error ไหมครับ payment gateway

Post by secivon »

ขอบคุณ คุณ mindphp ครับ , payment gateway provider เป็นของบริษัทเล็กๆในยุโรปครับ (ระบบก็เป็นของ บ. ในยุโรป เหมือนกัน)


1. วิธี log ที่แนะนำมา เป็นวิธีที่ผมใช้แก้ปัญหาไปก่อนหน้านั้นครับ ใช้ append file ด้วย content ของแต่ละ loop เอา
แต่เท่าที่ตรวจดูใน log เหมือนว่า จบ loop ที่เกิดเหตุ ก็หายไปเฉยๆ เลยครับ
ในครั้งแรกคิดว่าอาจเป็นที่ max execution timeout แต่ลองแก้ให้ running time ไว้ที่ 3 ชม. ก็ยังไม่หาย
( ในกรณีที่ ไม่มีปัญหาเลย summary mail จะส่งมาภายในเวลา ไม่เกิน ชม. ครึ่งครับ )
ไม่ค่อยอยาก set_time_limit(0); เดี๋ยวมันเป็น daemon ขึ้นมาจะลำบากต้องติดต่อ admin อีก



2. จริงๆก็มีการใช้ try catch อยู่ในระบบเหมือนกันนะครับ เพียงแต่ไม่ได้ครอบไว้ในนี้ ( ครอบไว้ในส่วนที่ใช้ต่ออายุเมื่อการตัดเงินสำเร็จครับ )
เท่าที่จำได้แบบเลือนลางๆมากๆ java เหมือนจะมี class throwable ให้ใช้ แต่ PHP เหมือนจะไม่มีนะครับ
แล้วเข้าใจว่า throw ได้ระดับ Exception ไม่ใช่ Error ด้วย แต่เดี๋ยวพรุ่งนี้จะลอง add try catch ดูครับ


ใจจริงผมยังไม่ค่อยมั่นใจเลยครับว่า ปัญหาอยู่ที่ไหน
- Payment Server Support มักจะมีคำอธิบายแปลกๆ ที่ไม่ได้ตอบคำถามที่ผมถามไปอยู่บ่อยๆ - -''
- API ที่เขาให้มา จะ work 100% จริงๆ หรือเปล่าก็ไม่รู้ code ดูก๋องแก๋ง และ document ไม่ professional เอามากๆ เลย
"อย่าเอาแต่โทษเด็ก ถ้าเด็กมันจะห่วย ดูตัวเองบ้างว่าทำบ้านเมืองไว้เป็นยังไง"
User avatar
mindphp
ผู้ดูแลระบบ MindPHP
ผู้ดูแลระบบ MindPHP
Posts: 25514
Joined: 22/09/2008 6:18 pm
Contact:

Re: มีวิธีเก็บ log เมื่อเกิด fatal error ไหมครับ payment gateway

Post by mindphp »

ส่วนใหญ่ payment gateway ที่ผมทำมาจะมี demo ให้ลองใช้ นะครับ ไม่ทราบที่นั่นมีหรือเปล่า
และ ถ้าติดต่อฐานข้อมูล แนะนำใ้ห้ แบ่ง loop จักการ result ที่ได้จาก ฐานข้อมูลด้วย นะครับ
ทำคล้ายๆ การแบ่งหน้า แต่ เปลี่ยนเป็นการทำ loop เพื่อให้ได้ result ออกมาในแต่ละ loop น้อยๆ จะไม่ได้ติดปัญหาเรื่อง result ของเครื่อง หรือ ค่าที่เค้าตั้งไว้

ถ้ากลัวว่า ไฟล์ทำงานไม่จบ ลองเช็ค ที่
apache error log ของ server ครับ
ติดตาม VDO: http://www.youtube.com/c/MindphpVideoman
ติดตาม FB: https://www.facebook.com/pages/MindphpC ... 9517401606
หมวดแชร์ความรู้: https://www.mindphp.com/forums/viewforum.php?f=29
รับอบรม และพัฒนาระบบ: https://www.mindphp.com/forums/viewtopic.php?f=6&t=2042
User avatar
secivon
PHP Full Member
PHP Full Member
Posts: 35
Joined: 24/03/2009 5:15 pm

Re: มีวิธีเก็บ log เมื่อเกิด fatal error ไหมครับ payment gateway

Post by secivon »

แจ้งความคืบหน้าครับ


ลอง check log file ของ server แล้ว ( เท่าที่ผมเองมี accessibility กะจึ๋งนึง -*- )
เหมือนกับว่า Apache ไม่ได้ configure ให้ write ลง logfile กรณีที่เกิด fatal error น่ะครับ
แต่จะเจอเฉพาะรายการ ที่มี request ไปยัง file ที่ไม่มีอยู่จริงซะส่วนใหญ่


ส่วนการลอง try catch ดูแล้ว ยังไม่ work เท่าไหร่ - -''

สุดท้าย เลยไปไล่ log ทีละรายการที่มีปัญหาดู ( record หลักหมื่น -*-) เหมือนปัญหาจะมาจากขั้นตอนการ recurring payment จริงๆครับ

ในรายการที่ไม่มีปัญหา ( ถึงแม้จะ authorized ไม่ผ่าน ) ที่ปกติจะกินเวลาไม่เกิน 2 วินาที
แต่ถ้ามันมีปัญหาขึ้นมา กว่าจะไป loop รอบถัดไป หายไปเป็นนาทีเลย ดังนั้นคิดว่าอาจจะมาจาก max execution timeout อยู่ดี
และส่วนนี้ น่าจะเป็นปัจจัยภายนอกที่เหนือการควบคุมจริงๆ


ในเบื้องต้น ตอนนี้เพิ่ม time limt เป็น 6 ชม.ไว้ก่อนแล้วครับ
แต่กำลังดู option ในส่วนที่คุณ mindphp และนำไว้ด้วย คือให้มันแบ่งการทำงานเป็นชุดๆ ตรงนี้ต้องขอคำแนะนำเพิ่มเติมหน่อยอ่ะครับ

ที่ผมเคยทำคือ script ส่ง newsletter ที่ create job ไว้ก่อน
แล้วมี script ตัวหนึ่ง (เรียกผ่านเว็บ) ให้มันทำหน้าที่เป็นตัว loop ส่ง mail
พอถึงจำนวน maximum ในแต่ละครั้ง ก็ให้ redirect มาที่ตัวเองอีกครั้ง
แต่เพิ่ม parameter เพื่อไปเป็นตัวกำหนด offset ใหม่


แต่ผมเข้าใจว่า script ที่ run ผ่าน contrab จะมี environment ไม่เหมือนกันกับทื่ request ผ่าน browser
ทำให้ header('location:mailer.php?offset=2') ทำงานไม่ได้ ตรงนี้เลยอยากขอคำแนะนำอ่ะครับ
ว่าจะมีวิธีการ loop ( กรณีนี้คือ เรียกตัว script เอง อีกรอบ โดยผ่าน parameter เข้าไปใหม่)
สำหรับการ run ผ่าน crontab environment ยังไงครับ


ขอบคุณครับ
"อย่าเอาแต่โทษเด็ก ถ้าเด็กมันจะห่วย ดูตัวเองบ้างว่าทำบ้านเมืองไว้เป็นยังไง"
User avatar
ob1
PHP Hero Member
PHP Hero Member
Posts: 185
Joined: 01/01/1970 7:00 am
Contact:

Re: มีวิธีเก็บ log เมื่อเกิด fatal error ไหมครับ payment gateway

Post by ob1 »

ลอง เรียก php แบบ command line ดูครับเผื่อลดปัญหา เรื่อง webserver ได้
User avatar
mindphp
ผู้ดูแลระบบ MindPHP
ผู้ดูแลระบบ MindPHP
Posts: 25514
Joined: 22/09/2008 6:18 pm
Contact:

Re: มีวิธีเก็บ log เมื่อเกิด fatal error ไหมครับ payment gateway

Post by mindphp »

ถ้าไฟล์รันนาน ให้เป็น command line ก็ ดีครับ ลดปัญหาเกี่ยวกับ webserver ได้
ส่วนใหญ่ถ้าใช้ cron job ก็ใช้วิธีนี้

แต่ไม่ว่ารันด้วย วิธีไหน
อย่าลืมดูเรื่อง time out ของ php,mysql, ถ้ารันผ่าน apache ก็ apache_reset_timeout เข้ามาอาจพอช่วยได้ ลองดูว่าที่ server เปิดให้ใช้หรือเปล่า

ส่วนที่บอกว่าให้ทำเป็นช่วง คือ นับจำนวนแถวข้อมูลทั้งหมด ที่จะ ดึงมาใช้ แล้วแบ่ง ช่วง query เอาครับ
สำหรับวิธี นี้แนะนำ ให้ แต่ละช่วง ลอง
close connection ไปก่อน แล้วค่อย connect เข้าไปใหม่ในแต่ละ loop เพื่อป้องกัน mysql connect time out ด้วย
ติดตาม VDO: http://www.youtube.com/c/MindphpVideoman
ติดตาม FB: https://www.facebook.com/pages/MindphpC ... 9517401606
หมวดแชร์ความรู้: https://www.mindphp.com/forums/viewforum.php?f=29
รับอบรม และพัฒนาระบบ: https://www.mindphp.com/forums/viewtopic.php?f=6&t=2042
Post Reply
  • Similar Topics
    Replies
    Views
    Last post

Return to “Programming - PHP”

Who is online

Users browsing this forum: No registered users and 12 guests