কীভাবে নিশ্চিত করা যায় যে একবারে কেবলমাত্র একটি wp_cron () চালিত হয়?


9

wp_cron()নিম্নলিখিত কোডের মতো আমার প্রায় 20 টি ফাংশন রয়েছে। প্রায় সমস্ত ক্রোন ঘন্টা প্রতি ঘন্টা চালায়; কিছু প্রতিদিন হয়।

if ( ! wp_next_scheduled( 'my_task_hook' ) ) {
  wp_schedule_event( time(), 'hourly', 'my_task_hook' );
}

add_action( 'my_task_hook', 'my_task_function' );

function my_task_function() {
  //Complex Code
}

সার্ভারের কার্যকারিতা বাড়ানোর জন্য, এবং হোস্টিং সংস্থাগুলি থেকে সার্ভার সীমাবদ্ধতা বার্তা পাওয়া না যাওয়ার জন্য, আমি নিশ্চিত করতে চাই যে একটি নির্দিষ্ট সময়ে কেবলমাত্র একটি ক্রোন চলবে ... এটি কি সম্ভব?


বর্তমান গৃহীত উত্তরটি দুর্দান্ত, তবে আমার নিম্নলিখিত প্রশ্ন রয়েছে, সে কারণেই আমি এই প্রশ্নের জন্য অনুগ্রহ শুরু করি।

প্রথমে গৃহীত উত্তরটি পড়ুন।

ধরা যাক ক্রোন 1 রান করুন, আমার ক্রোন 2 কোডটি চলবে না কারণ এখনও আমরা 5 মিনিটের মধ্যে রয়েছি বা প্রথম ক্রোন এখনও চলছে, তবে ক্রোন 2 এর জন্য দৌড়ানোর কারণে wp_schedule_event( time(), 'hourly', 'my_task_hook' );আমি মনে করি ওয়ার্ডপ্রেস ক্রোন 2 রান হিসাবে বিবেচনা করে ..... তাই মূলত কোড ক্রোন 2 কোড কখনই চলবে না ..... অথবা আমি কিছু ভুল বুঝেছি?


না, আপনি এটি সঠিকভাবে বুঝতে পারেন। আমি আপনার সমস্যার জন্য কিছু সমাধান ... সঙ্গে আমার উত্তর আপডেট করব
Krzysiek Dróżdż

উত্তর:


10

হ্যা এটা সম্ভব...

এবং সত্যি কথা বলতে, এটি করা প্রায়শই খুব গুরুত্বপূর্ণ ... ডাব্লুপি সময়সূচী কখনও কখনও সমস্যার সৃষ্টি করে, যখন ক্রোন টাস্ক দীর্ঘ হয় ...

তাহলে আমি কীভাবে এই সমস্যার সমাধান করব?

আমি সেমফোরগুলি প্রয়োগ করতে ট্রান্সিয়েন্টস এপিআই ...

কোডটি এখানে:

if ( ! wp_next_scheduled( 'my_task_hook' ) ) {
  wp_schedule_event( time(), 'hourly', 'my_task_hook' );
}

add_action( 'my_task_hook', 'my_task_function' );

function my_task_function() {
  // if some other my_task is already running, stop
  if ( get_transient( 'my_task_function_semaphore' ) ) return;

  // set semaphore for 5 minutes
  set_transient( 'my_task_function_semaphore', true, 5*60 );

  // DO YOUR STUFF

  delete_transient( 'my_task_function_semaphore' );
}

আমি কেন এই ক্ষেত্রে স্থানান্তর ব্যবহার করব? কারণ:

  • তারা ডব্লিউপি এর অংশ।
  • এগুলি ব্যবহার করা সহজ এবং দক্ষ।
  • তারা অচলাবস্থা সৃষ্টি করবে না। আসুন আমরা বলি যে আমার ক্রোন টাস্কটি মারা যেতে পারে (কিছু ত্রুটি ঘটতে পারে, বা এটি খুব দীর্ঘকাল চলে এবং মারা যায়, ইত্যাদি)। এই ক্ষেত্রে এটি সেমফোর মুছে ফেলবে না, সুতরাং ভবিষ্যতের সমস্ত কাজ কার্যকর হবে না। স্থানান্তরকারীদের ব্যবহার করা এই সমস্যার সমাধান করে, কারণ কিছু সময়ের পরে ক্ষণস্থায়ী মুছে ফেলা হবে।

