সময় কেটে গেলে ডাব্লুপি ক্রোন কার্যকর করে না


16

লক্ষ

আমি wp_schedule_single_event( )কোনও একক ইভেন্ট সম্পাদন করতে ব্যবহার করতে চাই যা ব্যবহারকারী কোনও ফর্ম জমা দেওয়ার 8 মিনিটের পরে আমাকে একটি ইমেল প্রেরণ করে।

সমস্যাটি

নিম্নলিখিত কোডটি আমার রয়েছে functions.php:

function nkapi_send_to_system( $args ) {
  wp_mail( 'xxx', 'xxx', $args );
}

add_action( 'nkapi_send', 'nkapi_send_to_system' );

function schedule_event( $id ) {
  wp_schedule_single_event( current_time( 'timestamp' ) + 480, 'nkapi_send', array( $id ) );
}

এবং নিম্নলিখিত কোডটি কল করতে ব্যবহৃত হয় schedule-event:

schedule_event( $_SESSION['insert_id'] ); // the $_SESSION var contains an INT

8 মিনিটেরও বেশি অপেক্ষা করার পরে আমার ইনবক্সে কোনও ইমেল ছিল না।

আমি কি চেষ্টা করেছি

কোর কন্ট্রোলের মাধ্যমে প্লাগইনটি দেখা যাবে যে ক্রিক জবগুলি নির্ধারিত হয়েছে।

কোর নিয়ন্ত্রণ স্ক্রিন

বেশ কয়েকটি পরিবর্তনের পরে আমি সেগুলি বেশ সঠিকভাবে পরিচালনা করতে সক্ষম হয়েছি এবং আরও ভাল, যখন আমি "এখনই চালান" টিপুন, আমি আসলে আমার ইনবক্সে একটি ইমেল পাই get

আমি যখন 8 মিনিটের পরে আমার সাইটটিতে যাই তখন ক্রোন কেন কার্যকর হয় না exec এই কোডটির সাথে সম্ভবত ভুল কী? আমাকে বলতে হবে যে এটি আমার প্রথমবারের মতো ডাব্লুপি ক্রোন ব্যবহার করছে।

আমি আরও চেষ্টা করেছি

ভ্যানকোডার আইডি- এর মন্তব্যের পরে, যদি আমি নিম্নলিখিত কোডটি সরাসরি এতে প্রবেশ করি তবে কোডটি কাজ করে কিনা তা পরীক্ষা করার সিদ্ধান্ত নিয়েছে functions.php:

function schedule_event( $id ) {
  wp_schedule_single_event( time(), 'nkapi_send', array( $id ) );
}

if ( isset( $_SESSION['insert_id'] ) ) {
  if ( ! array_key_exists( 'insert_scheduled', $_SESSION ) || $_SESSION['insert_scheduled'] != $_SESSION['insert_id'] ) {
    schedule_event( $_SESSION['insert_id'] );
    $_SESSION['insert_scheduled'] = $_SESSION['insert_id'];
  }
}

এই কোডটির অবক্ষয়টি হ'ল, এই কোডটি কার্যকর করার আগে ব্যবহারকারীর অন্য পৃষ্ঠায় যেতে হবে। তবে অন্যদিকে, এটি কাজ করে না তাই এটি আমার প্রথম সমস্যা হবে না ...


1
কোথায় এবং কিভাবে schedule_event( $_SESSION['insert_id'] );বহিস্কার করা হয় ?
ভ্যানকোডার

একটি শর্টকোডে একটি পৃষ্ঠায় একটি পৃথক ফাইল (এটিতে একটি ফর্ম সহ) অন্তর্ভুক্ত থাকে, যখন সেই ফর্মটি পৃষ্ঠা পুনরায় লোড করা হয়, একই ফাইলটি তখন সম্পাদন করে schedule_event( ), শর্টকোড দ্বারা লোড হওয়া অন্তর্ভুক্ত ফাইলটির শীর্ষে বলতে দিন।
মাইক মাদার্ন

কি কোনো crons কাজ করে? wp_version_check ইত্যাদি?
ভ্যানকোডার

আমি কোন crons কাজ পাইনি। কি সমস্যা হতে পারে?
মাইক মাদার্ন

নিশ্চিত করতে - এমনকি কোর ক্রোন কাজগুলিও ব্যর্থ?
ভ্যানকোডার

উত্তর:


8

প্রথমে আপনি দয়া করে নিশ্চিত করতে পারেন যে আপনার কোনও ক্যাচিং প্লাগইন সক্ষম নেই? ক্যাচিং প্লাগইন ক্রোন জবগুলিতে হস্তক্ষেপ করতে পারে কারণ আপনার দর্শনার্থীদের কোনও লাইভ পৃষ্ঠা দেওয়া হয় নি তবে আপনার পৃষ্ঠার ক্যাশেড সংস্করণ রয়েছে।

