wordpress

 

สืบเนื่องจากผมมี idea คิดจะทำ WordPress Plugin เกี่ยวกับ Social Network?ตัวนึงขึ้นมาใช้งานเอง กับเว็บ welovepro?ของผม และถ้ามัน Work ก็จะลองทำส่ง CodeCanyon?ดูด้วย! ?ซึ่ง Plugin ตัวนี้จำเป็นจะต้องใช้คำสั่งเกี่ยวกับ wp_cron ก็เลยลองไปนั่ง Search ข้อมูลดู ก็ไปพบกับ Post นี้?http://wp.tutsplus.com/articles/insights-into-wp-cron-an-introduction-to-scheduling-tasks-in-wordpress/?อ่านๆไป?ก็ไปสะดุดกับหัวข้อหนึ่ง “Some Issues with WP-Cron

[box style=’note’] อ่ะอ่าว!!!?ปัญหาของ WP-Cron เล็กๆ ที่อาจจะไม่เล็กก็ได้นะเนี่ย!![/box]

ขอเกริ่นก่อนนะครับ ว่า…

“WP-Cron คืออะไร?”

WP-Cron คือตัวที่เราใช้สำหรับตั้งเวลา, ตั้ง Schedule เพื่อสั่งให้ WordPress ทำงานอะไรซักอย่างนึง ตามวันและเวลาที่เราระบุไว้ ยกตัวอย่างง่ายๆ ก็คือการที่เราตั้งเวลาให้ Post ของเราเผยแพร่เมื่อไหร่นั่นและครับ หรือไว้สำหรับคอยเช็คการ version Update ของ Theme, Plugin หรือตัว WordPress เป็นระยะๆนั่นเองครับ (อยากรู้วิธีใช้ก็ตามไปดูเอาที่นี่ ?WP-Cron Functions)

มันก็คล้ายๆกับ Cron Jobs ใน UNIX นั่นแหละครับ ที่เราใช้ตั้งเวลาใน Server ว่าจะให้มันทำอะไร? ยังไง? ตอนไหนบ้าง? เช่นให้ Run ระบบส่ง Newsletter ทุกๆจันทร์, ให้ Backup เว็บลง Disk ทุกๆคืนอะไรอย่างงั้น

 

แต่ทว่า WP-Cron กับ UNIX Cron Jobs?ไม่เหมือนกัน

เนื่องจาก UNIX Cron Jobs?เป็นการใช้งานจากระบบของ Server โดยตรง ซึ่งทำให้มันสามารถสั่งให้มัน Run โปรแกรม หรือไฟล์ .php ได้ตลอดเวลา และกลับเข้ามาเช็คว่ายังมีคำสั่งอื่นสั่งให้ทำอีกมั้ย? ได้ทุกๆวินาที โดยไม่ต้องมีใครไปคอยสะกิดมันว่า “เฮ้ยๆๆ ?เอ็งช่วยไปเช็น Cron หน่อยซิ! ว่า ณ วินาทีนี้น่ะ เจ้านายเค้าสั่งให้ทำอะไรไว้รึเปล่า??” แต่คนที่จะสร้าง Cron ได้ ก็ต้องเป็น root หรือ Admin ของ Server นั้นๆเท่านั้น !!

แต่ WP-Cron ไม่ได้เป็นอย่างงั้น!! WP-Cron เป็น Cron ที่ WordPress สร้างขึ้นมา ก็คือเป็น Cron Jobs?จำลอง ที่ไม่สามารถทำงานได้ด้วยตัวเองได้เหมือน Unix Cron Jobs?เพราะ Server ไม่ได้เป็นคนควบคุมงานส่วนนี้โดยตรง ทำให้ต้องมีใครซักคนไปคอยไปสะกิดบอกมันอยู่ตลอด!!

 

วิธีที่จะสะกิดให้ WP-Cron ทำงาน

