วิธีการเรียกใช้ฟังก์ชั่นทุก ๆ 5 นาที?


15

ฉันมีฟังก์ชั่นที่จะทำงานทุก 5 นาที ฉันได้อ้างอิงจาก codex:

<?php wp_schedule_event(time(), 'hourly', 'my_schedule_hook', $args); ?> 

ฉันต้องการเรียกใช้ฟังก์ชั่นนี้ทุกๆ 5 นาทีโดยไม่คำนึงว่าจะเริ่มเมื่อไหร่ ฉันจะทำสิ่งนี้ได้อย่างไร

นอกจากนี้ยังระบุว่า codex พูดว่า cron จะทำงานเมื่อผู้เยี่ยมชมเข้าชมเว็บไซต์ มีวิธีใดบ้างในการรัน cron เช่นเดียวกับต่อนาทีและไม่รอการเยี่ยมชม?

สมมติว่าฟังก์ชั่นต่อไปนี้ควรจะรันทุกๆ 5 นาทีแล้วฉันจะใช้wp_schedule_event()หรือwp_cronไม่ได้อย่างไร?

function run_evry_five_minutes(){
    // codes go here
}

คุณดูดีขึ้นในลินุกซ์เช่น cron หรือ cron บริการของบุคคลที่ 3 ถ้าคุณต้องการดังกล่าวเป็นช่วงเวลาสั้น ๆ และความถูกต้อง
birgire

ไซต์ havs ปริมาณการใช้งานมาก .. ดังนั้นไม่จำเป็นต้องพิจารณาช่วงเวลา .. แน่ใจว่ามันจะถูกทริกเกอร์ทุก 2 หรือ 3 นาที .. ไคลเอนต์ชอบที่จะทำจากfunctions.php
Foolish Coder

เป็นไปไม่ได้ที่จะทริกเกอร์ไฟล์ php โดยไม่มีสิ่งใดทำงานบนเซิร์ฟเวอร์ด้วยตัวจับเวลา
Andrew Welch

ไฟล์? เรากำลังพูดถึงฟังก์ชั่นในฟังก์ชั่น.
php

คุณคิดว่าบริการการตรวจสอบฟรีอาจเป็น ping ที่ก่อให้เกิด CRON หรือไม่ newrelic.com/server-monitoring
jgraup

คำตอบ:


28

คุณสามารถสร้างตารางเวลาใหม่ผ่าน cron_schedules:

function my_cron_schedules($schedules){
    if(!isset($schedules["5min"])){
        $schedules["5min"] = array(
            'interval' => 5*60,
            'display' => __('Once every 5 minutes'));
    }
    if(!isset($schedules["30min"])){
        $schedules["30min"] = array(
            'interval' => 30*60,
            'display' => __('Once every 30 minutes'));
    }
    return $schedules;
}
add_filter('cron_schedules','my_cron_schedules');

ตอนนี้คุณสามารถกำหนดเวลาการทำงานของคุณ:

wp_schedule_event(time(), '5min', 'my_schedule_hook', $args);

หากต้องการกำหนดเวลาเพียงครั้งเดียวให้ห่อในฟังก์ชันและตรวจสอบก่อนเรียกใช้:

$args = array(false);
function schedule_my_cron(){
    wp_schedule_event(time(), '5min', 'my_schedule_hook', $args);
}
if(!wp_next_scheduled('my_schedule_hook',$args)){
    add_action('init', 'schedule_my_cron');
}

บันทึกพารามิเตอร์ $ args! ไม่ได้ระบุพารามิเตอร์ $ args ใน wp_next_scheduled แต่การมี $ args สำหรับ wp_schedule_event จะทำให้จำนวนเหตุการณ์ที่เกือบจะไม่สิ้นสุดของเหตุการณ์เดียวกัน (แทนที่จะเป็นเพียงหนึ่ง)

สุดท้ายสร้างฟังก์ชั่นจริงที่คุณต้องการเรียกใช้:

function my_schedule_hook(){
    // codes go here
}