যদি আপনার কোনও ক্যাচিং প্লাগইন সক্ষম থাকে তবে আপনি আপনার পৃষ্ঠাগুলির একটি বেছে নিতে পারেন, সেই পৃষ্ঠার জন্য আপনার ক্যাচিং প্লাগইন এর সেটিংসে একটি এক্সক্লুশন যোগ করতে পারেন যাতে এটি কখনও ক্যাশে না হয়।

তারপরে আপনাকে ম্যানুয়ালি একটি ক্রোন জব তৈরি করতে হবে (যদি আপনি কোনও শেয়ার্ড হোস্টিং পরিবেশে থাকেন তবে সিপিএনেল ব্যবহার করে বা টার্মিনাল থেকে এটি যদি কোনও ভিপিএস / ডেডিকেটেড সার্ভার থাকে) যা প্রতি কয়েক মিনিটের মধ্যে সেই পৃষ্ঠাটি পরিদর্শন করবে।

আমি আশা করি এটি সাহায্য করবে!


আমার একটি ক্যাচিং প্লাগইন সক্ষম আছে!
ডাব্লু

14

প্রথমত, আপনার কাস্টম ক্রোন কাজের সময়সূচী সংজ্ঞায়িত করুন।

add_filter('cron_schedules', array($this, 'cron_schedules'));

public function cron_schedules($schedules){
    $prefix = 'cron_';// Avoid conflict with other crons. Example Reference: cron_30_mins
    $schedule_options = array(
        '30_mins' => array(
            'display' => '30 Minutes',
            'interval' => '1800'
        ),
        '1_hours' => array(
            'display' => 'Hour',
            'interval' => '3600'
        ),
        '2_hours' => array(
            'display' => '2 Hours',
            'interval' => '7200'
        )
    );
    /* Add each custom schedule into the cron job system. */
    foreach($schedule_options as $schedule_key => $schedule){
        $schedules[$prefix.$schedule_key] = array(
            'interval' => $schedule['interval'],
            'display' => __('Every '.$schedule['display'])
        );
     }
     return $schedules;
}

কোথায় এবং কখন ইভেন্টটি সময়সূচী দেওয়ার সিদ্ধান্ত নিতে হবে।

এখানে কোডের স্নিপেটের একটি উদাহরণ দেওয়া আছে, যা একটি কাস্টম শ্রেণীর পদ্ধতিতে কল দেয়:

$schedule = $this->schedule_task(array(
    'timestamp' => current_time('timestamp'), // Determine when to schedule the task.
    'recurrence' => 'cron_30_mins',// Pick one of the schedules set earlier.
    'hook' => 'custom_imap_import'// Set the name of your cron task.
));

এখানে কোডটি যা ইভেন্টটির সময়সূচি দেয়:

private function schedule_task($task){
    /* Must have task information. */
    if(!$task){
        return false;
    }
    /* Set list of required task keys. */
    $required_keys = array(
        'timestamp',
        'recurrence',
        'hook'
    );
    /* Verify the necessary task information exists. */
    $missing_keys = array();
    foreach($required_keys as $key){
        if(!array_key_exists($key, $task)){
            $missing_keys[] = $key;
        }
    }
    /* Check for missing keys. */
    if(!empty($missing_keys)){
        return false;
    }
    /* Task must not already be scheduled. */
    if(wp_next_scheduled($task['hook'])){
        wp_clear_scheduled_hook($task['hook']);
    }
    /* Schedule the task to run. */
    wp_schedule_event($task['timestamp'], $task['recurrence'], $task['hook']);
    return true;
}

এখন, আপনাকে যা করতে হবে তা হ'ল আপনার কাস্টম ক্রোন কার্যটির নামে কল করা। এই উদাহরণে ক্রোন টাস্ক নাম custom_imap_import

add_action('custom_imap_import', array($this, 'do_imap_import'));

public function do_imap_import(){
    // .... Do stuff when cron is fired ....
}

সুতরাং এই উদাহরণে, $this->do_imap_import();প্রতি 30 মিনিটে ডাকা হয় (ধরে নিলে আপনার ওয়েবসাইটে আপনার যথেষ্ট ট্র্যাফিক রয়েছে)।


মন্তব্য

আপনার ক্রোনকে সঠিক সময়ে গুলি চালানোর জন্য একটি পৃষ্ঠার দর্শন প্রয়োজন।