ในเมื่อ WP-Cron ต้องถูกกระตุ้นตลอดเวลา จึงมีอยู่ 2 วิธีหลักๆด้วยกันในการกระตุ้นมัน ก็คือ..

  1. [highlight style=’yellow’] มีคนเข้าเว็บที่เป็น WordPress?เราไม่ว่าที่หน้าใดๆ [/highlight]โดยปกติแล้ว WordPress จะเรียก WP-Cronให้ทำงานเมื่อเข้าเงื่อนไขนี้..
    • เมื่อมีคนเข้าเว็บของเราที่หน้าใดๆ
    • WordPress Cron ก็จะเช็ค Cron แต่ละตัว ว่ามีตัวไหนที่ตั้งเวลาให้ทำงาน น้อยกว่าเวลา ณ ปัจจุบันที่มีการเช็ค
    • WordPress Cron ทุกตัว ที่ตั้งเวลาทำงานไว้น้อยกว่าเวลา ณ ปัจจุบัน และยังไม่ได้ทำงาน จะถูกเรียกให้ทำงานทั้งหมด
  2. [highlight style=’yellow’]?เรียก URL WP-Cron?กัน Manual แบบตรงๆเลย?[/highlight] โดยใช้วิธีเรียก URL http://yousite.com/wp-cron.php?doing_wp_cron=1?จะด้วยวิธีใดก็แล้วแต่ จะเปิดบน Browser หรือ Run ผ่าน PHP ก็ได้

 

wordpress schedule

ปัญหาของ WP-Cron

พูดมากมาถึงตรงนี้ ก็คงสงสัยกันนะครับว่า แล้วสรุปปัญหาของ?WP-Cron ใน WordPress เนี่ยะ มันคืออะไร??ถ้าคุณอ่านมาตั้งแต่ข้างบน คุณคงพอจะเห็นปัญหาบ้างแล้วใช่มั้ยครับ?? งั้นมาลองแตกเป็นข้อๆดู ก็จะพบปัญหาดังนี้ …

  1. [highlight style=’misty-rose’] Zero Views = Zero Cron Run?[/highlight]?ก็เพราะว่า เนื่องจาก WP-Cron จะทำงานก็ต่อเมื่อถูกกระตุ้น ซึ่งโดยปกติจะถูกกระตุ้นเมื่อมีคนเข้าเว็บ นั่นหมายความว่า… “ถ้าไม่มีคนเปิดหน้าเว็บคุณเลย Cron ก็จะไม่ทำงานเลย
    [box style=’warning’] ยกตัวอย่าง.. ถ้าคุณตั้ง WP-Cron ให้มีการส่ง Email แจ้งเตือนสมาชิก เวลา 06:00 น. แต่วันนั้นไม่มีคนเข้าเว็บคุณเลย หรือมีคนเข้าแต่เข้ามาตอน 15:00 น. ทำให้ WR-Cron ไม่ถูกกระตุ้นในเวลาที่ใกล้เคียงกับที่ตั้งไว้ ?แต่มากระตุ้นเอาตอนบ่ายสาม ทำให้ Email ที่ส่งนั้นผิดเวลาไป กว่าสมาชิกจะได้รับ Email ก็เลยเวลากำหนดการของงานไปแล้ว หรือกลายเป็นข่าวเก่าไปทันที!!?[/box]
  2. [highlight style=’misty-rose’]?Heavy Processes?[/highlight]?สืบเนื่องจากปัญหาข้อ 1 คือถ้าเรามี Cron อยู่หลายตัว สั่งให้ทำงานนู่นนี่หลายอย่าง ในเวลาต่างๆกัน แต่ทว่า.. ไม่มีการเปิดหน้าเว็บในช่วงเวลานั้นๆเลย ?แต่พอมีคนมาเปิดหน้าเว็บหลังจากนั้น WP-Cron ทั้งหลายที่คั่งค้างไว้ ไม่ได้ทำงานก่อนหน้านี้ ก็จะพรั่งพรูกันออกมาทำงานพร้อมๆกัน ซึ่งนั่นอาจทำให้เว็บช้า, Server ทำงานหนัก?และดึงเว็บอื่นๆใน Host เน่ากันไปด้วย

 