এবং যদি সেখানে অনেকগুলি বিভিন্ন কাজ করতে হয়?

সুতরাং আসুন আমরা অনেক আলাদা ক্রোন টাস্ক আছে যেগুলি একই সময়ে কখনই চলবে না, তবে আমরা এখনও চাই যে সেগুলি সমস্ত চালানো ...

যদি আমরা সমাধানটি semaphore এর সাথে ব্যবহার করি এবং এই সমস্ত কাজের জন্য কেবলমাত্র একটি semaphore ব্যবহার করি, তবে তাদের মধ্যে কিছু কখনও চলতে পারে না। তাহলে কি করব?

সেক্ষেত্রে আপনার চিন্তাভাবনা পরিবর্তন করা উচিত। আপনার কিছু স্বাধীন কাজ নেই, তবে করণীয় কাজগুলির একটি সারি। সুতরাং আপনার এটিকে এভাবে বাস্তবায়ন করা উচিত।

তাই:

  1. আপনি কিছু প্রকার সারি যুক্ত করেন (আপনি কোনও অ্যারে ব্যবহার করতে পারেন এবং এটি বিকল্প হিসাবে সংরক্ষণ করতে পারেন বা একটি কাস্টম ডিবি টেবিল যুক্ত করতে পারেন)।
  2. আপনি ক্রুতে কার্যগুলি যুক্ত করতে আপনার ডাব্লুপি ক্রোন প্রতি ঘন্টা ইভেন্ট ব্যবহার করেন।
  3. আপনি দ্বিতীয় ডাব্লুপি ক্রোন ক্রিয়াকলাপগুলি যুক্ত করুন যা প্রায়শই চলে এবং এটি একের পর এক সারিতে ক্রিয়াকলাপগুলি "খায়"। এই মুহুর্তে কেবলমাত্র একটি কাজ চালিত হয় তা নিশ্চিত করতে এই "খাওয়ার" টাস্কটি সেমফোর ব্যবহার করা উচিত।

ধন্যবাদ, তবে আমি দুঃখিত, আমি এর আগে কখনও ক্ষণস্থায়ী ব্যবহার করিনি ... তবে আমি কোডটি বোঝার চেষ্টা করছি। কেন আপনি ক্ষণস্থায়ী জন্য 5 মিনিট সেট করেছেন কারণ আপনি ব্যবহার করে ক্ষণস্থায়ী মোছা delete_transient()। তাহলে কি সেই সময়ের ব্যাপার? আমি বোঝাতে চাইছি আপনি যে সময়টি রেখেছিলেন set_transient, তা আমার কাজ শেষ হওয়ার পরে মুছে ফেলা হয় ... তবে কেন সময় আছে?
আমি

কারণ কিছু ত্রুটি হতে পারে। শেষ বুলেট পয়েন্ট একবার দেখুন।
ক্রিজিসিক দ্রাদ্দে

ধন্যবাদ, দুর্দান্ত ... কেবল একটি প্রশ্ন। আমি যেমন বুঝতে পেরেছি, আমি যদি my_task_function_semaphoreক্ষণস্থায়ী নাম হিসাবে ব্যবহার করি তবে আমার অবশ্যই অন্য সকল ক্রোন একই নাম ব্যবহার করতে হবে?
আমি

@ আইমথমস্টস্টুপিড পার্সন এটি আপনি কী অর্জন করতে চান তার উপর নির্ভর করে ... যদি একটি মুহুর্তে কেবলমাত্র একটি কাজ করা উচিত তবে হ্যাঁ - সমস্ত
টাস্কে সেম্যাফোরের

1
আমি জিয়ার কুইয়ের সরঞ্জামগুলির সাথে গিয়ারম্যানের মতো একই কাজ করেছি। এই বাস্তবায়ন সাহায্য করতে পারে: github.com/10up/WP-Minions
ফায়াজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.