2012-06-15 2 views
12

मैंने इस पोस्ट को वर्डप्रेस के रूप में टैग किया है, लेकिन मुझे पूरा यकीन नहीं है कि यह वर्डप्रेस-विशिष्ट है, इसलिए मैं इसे WPSE के बजाय स्टैक ओवरव्लो पर पोस्ट कर रहा हूं। समाधान वर्डप्रेस-विशिष्ट होना आवश्यक नहीं है, बस PHPकुछ पदों के लिए एक कुशल सामग्री फ़िल्टर बनाने के बारे में मैं कैसे जा सकता हूं?

परिदृश्य
मैं उष्णकटिबंधीय मछली Species Profiles और Glossary प्रविष्टियों की संख्या के साथ एक fishkeeping website चलाते हैं।

हमारी वेबसाइट हमारी प्रोफाइल के आसपास उन्मुख है। वे हैं, जैसा कि आप इसे कह सकते हैं, वेबसाइट की रोटी और मक्खन।

जो मैं प्राप्त करने की उम्मीद कर रहा हूं वह यह है कि, प्रत्येक प्रजाति प्रोफ़ाइल में जो अन्य प्रजातियों या शब्दावली प्रविष्टि का उल्लेख करती है, मैं उन शब्दों को एक लिंक के साथ बदल सकता हूं - जैसे कि आप here देखेंगे। आदर्श रूप से, मैं यह भी समाचार, लेख और ब्लॉग पोस्ट में भी होना चाहूंगा।

हमारे पास लगभग 1400 species profiles और 1700 glossary entries है। हमारी प्रजाति प्रोफाइल अक्सर लंबी होती हैं और अंत में हमारी प्रजातियों की प्रोफाइल अकेले numbered more than 1.7 million words जानकारी होती है। मेरा मानना ​​है कि - - क्या करना है मैं इसे जरूरत है

क्या मैं वर्तमान में वर्तमान में
का प्रयास कर रहा हूँ, मैं एक समारोह है कि के साथ एक filter.php है। कोड काफी लंबा है, और पूर्ण here में पाया जा सकता है।

इसके अलावा, मेरे वर्डप्रेस विषय के functions.php, मैं निम्नलिखित है:

# ============================================================================================== 
# [Filter] 
# 
# Every hour, using WP_Cron, `my_updated_posts` is checked. If there are new Post IDs in there, 
# it will run a filter on all of the post's content. The filter will search for Glossary terms 
# and scientific species names. If found, it will replace those names with links including a 
# pop-up. 

    include "filter.php"; 

# ============================================================================================== 
# When saving a post (new or edited), check to make sure it isn't a revision then add its ID 
# to `my_updated_posts`. 

    add_action('save_post', 'my_set_content_filter'); 
    function my_set_content_filter($post_id) { 
     if (!wp_is_post_revision($post_id)) { 

      $post_type = get_post_type($post_id); 

      if ($post_type == "species" || ($post_type == "post" && in_category("articles", $post_id)) || ($post_type == "post" && in_category("blogs", $post_id))) { 
       //get the previous value 
       $ids = get_option('my_updated_posts'); 

       //add new value if necessary 
       if(!in_array($post_id, $ids)) { 
        $ids[] = $post_id; 
        update_option('my_updated_posts', $ids); 
       } 
      } 
     } 
    } 

# ============================================================================================== 
# Add the filter to WP_Cron. 

    add_action('my_filter_posts_content', 'my_filter_content'); 
    if(!wp_next_scheduled('my_filter_posts_content')) { 
     wp_schedule_event(time(), 'hourly', 'my_filter_posts_content'); 
    } 

# ============================================================================================== 
# Run the filter. 

    function my_filter_content() { 
     //check to see if posts need to be parsed 
     if (!get_option('my_updated_posts')) 
      return false; 

     //parse posts 
     $ids = get_option('my_updated_posts'); 

     update_option('error_check', $ids); 

     foreach($ids as $v) { 
      if (get_post_status($v) == 'publish') 
       run_filter($v); 

      update_option('error_check', "filter has run at least once"); 
     } 

     //make sure no values have been added while loop was running 
     $id_recheck = get_option('my_updated_posts'); 
     my_close_out_filter($ids, $id_recheck); 

     //once all options, including any added during the running of what could be a long cronjob are done, remove the value and close out 
     delete_option('my_updated_posts'); 
     update_option('error_check', 'working m8'); 
     return true; 
    } 