จากปัญหาทั้ง 2 ข้อนี้ ถ้าคนไหนมีเว็บที่มีคนเข้าตลอดเวลาอยู่แล้ว คงไม่ใช่ปัญหาอะไร ?แต่กับเว็บที่เพิ่งเริ่มต้น หรือคนเข้าไม่เยอะนี่ซิ!!?

และจากปัญหานี้?มันก็เลยกระทบสิ่งที่ผมคิดไว้ คือถ้าผมจะทำ Plugin ที่ใช้งานตัว WP-Cron ขี้นมาตัวนึงขึ้นเพื่อใช้งานเอง คงไม่ใช่ปัญหาอะไร.. ?แต่หากเอามาขายบน CodeCanyon แล้วคนที่ซื้อไปเป็นเว็บที่ไม่ใหญ่โตมาก คนเข้าไม่ค่อยเยอะ จะเป็นยังไง? คนที่ยอมจ่ายซื้อไป ในใจเค้าก็ต้องการความแม่นยำ และการการันตรีในการตั้งเวลาด้วย และคงไม่อยากให้เว็บช้าหรือล่ม ด้วย Plugin ที่จ่ายเงินซื้อมา..

 

วิธีปัญหาของ WP-Cron

  • [highlight style=’pear-green’] สำหรับคนที่เป็นเจ้าของ Host เอง, เช่า Host แบบ VPS, เช่า Host ที่เปิดให้ Set Cron Jobs?ได้ หรือพอจะมีทางคุยกับ Host ที่เช่าอยู่ได้?[/highlight]?ให้ใช้วิธีเพิ่ม Unix Cron Jobs?เพื่อเรียก URL ของ WP-Cron แบบตรงๆกันเลย เพื่อกะตุ้นให้ WP-ทำงาน หรือเช็คตัวเองตลอดเวลาวิธีทำ
    1. ทำการ Disable ตัวเรียกใช้งาน WP-Cron ของ WordPress ออกไปซะ เพราะเดี๋ยวเราจะเป็นคนเรียกใช้งานเอง โดยให้เพิ่มคำสั่งด้านล่างนี้เข้าไปในไฟล์ wp-config.php
      define('DISABLE_WP_CRON', true);
    2. ทำการสร้าง Cron Jobs?เพื่อเรียก URL ของ WP-Cron โดยระบุค่าประมาณนี้
      */10 * * * * curl http://yoursite.com/wp-cron.php?doing_wp_cron=1 > /dev/null 2>&1 > /dev/null 2>&1
      จากตัวอย่าง เป็นการตั้งค่า Cron Jobs?ให้เรียก URL ของ WP-Cron ทุกๆ 10 นาที อยากได้ค่าเท่าไหร่ก็แก้เอาครับ .. แล้วก็แก้ path ของ WP-Cron ให้ถูกต้องตามเว็บของคุณด้วย ?หรือถ้าของบางคนมี ?cPanel ให้เข้าไปตั้ง Cron Jobs?ก็ตั้งในนั้นได้เลยครับ

แต่สำหรับคนที่เช่า Host อยู่ และไม่สามารถสร้าง Cron Jobs?เองได้

เท่าที่ดูแล้ว ยังไม่มีวิธีการแก้ใดที่จะ Work ที่สุด .. ดูเหมือนว่าจะมีคนทำ Plugin ออกมาเพื่อช่วยตรงจุดนี้ ชื่อว่า “WP-Cron Control” แต่เท่าที่ดูก็ยังไม่สามารถแก้ปัญหาได้หมด

ซึ่ง Plugin ที่ผมจะลองทำขายนั้น ก็มาเข้าข่ายนี้เหมือนกัน เพราะเราไป Control Hosting ของทุกคนไม่ได้ ..?ทางออกจะเป็นอย่างไร? ถ้าผมเจอคำตอบแล้วจะมาบอกกกันอีกทีนะครับ ?หรือว่าใครทราบวิธีแก้ไขปัญหา WP-Cron ตรงจุดนี้ ก็ช่วยแชร์บอกกันด้วยนะครับ ^^