উদাহরণ: আপনি যদি 30 মিনিটের ব্যবধানে কোনও কাজ নির্ধারিত করেন তবে 4 ঘন্টা কেউ আপনার সাইটে যান না, আপনার ক্রোন কাজটি 4 ঘন্টা পরে আপনার সাইটে না আসা পর্যন্ত আপনার ক্রোন চাকরীটি বরখাস্ত করা হবে না। যদি সত্যই আপনার প্রতি 30 মিনিটের পরে আপনার কার্যটি প্রয়োজন হয় তবে আপনার ওয়েব হোস্টিং সরবরাহকারীর মাধ্যমে আপনার ওয়েবসাইটকে কাঙ্ক্ষিত বিরতিতে দেখার জন্য একটি বৈধ ক্রোন জব সেটআপ করার পরামর্শ দেওয়া হচ্ছে।

ওয়ার্ডপ্রেস ক্রোন জব আপনার ওয়েবসাইটকে ধীর করে দেয় না!

সম্ভবত আপনি কী ভাবছেন ক্রোন-স্ক্রিপ্টটি কার্যকর করতে দীর্ঘ সময় নিলে, স্ক্রিপ্টটি কার্যকর না হওয়া পর্যন্ত দর্শনার্থীদের অপেক্ষা করতে হবে কি? নাঃ! এটা কীভাবে সম্ভব? wp-cron.phpফাইলটি দেখলে আপনি একটি লাইন পাবেন line

ignore_user_abort(true);

এটি এমন একটি php.iniকনফিগারেশন যা সেট করে যে আপনি যদি সাইট / স্ক্রিপ্ট লোড করা বন্ধ করেন তবে স্ক্রিপ্টটি সম্পাদন বন্ধ করবে না।

আপনি যদি wp-includes/cron.phpফাইলটি দেখেন তবে আপনি এই জাতীয় একটি লাইন পাবেন:

wp_remote_post( $cron_url, 
array('timeout' => 0.01,
 'blocking' => false, 
 'sslverify' => apply_filters('https_local_ssl_verify', true)) );

এর মানে হল যে ওয়ার্ডপ্রেস সঞ্চালনের triggering তারপর এটি বাতিল হবে কিন্তু হিসাবে আপনি সেট করেছেন কেবল 0.01 দ্বিতীয় অপেক্ষা করবে ignore_user_abortকরার trueস্ক্রিপ্ট চালাতে করা হবে না। ওয়ার্ডপ্রেস ক্রোন জবগুলিতে বড় স্ক্রিপ্টগুলি কার্যকর করতে এই কার্যকারিতাটি বিশাল সুবিধা।

সহায়তার জন্য উপলব্ধ কার্যাদি:


6
এটি একটি উল্লেখযোগ্যভাবে বিস্তৃত প্রতিক্রিয়া, যা আমি যতদূর দেখতে পাচ্ছি, আসল প্রশ্নটি মোকাবেলায় ব্যর্থ which যে কারণে সমস্ত তফসিলযুক্ত কাজ (মূল কাজগুলি সহ) ব্যর্থ হয়।
ভ্যানকোডার

এই উত্তরটি হ'ল ওয়ার্ডপ্রেস ক্রোন কার্যগুলি সঠিকভাবে বুঝতে এবং সময় নির্ধারণের জন্য ব্যবহারকারীকে সঠিক দিক নির্দেশনা দেয়।
মাইকেল একল্যান্ড

4
এটি নিশ্চিতভাবে আমাকে ওয়ার্ডপ্রেস
মাইক মাদার্ন

2
মাইকেল, আপনার আরও প্রায়ই উত্তর দেওয়া উচিত। দুর্দান্ত এক +1
কায়সার

1
আমি মনে করি WP_Cronবাকী ডব্লিউপি-র মতো জিএমটি হুডের নীচে ব্যবহার করে, সুতরাং প্রথম ইভেন্টটির time()পরিবর্তে সময়সূচী করা ভাল current_time()
ইয়ান ডান

3

ওয়ার্ডপ্রেস ক্রোন আপনাকে কাজগুলি নির্ধারণ করার অনুমতি দেয়, তবে সাইটে কেবলমাত্র কোনও অনুরোধ থাকলে তা কেবল কার্যকর করা হবে। ওয়ার্ডপ্রেস প্রাপ্ত প্রতিটি অনুরোধের জন্য এটি ক্রোন কাজ প্রক্রিয়া করার জন্য রয়েছে কিনা তা পরীক্ষা করে দেখবে এবং যদি /wp-cron.php?doing_wp_cronকাজটি প্রক্রিয়াজাতকরণের জন্য অ্যাসিঙ্ক্রোনিকভাবে একটি অনুরোধ বন্ধ করে দেয়। যদি কোনও কাজের নির্ধারিত শুরুটি কোনও অনুরোধ ছাড়াই পাস করে তবে ক্রোন প্রক্রিয়া শুরু হবে না।

