ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น

ThaiSEOBoard.comพัฒนาเว็บไซต์Programmingสอบถามเกี่ยวกับ PHP MYSQL Query + Cronjob ครับ
หน้า: [1]   ลงล่าง
พิมพ์
ผู้เขียน หัวข้อ: สอบถามเกี่ยวกับ PHP MYSQL Query + Cronjob ครับ  (อ่าน 1760 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
Mrpoohling
ก๊วนเสียว
*

พลังน้ำใจ: 6
ออฟไลน์ ออฟไลน์

กระทู้: 250



ดูรายละเอียด เว็บไซต์
« เมื่อ: 06 มิถุนายน 2017, 06:18:22 »

สวัสดีครับเพื่อนๆพี่ๆทุกท่าน รบกวนสอบถามเป็นความรู้เกี่ยวกับ PHP MYSQL Query + Cronjob หน่อยครับผม

เริ่มแรกคือผมมีไฟล์ PHP MYSQL Query 1 ไฟล์ และทำ Cronjob ไว้ทุกๆ 2นาที มันจะ Query ตาม ID , User_Name และ Date_process และ limit ไว้ที่ 40 ตัวอย่างเช่น เมื่อ Query แล้วจะเพิ่มเวลา +5 ชั่วโมงใน Date_process โดยอ้างอิง Date_process ต้องน้อยกว่า Date now (เวลาปัจจุบัน) ครับ (ระบบจะ Query แต่ละ ID ทุกๆ 5ชม. )


------- สิ่งที่อยากรู้เพิ่มเติมครับ

ตามที่บอกไปแล้วผมมี PHP MYSQL Query 1 ไฟล์  กรณีเพิ่มไฟล์ขึ้นเป็น 2 หรือ 3 ไฟล์ เราจะทำได้อย่างไร เพราะตามที่ผมเข้าใจคือ ระบบที่ผมเขียนไว้เป็นการ Query ตาม ID ดังนั้นถ้ามี 2 -3 ไฟล์ การ Query จะทำซ้อนๆกัน

สิ่งที่ผมอยากได้คือ
ไฟล์ที่ 1 กำลัง Query ID 1-40
ไฟล์ที่ 2 เห็นว่ามีการ Query 1-40 อยู่ จึงข้ามไป ID 41-80
ไฟล์ที่ 3 เห็นว่ามีการ Query 1-80 อยู่ จึงข้ามไป ID 81-120

ประมาณนี้ครับ ไม่ทราบต้องทำอย่างไร ไครมีลิ้งแนะนำอยุ่บอกได้นะครับจะเข้าไปอ่านๆดู

ขอบคุณล่วงหน้าครับผม  wanwan017 wanwan017






« แก้ไขครั้งสุดท้าย: 06 มิถุนายน 2017, 06:18:40 โดย Mrpoohling » บันทึกการเข้า

infamous
ก๊วนเสียว
*

พลังน้ำใจ: 14
ออฟไลน์ ออฟไลน์

กระทู้: 295



ดูรายละเอียด
« ตอบ #1 เมื่อ: 06 มิถุนายน 2017, 08:47:31 »

ไม่ทราบว่าโปรเซสหลักคือ ต้องการแค่ query ตาม last_id(ID) ไปเรื่อยๆหรือเปล่าครับ

ถ้าใช่ ท่านก็แค่ทำการ log last_id(cursor) ที่โปรเซสในแต่ละรอบหลังจบโปรเซสแค่นั้นเอง
แล้วในรอบต่อไปก็แค่ดึง last_id จากรอบที่แล้วมาเช็คว่าถึงไหนแล้ว แล้วเอา last_id ตัวนี้มาเป็นเงื่อนไขในการค้นหา
รายการในรอบปัจจุบัน ถ้างานง่ายๆ ใช้ PHP file เดียว รัน cron task เดียวก็น่าจะพอนะครับ  wanwan016

งงมั้ย?

เช่น

- step 1. get_last_id from log txt file
- last_id = get_last_id ? get_last_id : 0
- step 2. select id,name,date from blah_tb where ID>{$last_id} and updated_at < NOW() limit {$limit}
- step 3. if no record found ? return to first? : any process you want to
- step 4. save last id when finished(from step2.) to log text file

ตัวอย่าง logfile.txt (json_encode())

{"start_id":"0","end_id":"120","processed_items":"98","last_id":"120","updated_at":"2017-06-06 11:05:33"}
^
ในรอบการ query หรือโปรเซสถัดไป ID ต้องเริ่มจาก ID ที่มากกว่า 120

อันนี้แค่ logic ง่ายๆ นะครับ สามารถนำไปประยุกต์ได้
บันทึกการเข้า
Mrpoohling
ก๊วนเสียว
*

พลังน้ำใจ: 6
ออฟไลน์ ออฟไลน์

กระทู้: 250



ดูรายละเอียด เว็บไซต์
« ตอบ #2 เมื่อ: 06 มิถุนายน 2017, 10:09:36 »

ไม่ทราบว่าโปรเซสหลักคือ ต้องการแค่ query ตาม last_id(ID) ไปเรื่อยๆหรือเปล่าครับ

ถ้าใช่ ท่านก็แค่ทำการ log last_id(cursor) ที่โปรเซสในแต่ละรอบหลังจบโปรเซสแค่นั้นเอง
แล้วในรอบต่อไปก็แค่ดึง last_id จากรอบที่แล้วมาเช็คว่าถึงไหนแล้ว แล้วเอา last_id ตัวนี้มาเป็นเงื่อนไขในการค้นหา
รายการในรอบปัจจุบัน ถ้างานง่ายๆ ใช้ PHP file เดียว รัน cron task เดียวก็น่าจะพอนะครับ  wanwan016

งงมั้ย?

เช่น

- step 1. get_last_id from log txt file
- last_id = get_last_id ? get_last_id : 0
- step 2. select id,name,date from blah_tb where ID>{$last_id} and updated_at < NOW() limit {$limit}
- step 3. if no record found ? return to first? : any process you want to
- step 4. save last id when finished(from step2.) to log text file

ตัวอย่าง logfile.txt (json_encode())

{"start_id":"0","end_id":"120","processed_items":"98","last_id":"120","updated_at":"2017-06-06 11:05:33"}
^
ในรอบการ query หรือโปรเซสถัดไป ID ต้องเริ่มจาก ID ที่มากกว่า 120

อันนี้แค่ logic ง่ายๆ นะครับ สามารถนำไปประยุกต์ได้

ขอบคุณมากครับ เด่วไปศึกษาดูก่อน  ยังงงอยู่ Tongue Tongue
บันทึกการเข้า

Mrpoohling
ก๊วนเสียว
*

พลังน้ำใจ: 6
ออฟไลน์ ออฟไลน์

กระทู้: 250



ดูรายละเอียด เว็บไซต์
« ตอบ #3 เมื่อ: 07 มิถุนายน 2017, 11:04:16 »

ผมได้ทำ log ใน mysql เพื่อตรวจสอบ id ที่กำลัง query เรียบร้อยครับ  
แต่รู้สึกว่า พอสร้าง cronjob อันที่สอง มันจะ ต้องรอให้ query รอบแรกจบก่อนมันจึงทำงานต่อ

cronjob ที่ใช้เป็นคำสั่งเรียกผ่าน wget url ครับ

อาการเหมือนเปิดเวป url แล้ว query ใน tab แรก และเปิด tab สอง ขึ้นมามันจะค้างๆ ต้องรอให้ tab แรก จบก่อน tab สอง จึงเริ่ม query ต่อ

ถ้าจะทำให้มันสามารถ query พร้อมกัน โดยไม่ต้องรอให้ query แรกจบก่อนต้องทำอย่างไรครับ Tongue Tongue


« แก้ไขครั้งสุดท้าย: 07 มิถุนายน 2017, 11:08:25 โดย Mrpoohling » บันทึกการเข้า

cancanx
Verified Seller
สมุนแก๊งเสียว
*

พลังน้ำใจ: 2
ออฟไลน์ ออฟไลน์

กระทู้: 638



ดูรายละเอียด
« ตอบ #4 เมื่อ: 07 มิถุนายน 2017, 11:23:03 »

ผมได้ทำ log ใน mysql เพื่อตรวจสอบ id ที่กำลัง query เรียบร้อยครับ  
แต่รู้สึกว่า พอสร้าง cronjob อันที่สอง มันจะ ต้องรอให้ query รอบแรกจบก่อนมันจึงทำงานต่อ

cronjob ที่ใช้เป็นคำสั่งเรียกผ่าน wget url ครับ

อาการเหมือนเปิดเวป url แล้ว query ใน tab แรก และเปิด tab สอง ขึ้นมามันจะค้างๆ ต้องรอให้ tab แรก จบก่อน tab สอง จึงเริ่ม query ต่อ

ถ้าจะทำให้มันสามารถ query พร้อมกัน โดยไม่ต้องรอให้ query แรกจบก่อนต้องทำอย่างไรครับ Tongue Tongue



ลองไปดูพวก multithread หรือใช้คำสั่งพวก popen เข้าช่วยครับ
https://stackoverflow.com/ques...-threading-in-php-applications
บันทึกการเข้า

Mrpoohling
ก๊วนเสียว
*

พลังน้ำใจ: 6
ออฟไลน์ ออฟไลน์

กระทู้: 250



ดูรายละเอียด เว็บไซต์
« ตอบ #5 เมื่อ: 07 มิถุนายน 2017, 11:40:12 »

ผมได้ทำ log ใน mysql เพื่อตรวจสอบ id ที่กำลัง query เรียบร้อยครับ  
แต่รู้สึกว่า พอสร้าง cronjob อันที่สอง มันจะ ต้องรอให้ query รอบแรกจบก่อนมันจึงทำงานต่อ

cronjob ที่ใช้เป็นคำสั่งเรียกผ่าน wget url ครับ

อาการเหมือนเปิดเวป url แล้ว query ใน tab แรก และเปิด tab สอง ขึ้นมามันจะค้างๆ ต้องรอให้ tab แรก จบก่อน tab สอง จึงเริ่ม query ต่อ

ถ้าจะทำให้มันสามารถ query พร้อมกัน โดยไม่ต้องรอให้ query แรกจบก่อนต้องทำอย่างไรครับ Tongue Tongue



ลองไปดูพวก multithread หรือใช้คำสั่งพวก popen เข้าช่วยครับ
https://stackoverflow.com/ques...-threading-in-php-applications


ขอบคุณมากครับ  wanwan017 wanwan017  ขอไปศึกษาต่อก่อน
บันทึกการเข้า

Mrpoohling
ก๊วนเสียว
*

พลังน้ำใจ: 6
ออฟไลน์ ออฟไลน์

กระทู้: 250



ดูรายละเอียด เว็บไซต์
« ตอบ #6 เมื่อ: 08 มิถุนายน 2017, 20:58:05 »

ผมได้ทำ log ใน mysql เพื่อตรวจสอบ id ที่กำลัง query เรียบร้อยครับ  
แต่รู้สึกว่า พอสร้าง cronjob อันที่สอง มันจะ ต้องรอให้ query รอบแรกจบก่อนมันจึงทำงานต่อ

cronjob ที่ใช้เป็นคำสั่งเรียกผ่าน wget url ครับ

อาการเหมือนเปิดเวป url แล้ว query ใน tab แรก และเปิด tab สอง ขึ้นมามันจะค้างๆ ต้องรอให้ tab แรก จบก่อน tab สอง จึงเริ่ม query ต่อ

ถ้าจะทำให้มันสามารถ query พร้อมกัน โดยไม่ต้องรอให้ query แรกจบก่อนต้องทำอย่างไรครับ Tongue Tongue



ลองไปดูพวก multithread หรือใช้คำสั่งพวก popen เข้าช่วยครับ
https://stackoverflow.com/ques...-threading-in-php-applications


ขอบคุณมากครับ  wanwan017 wanwan017  ขอไปศึกษาต่อก่อน


ผมไปอ่านเจอมีคนแนะนำบอกไว้ว่าใช้ curl ทำได้ ตามโค้สด้านล่างครับ

-----------------------------
$img = "URI";
        $fullpath = basename($img);

        $ch = curl_init ($img);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
        $rawdata=curl_exec($ch);
        if(strpos($rawdata,"Not Found") === false) {
            if(file_exists($fullpath)) {
                unlink($fullpath);
            }
            $fp = fopen($fullpath,'x');
            fwrite($fp, $rawdata);
            fclose($fp);
            echo "success";

        }else {
            echo "fail";
        }
        curl_close ($ch);
----------------------------------

ผมลองจับ URL ที่ต้องการ query ใส่ แล้วเปิด TAB หลายๆ TAB ดู ผลออกมา มันสามารถทำงานได้และ ยังเปิดใช้งานเว็ปที่กำลัง query ได้ด้วย

อยากทราบว่า ทำแบบนี้แทน multithread จะได้ไหมครับ

บันทึกการเข้า

ngokung
ก๊วนเสียว
*

พลังน้ำใจ: 45
ออฟไลน์ ออฟไลน์

กระทู้: 377



ดูรายละเอียด
« ตอบ #7 เมื่อ: 08 มิถุนายน 2017, 23:14:21 »

แบบนี้ได้ไหมครับ (คร่าว ๆ นะครับ)

สร้าง Table มาใหม่ 1 อัน เพื่อเก็บ ไฟล์1 ไฟล์2 ไฟล์3
ในตารางนี้ สร้างฟิลด์ที่เก็บค่า status (ทำงานอยู่ / ว่าง) และ ฟิลด์ตัวเลข เพื่อเก็บค่า Record เริ่มต้น และ ฟิลด์วันเวลาที่เริ่มดำเนินการ


พอ Cron สำหรับ ไฟล์1 ทำงาน
- ก็ให้ทำตาม Process ที่คุณทำไว้เดิม
- บวกกับ ให้ทำการ Update ข้อมูลใน Table ที่สร้างขึ้นมาใหม่ ว่าไฟล์1 ทำงานอยู่นะ เริ่มต้นที่ 0 (record ที่ 0)


พอ Cron สำหรับ ไฟล์2 ทำงาน
- ก็ให้เช็คก่อนว่ามีไฟล์อื่นทำงานอยู่มั้ย (กรณีนี้ คือไฟล์1)
- ถ้าไม่มี ก็ให้ทำตาม Process ที่คุณทำไว้เดิม ซึ่งก็คือ จะทำอะไรก็ทำตามของเดิมไปได้เลย เพรา record ที่ทำ มันไม่ชนกันกับไฟล์อื่นอยู่แล้ว
- แต่ถ้ามี ก็ให้ทำตาม Process ที่คุณทำไว้เดิม + ระบุ Record เริ่มต้นให้ต่อจากของเดิมไปอีก 40 (เช่น record ที่ 0 + 40 = 40) กรณีนี้อาจต้องเช็ควันเวลาของ Record ที่ถูกดำเนินการล่าสุดด้วย เช่น ไฟล์ 3 อาจดำเนินการก่อน 2 ทำให้ Record ที่ควรจะเริ่มไม่ใช่ 0+40 แต่เป็น 40 + 40 = 80

- ให้ทำการ Update ข้อมูลใน Table ที่สร้างขึ้นมาใหม่ ว่าไฟล์2 ทำงานอยู่นะ เริ่มต้นที่ ....


พอ Cron สำหรับ ไฟล์3 ทำงาน
ก็เหมือน ไฟล์ 2 นั่นแหละ

ลองดูครับ เขียนโปรแกรมอยู่แล้วน่าจะพอเข้าใจว่าหมายถึงอะไร


* จริง ๆ แล้วทั้งหมดนี้ทำเป็นไฟล์เดียวได้ แต่ตอนแรกทำแบบหลาย ๆ ไฟล์ก่อนดีกว่า ตรรกะง่ายกว่า ถ้าทำได้แล้ว อยากใช้ CronJob ไฟล์เดียวประยุกต์เอา

** เพิ่มเติมครับ เหมือนเคยอ่านเจอว่า Database ที่เป็น MyISAM จะถูกล็อก ทำให้เพิ่มข้อมูลในเวลาเดียวกันไม่ได้ แต่ถ้าเป็น InnoDB จะสามารถทำได้ครับ
« แก้ไขครั้งสุดท้าย: 08 มิถุนายน 2017, 23:16:12 โดย ngokung » บันทึกการเข้า
Mrpoohling
ก๊วนเสียว
*

พลังน้ำใจ: 6
ออฟไลน์ ออฟไลน์

กระทู้: 250



ดูรายละเอียด เว็บไซต์
« ตอบ #8 เมื่อ: 09 มิถุนายน 2017, 05:32:56 »

แบบนี้ได้ไหมครับ (คร่าว ๆ นะครับ)

สร้าง Table มาใหม่ 1 อัน เพื่อเก็บ ไฟล์1 ไฟล์2 ไฟล์3
ในตารางนี้ สร้างฟิลด์ที่เก็บค่า status (ทำงานอยู่ / ว่าง) และ ฟิลด์ตัวเลข เพื่อเก็บค่า Record เริ่มต้น และ ฟิลด์วันเวลาที่เริ่มดำเนินการ


พอ Cron สำหรับ ไฟล์1 ทำงาน
- ก็ให้ทำตาม Process ที่คุณทำไว้เดิม
- บวกกับ ให้ทำการ Update ข้อมูลใน Table ที่สร้างขึ้นมาใหม่ ว่าไฟล์1 ทำงานอยู่นะ เริ่มต้นที่ 0 (record ที่ 0)


พอ Cron สำหรับ ไฟล์2 ทำงาน
- ก็ให้เช็คก่อนว่ามีไฟล์อื่นทำงานอยู่มั้ย (กรณีนี้ คือไฟล์1)
- ถ้าไม่มี ก็ให้ทำตาม Process ที่คุณทำไว้เดิม ซึ่งก็คือ จะทำอะไรก็ทำตามของเดิมไปได้เลย เพรา record ที่ทำ มันไม่ชนกันกับไฟล์อื่นอยู่แล้ว
- แต่ถ้ามี ก็ให้ทำตาม Process ที่คุณทำไว้เดิม + ระบุ Record เริ่มต้นให้ต่อจากของเดิมไปอีก 40 (เช่น record ที่ 0 + 40 = 40) กรณีนี้อาจต้องเช็ควันเวลาของ Record ที่ถูกดำเนินการล่าสุดด้วย เช่น ไฟล์ 3 อาจดำเนินการก่อน 2 ทำให้ Record ที่ควรจะเริ่มไม่ใช่ 0+40 แต่เป็น 40 + 40 = 80

- ให้ทำการ Update ข้อมูลใน Table ที่สร้างขึ้นมาใหม่ ว่าไฟล์2 ทำงานอยู่นะ เริ่มต้นที่ ....


พอ Cron สำหรับ ไฟล์3 ทำงาน
ก็เหมือน ไฟล์ 2 นั่นแหละ

ลองดูครับ เขียนโปรแกรมอยู่แล้วน่าจะพอเข้าใจว่าหมายถึงอะไร


* จริง ๆ แล้วทั้งหมดนี้ทำเป็นไฟล์เดียวได้ แต่ตอนแรกทำแบบหลาย ๆ ไฟล์ก่อนดีกว่า ตรรกะง่ายกว่า ถ้าทำได้แล้ว อยากใช้ CronJob ไฟล์เดียวประยุกต์เอา

** เพิ่มเติมครับ เหมือนเคยอ่านเจอว่า Database ที่เป็น MyISAM จะถูกล็อก ทำให้เพิ่มข้อมูลในเวลาเดียวกันไม่ได้ แต่ถ้าเป็น InnoDB จะสามารถทำได้ครับ

ขอบคุณสำหรับคำแนะนำครับ  wanwan017 wanwan017 wanwan017
บันทึกการเข้า

buakaew
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 41
ออฟไลน์ ออฟไลน์

กระทู้: 1,365



ดูรายละเอียด เว็บไซต์
« ตอบ #9 เมื่อ: 09 มิถุนายน 2017, 09:15:29 »

เก็บข้อมูลดีๆ  Embarrassed
บันทึกการเข้า

Affiliate ไทยจ่ายจริงกินหลายชั้นลึกหลากหลายผลิตภัณฑ์Affiliate ไทย
รีวิว คูปองฟรี Hosting ไทยและเทศรีวิว Hosting
ดูดวงออนไลน์ฟรีดูดวง
พระเครื่องออนไลน์พระเครื่อง

หน้า: [1]   ขึ้นบน
พิมพ์