# ============================================================================================== 
# A "difference" function to make sure no new posts have been added to `my_updated_posts` whilst 
# the potentially time-consuming filter was running. 

    function my_close_out_filter($beginning_array, $end_array) { 
     $diff = array_diff($beginning_array, $end_array); 
     if(!empty ($diff)) { 
      foreach($diff as $v) { 
       run_filter($v); 
      } 
     } 
     my_close_out_filter($end_array, get_option('my_updated_posts')); 
    } 

तरीका यह के रूप में (उम्मीद) कोड की टिप्पणी द्वारा वर्णित काम करता है, यह है, प्रत्येक घंटे वर्डप्रेस एक क्रॉन जॉब (संचालित है कि जो एक झूठी क्रॉन की तरह है - उपयोगकर्ता हिट पर काम करता है, लेकिन यह वास्तव में कोई फर्क नहीं पड़ता क्योंकि समय महत्वपूर्ण नहीं है) जो उपरोक्त फ़िल्टर चलाता है।

एक घंटे के आधार पर इसे चलाने के पीछे तर्क यह था कि अगर हम प्रत्येक पोस्ट को सहेजते समय इसे चलाने की कोशिश करते हैं, तो यह लेखक की हानि होगी। एक बार जब हम अतिथि लेखकों को शामिल कर लेते हैं, तो यह स्पष्ट रूप से इसके बारे में जाने का एक स्वीकार्य तरीका नहीं है।

समस्या ...
महीने अब मैं समस्याओं इस फिल्टर मज़बूती से चल रही किया गया है के लिए। मुझे विश्वास नहीं है कि समस्या फ़िल्टर के साथ ही है, लेकिन फिल्टर में सक्षम कार्यों में से एक - यानी क्रॉन नौकरी, या जो फ़ंक्शन चुनता है उसे कौन से पोस्ट फ़िल्टर किए जाते हैं, या फ़ंक्शन जो शब्दसूची तैयार करता है आदि के लिए फ़िल्टर

दुर्भाग्यवश, समस्या का निदान करना मुश्किल है (जो मैं देख सकता हूं), पृष्ठभूमि में चलने और केवल एक घंटे के आधार पर धन्यवाद। मैं त्रुटि-जांच के लिए वर्डप्रेस 'update_option फ़ंक्शन (जो मूल रूप से एक साधारण डेटाबेस मान लिखता है) का उपयोग करने का प्रयास कर रहा हूं, लेकिन मुझे बहुत भाग्य नहीं मिला है - और ईमानदार होने के लिए, मैं काफी उलझन में हूं कि समस्या कहां है ।

हमने वेबसाइट को इस फ़िल्टर के बिना सही तरीके से काम करने के लिए समाप्त कर दिया। कभी-कभी ऐसा लगता है कि काम करता है, कभी-कभी ऐसा नहीं होता है। नतीजतन, अब हमारे पास कुछ प्रजाति प्रोफाइल हैं जो सही ढंग से फ़िल्टर नहीं किए गए हैं।

मुझे क्या पसंद आएगा ...
मैं मूल रूप से इस फ़िल्टर को चलाने के बारे में जाने के सर्वोत्तम तरीके पर सलाह ले रहा हूं।

क्या एक क्रोन नौकरी का जवाब है? मैं .php फ़ाइल सेट कर सकता हूं जो हर दिन चलता है, जो कोई समस्या नहीं होगी। यह निर्धारित कैसे करेगा कि किन पदों को फ़िल्टर करने की आवश्यकता है? उस समय सर्वर पर इसका क्या असर होगा?

वैकल्पिक रूप से, एक WordPress व्यवस्थापक पृष्ठ उत्तर है? अगर मुझे पता था कि यह कैसे करना है, पेज की लाइनों के साथ कुछ - AJAX का उपयोग - जिसने मुझे फ़िल्टर चलाने के लिए पदों का चयन करने की अनुमति दी, वह सही होगा। AJAX Regenerate Thumbnails नामक एक प्लगइन है जो इस तरह काम करता है, शायद यह सबसे प्रभावी होगा?