যেহেতু আপনি আপনার নির্ধারিত কাজগুলি দেখতে এবং চালাতে সক্ষম হচ্ছেন, এটি সম্ভবত ক্রোন জব শুরু করার অনুরোধ নেই এমন বিশেষত কোনও অনুরোধ নেই যা আপনি ক্যাচিং প্লাগইন ব্যবহার করছেন। আরও নিয়মিত সময়সূচীতে এটিকে অফলোড করার সর্বোত্তম বিকল্প হ'ল ওয়ার্ডপ্রেসে ডিফল্ট চেকটি অক্ষম করা এবং ব্যবহার crontab

ডিফল্ট চেকটি অক্ষম করার জন্য প্রথমে (যা ক্লায়েন্টের পার্শ্বের পারফরম্যান্সে কিছুটা সহায়তা করতে পারে), নিম্নলিখিতগুলিতে এতে যুক্ত করুন wp-config.php:

// Disable default check for WordPress cron jobs on page loads
define( 'DISABLE_WP_CRON', true );

এরপরে আপনি wp-cron.phpকমান্ড লাইনটি প্রবেশ করুন crontab -eএবং নীচের মতো দেখতে এমন একটি লাইন যুক্ত করুন: এরপরে প্রান্তে কোনও কাজ প্রক্রিয়া করতে মিনিটে একবার পৃষ্ঠাটি আনার জন্য একটি টাস্ক তৈরি করুন:

*/1 * * * * /usr/bin/curl --silent http://example.com/wp-cron.php?doing_wp_cron=$(date +\%s.\%N) >/dev/null 

2
আপনি যদি do_wp_cron কে কোনও মান না দেন, তবে এটি বেশিরভাগ ক্ষেত্রেই কখনও কখনও দু'বার কাজ সম্পাদন করে। doing_wp_cron=$(date +\%s.\%N)এটি রোধ করতে ব্যবহার করুন ।
আলেকজান্ডার গার্ডেন

0

আপনার কনফিগারেশনে DISABLE_WP_CRON সেট করা নেই তা পরীক্ষা করুন।

এটি ব্যর্থ হয়ে সমস্ত প্লাগইন অক্ষম করার চেষ্টা করুন (মূল নিয়ন্ত্রণ ব্যতীত - যদিও আমি ডাব্লুপি-ক্রন্ট্রোল ব্যবহার করব) এবং দেখুন আপনার মূল কাজগুলি কাজ করে কিনা। যদি তারা তা করে তবে আপনি কোথাও প্লাগইন হস্তক্ষেপের অভিজ্ঞতা নিচ্ছেন।

একইভাবে, একটি স্ট্যান্ডার্ড টোয়েনসোমথিং থিমে স্যুইচ করার চেষ্টা করুন।

যদি এগুলির মধ্যে কোনওরকম কোনও পার্থক্য না আসে তবে সম্ভাবনা হ'ল এটি একটি হোস্টিংয়ের বিষয়।


আমি DISABLE_WP_CRONআমার মধ্যে সেট করে নেই wp-config.php, আমি আরও কিছু চেষ্টা করব এবং পরে ফিরে আসব
মাইক মাদার্ন

0

ওয়ার্ডপ্রেস আড়াল করে এমন কোনও প্লাগইন চেক করুন।

কীভাবে দেখা যায় এই সমস্যা কিনা?

  1. Http (গুলি): //yoursite.com/wp-cron.php এ নেভিগেট করুন আপনার খালি পৃষ্ঠাটি দেখা উচিত। একেবারে খালি।
  2. "নেক্সট এক্সিকিউশন" এর অধীনে একটি ক্রোন জব ম্যানেজারকে অবশ্যই আপনাকে অবশ্যই দেখতে হবে: ক্রোন কাজের সময় নির্ধারিত - যদি ডাব্লুপি-ক্রোন.পিপি সঠিকভাবে কাজ করে ("সারি সারি" টেক্সটটিই নয় - একটি নির্দিষ্ট সময় - কিছু এন্ট্রিগুলির জন্য "কাতারে" কখনও কখনও ঠিক থাকে, তবে এটি যদি একমাত্র জিনিস হয় তবে আপনি দেখুন -> আপনার ক্রোন কাজ করে না))

+1 টি। "ক্রোন কাজ করছে কিনা তা পরীক্ষা করে দেখুন" - এমন কোনও প্লাগইন বিশ্বাস করবেন না - যেমন ডাব্লুপি ক্রোন স্থিতি পরীক্ষক প্লাগইন দেখিয়েছে যে ক্রোন কাজ করছে। তবে বাস্তবে তা হয়নি। এটি যা দেখায় - আপনার চোখকে বিশ্বাস করুন এবং এই প্লাগইনটি নয়!

উপসংহার: যদি এটি 404 ত্রুটি হয় - তবে ক) সুইচ অফ করুন) কেবল ক্যাচিং প্লাগইনগুলি যেমন অন্যরা প্রস্তাব দেয় খ) তবে ওয়ার্ডপ্রেসকে আড়াল করে এমন কোনও প্লাগইনও নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.