ฉันคิดว่ามันเป็นสิ่งสำคัญที่จะกล่าวถึงว่า wp-cron กำลังตรวจสอบตารางเวลาและดำเนินงานตามกำหนดเวลาในแต่ละครั้งที่โหลดหน้าเว็บ

ดังนั้นหากคุณมีเว็บไซต์ที่มีปริมาณการใช้งานต่ำซึ่งมีผู้เยี่ยมชมเพียง 1 ชั่วโมงต่อชั่วโมง wp-cron จะทำงานเฉพาะเมื่อผู้เยี่ยมชมนั้นเรียกดูไซต์ของคุณ (หนึ่งครั้งต่อชั่วโมง) หากเว็บไซต์ของคุณมีผู้เข้าชมจำนวนมากที่มีผู้เข้าชมร้องขอหน้าเว็บทุกวินาที wp-cron จะถูกเรียกใช้ทุกวินาทีทำให้เกิดการโหลดเพิ่มขึ้นบนเซิร์ฟเวอร์

ทางออกคือปิดการทำงานของ wp-cron และทริกเกอร์มันผ่านงาน cron จริงในช่วงเวลาที่คุณทำซ้ำงาน wp-cron ที่กำหนดเวลาที่เร็วที่สุด (5 นาทีในกรณีของคุณ)

Lucas Rolffอธิบายปัญหาและให้รายละเอียดวิธีแก้ปัญหา

คุณสามารถใช้บริการบุคคลที่สามฟรีเช่นUptimeRobotเพื่อสืบค้นเว็บไซต์ของคุณ (และเรียกใช้ wp-cron) ทุก ๆ 5 นาทีหากคุณไม่ต้องการปิดใช้งาน wp-cron และเรียกใช้ผ่านงาน cron จริง


2

หากไซต์ของคุณมีปริมาณการใช้set_transient()งานมากคุณสามารถลองใช้เพื่อเรียกใช้ (โดยประมาณ) ทุก 5 นาทีเช่น:

function run_every_five_minutes() {
    // Could probably do with some logic here to stop it running if just after running.
    // codes go here
}

if ( ! get_transient( 'every_5_minutes' ) ) {
    set_transient( 'every_5_minutes', true, 5 * MINUTE_IN_SECONDS );
    run_every_five_minutes();

    // It's better use a hook to call a function in the plugin/theme
    //add_action( 'init', 'run_every_five_minutes' );
}

เอ่อใช่มั้ย!! ...
bonger

ใช่. ก็ไม่ได้ทำงาน .. ผมเคยใช้รหัสต่อไปนี้functions.phpเมื่อมีการเยี่ยมชมให้ไปที่หน้าการปรับปรุงจะทำกับตารางในฐานข้อมูลของฉัน function run_evry_five_minutes() { $homepage = file_get_contents('link to visit'); echo $homepage; }.. แต่ตาราง DB จะไม่อัปเดตหลังจากผ่านไป 6 นาที
Foolish Coder

ไม่ทราบว่าทำไมมันไม่ทำงานสำหรับคุณ แต่จริง ๆ แล้วคิดเพียงแค่ใช้get_transient()/ set_transient()ไม่มีสิ่ง cron ทำให้รู้สึกง่ายขึ้นมากจะปรับปรุงคำตอบ ...
bonger

@bonger เป็นทางเลือกที่ดีสำหรับ wp_schedule_event () หรือไม่
Marko Kunic

@ MarkoKunićไม่รู้จะซื่อสัตย์ยังไม่ได้ลอง ... มันเป็นเพียงวิธีแก้ปัญหา แต่ถ้าคุณลองแจ้งให้เราทราบ ... ! (คำตอบของ Johano Fierra นั้นดูดีwordpress.stackexchange.com/a/216121/57034 )
bonger

2

คุณสามารถทริกเกอร์มันในการเปิดใช้งานปลั๊กอินแทนการเรียกปลั๊กอินแต่ละครั้ง:

//Add a utility function to handle logs more nicely.
if ( ! function_exists('write_log')) {
    function write_log ( $log )  {
        if ( is_array( $log ) || is_object( $log ) ) {
            error_log( print_r( $log, true ) );
        } else {
            error_log( $log );
        }
    }
}