विचार

  • डेटाबेस/जानकारी के आकार को प्रभावित किये/पढ़ने/लिखा
  • कौन सा पदों
  • प्रभाव फिल्टर सर्वर पर है फ़िल्टर्ड रहे हैं; विशेष रूप से मुझे लगता है कि मैं पिछले 32 एमबी वर्डप्रेस मेमोरी सीमा को बढ़ाने में सक्षम नहीं हूं।
  • क्या वास्तविक फ़िल्टर स्वयं कुशल, प्रभावी और विश्वसनीय है?

यह काफी जटिल प्रश्न है और मैं निश्चित रूप से है कुछ विवरण बाहर छोड़ दिया (के रूप में मैं इस प्रक्रिया में उनके सहयोगियों द्वारा मोटे तौर पर 18 बार विचलित हो गया था)। अधिक जानकारी के लिए कृपया मुझे जांचने में संकोच न करें।

अग्रिम धन्यवाद,

+0

क्या आपके पास ऑफ़साइट से आपके SQL डेटाबेस तक पहुंच है? यदि आप अपने सर्वर पर चल रहे क्रॉन के बारे में चिंतित हैं, तो आप प्रारंभिक स्क्रिप्ट रन कर सकते हैं जो आपके डीबी से जुड़े PHP सीएलआई स्क्रिप्ट चलाने वाले कंप्यूटर से आपके 1.5 मिलियन शब्दों को संसाधित करता है। –

+0

थोड़ा असंबद्ध: आपकी साइट के चारों ओर पोकिंग करते समय मैंने देखा कि आपकी यूआरएल संरचना अच्छी तरह से लिखी गई है। हालांकि, मैं मदद नहीं कर सकता लेकिन ध्यान देता हूं कि ऑर्डर या परिवार के बावजूद वर्गीकरण लिंक सभी '/ वर्गीकरण /% s' रूप में हैं। क्या यह जानबूझकर है? ऐसा लगता है कि 'वर्गीकरण/परिवार /% s' और'/वर्गीकरण/आदेश /% s' कम संदिग्ध होगा। –

+0

वहां phpMyCoder के सिर-अप के लिए धन्यवाद, मैं इसे अपने (हमेशा बढ़ती हुई!) सूची में जोड़ दूंगा :) मैं वर्तमान में हमारे MySQL डेटाबेस से रिमोट कनेक्शन की अनुमति नहीं देता लेकिन मैं अस्थायी रूप से इसे अनुमति दे सकता हूं और फिर स्क्रिप्ट को चला सकता हूं वैंप स्थापना। यदि डेटाबेस लगातार समय के लिए लिखा जा रहा है तो क्या इसका वेबसाइट पर अधिक असर होगा? – dunc

उत्तर

5

प्रोफ़ाइल बनाते समय इसे करें।

पूरी प्रक्रिया को उलटाने का प्रयास करें। शब्दों के लिए सामग्री की जांच करने के बजाय, सामग्री के शब्दों के लिए शब्दों की जांच करें।

    शब्द में प्रवेश पर सामग्री पोस्ट तोड़
  1. (अंतरिक्ष पर)
  2. हटा दें डुप्लिकेट, डेटाबेस में एक शब्द की सबसे छोटी आकार के तहत लोगों को एक 'आम शब्दों' में सबसे बड़ा आकार से अधिक लोगों को, और लोगों को सूची जो आप रखती है।
  3. प्रत्येक तालिका के खिलाफ जांचें, यदि आपकी कुछ तालिकाओं में रिक्त स्थान के साथ वाक्यांश शामिल हैं, तो% टेक्स्ट% खोज करें, अन्यथा सीधे मिलान करें (बहुत तेज़) या यहां तक ​​कि एक हैश तालिका बनाएं यदि यह वास्तव में बड़ी समस्या है। (मैं इसे एक PHP सरणी के रूप में करूँगा और परिणाम को कैश कर सकता हूं, पहिया को फिर से शुरू करने का कोई मतलब नहीं)
  4. नाटकीय रूप से छोटी सूचियों के साथ अपने लिंक बनाएं।