/**
 * Do not let plugin be accessed directly
 **/
if ( ! defined( 'ABSPATH' ) ) {
    write_log( "Plugin should not be accessed directly!" );
    exit; // Exit if accessed directly
}

/**
 * -----------------------------------------------------------------------------------------------------------
 * Do not forget to trigger a system call to wp-cron page at least each 30mn.
 * Otherwise we cannot be sure that trigger will be called.
 * -----------------------------------------------------------------------------------------------------------
 * Linux command:
 * crontab -e
 * 30 * * * * wget http://<url>/wp-cron.php
 */

/**
 * Add a custom schedule to wp.
 * @param $schedules array The  existing schedules
 *
 * @return mixed The existing + new schedules.
 */
function woocsp_schedules( $schedules ) {
    write_log("Creating custom schedule.");
    if ( ! isset( $schedules["10s"] ) ) {
        $schedules["10s"] = array(
            'interval' => 10,
            'display'  => __( 'Once every 10 seconds' )
        );
    }

    write_log("Custom schedule created.");
    return $schedules;
}

//Add cron schedules filter with upper defined schedule.
add_filter( 'cron_schedules', 'woocsp_schedules' );

//Custom function to be called on schedule triggered.
function scheduleTriggered() {
    write_log( "Scheduler triggered!" );
}
add_action( 'woocsp_cron_delivery', 'scheduleTriggered' );

// Register an activation hook to perform operation only on plugin activation
register_activation_hook(__FILE__, 'woocsp_activation');
function woocsp_activation() {
    write_log("Plugin activating.");

    //Trigger our method on our custom schedule event.
    if ( ! wp_get_schedule( 'woocsp_cron_delivery' ) ) {
        wp_schedule_event( time(), '10s', 'woocsp_cron_delivery' );
    }

    write_log("Plugin activated.");
}

// Deactivate scheduled events on plugin deactivation.
register_deactivation_hook(__FILE__, 'woocsp_deactivation');
function woocsp_deactivation() {
    write_log("Plugin deactivating.");

    //Remove our scheduled hook.
    wp_clear_scheduled_hook('woocsp_cron_delivery');

    write_log("Plugin deactivated.");
}

1

ฉันกลัวว่านอกเหนือจากการรอให้ใครบางคนเข้าชมเว็บไซต์ของคุณซึ่งใช้งานฟังก์ชั่นตัวเลือกเดียวคือการตั้งค่างาน cron บนเซิร์ฟเวอร์ของคุณโดยใช้สิ่งนี้/programming/878600/how -to-create-cronjob-using-bashหรือถ้าคุณมีอินเตอร์เฟสสไตล์ cpanel บนเซิร์ฟเวอร์ของคุณบางครั้งมี gui สำหรับการตั้งค่านี้


ใช่ฉันเข้าใจว่า .. ฉันมี crons บางส่วนที่สร้างขึ้นจาก cPnael .. แต่ตอนนี้ฉันพยายามเรียกใช้ฟังก์ชันจากfunctions.phpเพราะเมื่อฟังก์ชันอยู่ในpluginหรือfunctions.phpเราไม่สามารถขอให้ลูกค้าตั้ง cron จาก cpanel ได้ ของตัวเอง ..
โง่ Coder

1

เรื่องทั่วไปจัดตารางเวลาปลั๊กอินช่วยให้คุณสามารถเรียกใช้งานบ่อยได้อย่างน่าเชื่อถือและทันเวลาโดยไม่มีใครต้องเข้าเยี่ยมชมเว็บไซต์ของคุณทั้งหมดที่คุณต้องมีอย่างน้อย 1 การดำเนินการและการกำหนดเวลาที่ใช้ระบบปฏิบัติการยูนิกซ์ Crontab

มันใช้งานง่ายและยืดหยุ่นมาก คุณสร้างฟังก์ชั่นของคุณเองและกำหนดการกระทำภายใน จากนั้นคุณสามารถเลือกการกระทำของคุณจากเมนูปลั๊กอินและดำเนินการเมื่อใดก็ตามที่คุณต้องการ