आप इसे आसानी से 1 सेकंड के नीचे रखने में सक्षम होना चाहिए, भले ही आप 100,000 शब्दों के बारे में पूछ रहे हों। मैंने पहले बेयसियन फ़िल्टर के लिए शब्द सूचियों को कैश किए बिना बिल्कुल किया है।

छोटी सूची के साथ, भले ही यह लालची हो और "जोकर" से मेल न खाने वाले शब्दों को इकट्ठा किया जाए, "जोकर" को पकड़ लेंगे, जिसके परिणामस्वरूप छोटी सूची लिंक के साथ कुछ दर्जन शब्दों में केवल कुछ ही होनी चाहिए। पाठ खोजने के एक हिस्से को खोजने और बदलने के लिए कोई समय नहीं लगेगा।

उपर्युक्त पुरानी प्रोफाइल पर आपकी चिंता को वास्तव में संबोधित नहीं करता है।आप बिल्कुल नहीं कहते कि कितने हैं, बस इतना है कि बहुत सारे टेक्स्ट हैं और यह 1400 से 3100 (दोनों आइटम) एक साथ रखे गए हैं। यदि आपके पास जानकारी है तो यह पुरानी सामग्री लोकप्रियता के आधार पर कर सकती है। या तिथि पर, सबसे पहले दर्ज किया गया। ऐसा करने का सबसे अच्छा तरीका यह है कि एक स्क्रिप्ट लिखना जो PHP पर समय सीमा को निलंबित करता है और केवल सभी पदों पर एक लोड/प्रक्रिया/सहेजता है। यदि प्रत्येक व्यक्ति को लगभग 1 सेकंड (शायद बहुत कम लेकिन सबसे खराब मामला) लगता है तो आप 3100 सेकेंड की बात कर रहे हैं जो एक घंटे से थोड़ा कम है।

+0

ग्रेट पोस्ट, +1। मैं आज सुबह आपके समाधान को लागू करने का प्रयास कर रहा हूं लेकिन एक समस्या का सामना करना पड़ा जिस पर मुझे संदेह है कि चीजें धीमा हो सकती हैं। कुछ शर्तों के लिए जो मैं खोज रहा हूं उनमें शामिल हैं 'पी। denisonii' और 'एस डेमन '- संक्षिप्त प्रजाति के नाम। इस प्रकार, '' विस्फोट '' '' '' 'काम नहीं करेगा। क्या आप एक विकल्प की सिफारिश कर सकते हैं? मैं कल्पना नहीं कर सकता कि सभी खोज शब्दों के लिए प्रत्येक फ़ील्ड (यानी 'वितरण',' habitat') खोजना कुशल होगा? – dunc

+0

यदि डेटाबेस में कोई संक्षिप्त रूप नहीं है, तो मुझे नहीं पता कि आप संक्षिप्त संस्करणों का पता लगाने में सक्षम होंगे। अर्थात्, यदि डेटाबेस में आपके पास "क्लाउन लोच" है लेकिन टेक्स्ट में आपके पास "सी लोच" है, तो मुझे उस कुशलता से निपटने का कोई तरीका नहीं दिखता है जब तक कि आपके पास डेटाबेस (प्रजातियों के लिए) में कोई फ़ील्ड न हो लघु नाम संस्करण। लेकिन अगर आप चिंतित हैं क्योंकि "सी" समस्याग्रस्त प्रतीत होता है, याद रखें कि आप लंबाई सीमा के नीचे शब्दों को फेंक रहे हैं, और एक LIKE खोज में "% Loach%" "क्लाउन लोच" से मेल खाएगा जो छोटे क्षेत्र में "सी लोच" हो सकता है, इस प्रकार आप अपना प्राप्त करेंगे मैच। – DampeS8N

+0

हम्म, तब सोच रहा हूं कि मुझे ड्राइंग बोर्ड पर वापस जाना होगा। मछली की प्रजातियां सभी प्रारूपों में से एक लेती हैं: 'शैतानोपर्का डेमन' या एस। डेमन', जो - अगर मैं आपको सही तरीके से व्याख्या कर रहा हूं - आपके विचार को कुशलतापूर्वक चलाने के लिए मुश्किल/असंभव होगा? – dunc

संबंधित मुद्दे

 संबंधित मुद्दे