0

ฉันมีวิธีแก้ปัญหาที่เป็นไปได้โดยใช้ฟังก์ชั่นกำหนดเวลาและฟังก์ชั่น WP Ajax แบบเรียกซ้ำ

  1. สร้างเหตุการณ์กำหนดเวลา 60 นาทีเพื่อเรียกใช้ฟังก์ชัน
  2. ฟังก์ชันนี้จะเรียกใช้ฟังก์ชันเรียกซ้ำโดยใช้ Ajax file_get_contents()
  3. ฟังก์ชั่น ajax จะมีตัวนับบนฐานข้อมูลที่มีจำนวนทั้งหมด 60 (สำหรับแต่ละนาทีภายในหนึ่งชั่วโมง)
  4. ฟังก์ชัน ajax นี้จะตรวจสอบตัวนับของคุณถึง:

หากตัวนับเท่ากับหรือสูงกว่า 60 มันจะรีเซ็ตตัวนับและรองาน cron ต่อไป

หากตัวนับหลายจาก 5 (ดังนั้นในแต่ละ 5 นาที) มันจะดำเนินการฟังก์ชั่นที่คุณต้องการ

และนอกจากเงื่อนไขแล้วมันจะนอนหลับเป็นเวลา 59 วินาทีsleep(59);(สมมติว่าฟังก์ชั่นของคุณเป็นแบบเร็ว) หลังจากการนอนหลับมันจะเรียกใช้ตัวเองfile_get_contents()อีกครั้ง

สิ่งสำคัญที่ควรทราบ:

  1. สร้างวิธีการขัดจังหวะกระบวนการ (เช่นการตรวจสอบค่าบนฐานข้อมูล)
  2. สร้างวิธีการป้องกัน 2 กระบวนการในเวลาเดียวกัน
  3. ใน file_get_contents ให้ตั้งค่า จำกัด เวลาบนส่วนหัวเป็น 2 หรือ 3 วินาทีมิฉะนั้นเซิร์ฟเวอร์อาจมีกระบวนการต่าง ๆ รออยู่
  4. คุณอาจต้องการใช้set_time_limit(90);เพื่อพยายามป้องกันเซิร์ฟเวอร์ให้หยุดการทำงานของคุณก่อนที่จะเข้าสู่โหมดสลีป

มันเป็นวิธีการแก้ปัญหาไม่ใช่วิธีที่ดีและเซิร์ฟเวอร์อาจถูกบล็อก การใช้ cron ภายนอกคุณสามารถตั้งค่าฟังก์ชั่นง่าย ๆ และเซิร์ฟเวอร์จะใช้ทรัพยากรในทุกๆ 5 นาที การใช้โซลูชันนี้เซิร์ฟเวอร์จะใช้ทรัพยากรอยู่ตลอดเวลา


0

คำตอบของ @johano อย่างถูกต้องอธิบายวิธีตั้งค่าช่วงเวลาที่กำหนดเองสำหรับงาน WP cron คำถามที่สองยังไม่ได้รับคำตอบซึ่งเป็นวิธีการเรียกใช้ cron ทุกนาที:

  1. ในไฟล์wp-config.phpเพิ่มรหัสต่อไปนี้:

    define('DISABLE_WP_CRON', true);
  2. เพิ่มงาน cron ( crontab -eบน unix / linux):

    1 * * * * wget -q -O - http://example.com/wp-cron.php?doing_wp_cron

ส่วนแรก (ขั้นตอนที่ 1) จะปิดใช้งานงาน cron ภายในของ WordPress ส่วนที่สอง (ขั้นตอนที่ 2) จะเรียกใช้งาน WordPress cron ด้วยตนเองทุกนาที

ด้วยคำตอบของ @ Johano (วิธีเรียกใช้งานทุก ๆ 5 นาที) และของฉัน (วิธีเรียกใช้ cron ด้วยตนเอง) คุณควรจะสามารถบรรลุเป้าหมายได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.