2008-09-23 4 views
6

प्रसंस्करण जारी रखें मान लीजिए कि दो स्क्रिप्ट Requester.php और Provider.php हैं, और अनुरोधकर्ता को प्रदाता से प्रोसेसिंग की आवश्यकता है और इसे http अनुरोध (Provider.php? Data = " डेटा")। इस स्थिति में, प्रदाता को तुरंत उत्तर मिल जाता है, लेकिन सिस्टम को बनाए रखने के लिए पूरे डेटाबेस में विभिन्न अपडेट करना चाहिए। क्या तुरंत अनुरोधकर्ता को मूल्य वापस करने का कोई तरीका है, और फिर प्रदाता में प्रसंस्करण जारी रखें।PHP: एक प्रतीक्षा स्क्रिप्ट में जानकारी कैसे लौटाएं और

छद्म कोड

Provider.php 
{ 
    $answer = getAnswer($_GET['data']); 
    echo $answer; 
    //SIGNAL TO REQUESTER THAT WE ARE FINISHED 
    processDBUpdates(); 
    return; 
} 

उत्तर

1

आप मूल रूप से 1 प्रक्रिया के अंत (मूल Requester.php पर वापस) सिग्नल करना चाहते हैं और एक नई प्रक्रिया (Provider.php खत्म करें) को समाप्त करना चाहते हैं। इसे खींचने के लिए शायद एक और शानदार तरीका है, लेकिन मैंने इसे दो अलग-अलग तरीकों से प्रबंधित किया है। दूसरी प्रक्रिया को खोलने के लिए उनमें से सभी मूल रूप से कमांड को निष्पादित करते हैं।

अपने आदेश के अंत में निम्नलिखित > /dev/null 2>&1 & जोड़ने

निम्नलिखित की तरह कुछ आप के लिए काम कर सकते हैं यह आपके वर्तमान स्क्रिप्ट के वास्तविक क्रियान्वयन में बाधा के बिना पृष्ठभूमि में चलाने के लिए अनुमति देगा:

exec("wget -O - \"$url\" > /dev/null 2>&1 &"); 

- हालांकि आप इसे कमांड लाइन PHP प्रक्रिया के रूप में भी कर सकते हैं।

आप उस जानकारी को भी सहेज सकते हैं जिसे संसाधित करने की आवश्यकता है और एक क्रॉन नौकरी पर शेष प्रसंस्करण को संभालने की आवश्यकता है जो निष्पादन की आवश्यकता के बिना समान प्रकार की कार्यक्षमता को फिर से बनाता है।

2

आप फ्लश() कमांड के साथ उत्पादन बफर फ्लश कर सकते हैं।
दो में

0

स्प्लिट प्रदाता अधिक जानकारी के लिए PHP manual टिप्पणी पढ़ें: ProviderCore और ProviderInterfaceProviderInterface में बस "त्वरित और आसान" भाग करें, डेटाबेस में एक ध्वज भी सहेजें जो हालिया अनुरोध को अभी तक संसाधित नहीं किया गया है। एक क्रॉन नौकरी के रूप में ProviderCore चलाएं जो उस ध्वज की खोज करता है और प्रसंस्करण को पूरा करता है। यदि ऐसा करने के लिए कुछ भी नहीं है, तो ProviderCore समाप्त हो जाएगा और कहें (कहें) 2 मिनट।

1

मुझे लगता है कि आपको डेटा भेजने के लिए प्रदाता पर आवश्यकता होगी (फिर फ्लश करना सुनिश्चित करें), और उसके बाद अनुरोधकर्ता पर, अपेक्षित मात्रा में डेटा पढ़ने के लिए fopen/fread का उपयोग करें, ताकि आप कनेक्शन को ड्रॉप कर सकें प्रदाता और जारी रखें। यदि आप उम्मीद करने के लिए डेटा की मात्रा निर्दिष्ट नहीं करते हैं, तो मुझे लगता है कि अनुरोधकर्ता प्रदाता को कनेक्शन बंद करने की प्रतीक्षा कर रहा है, जो शायद इसके चलने के अंत तक नहीं होता है (यानी सभी माध्यमिक कार्य गहन कार्य पूरा हो गए हैं)। आपको कुछ पीओसी की कोशिश करनी होगी ..

शुभकामनाएं।

2

मैं पृष्ठभूमि में एक प्रक्रिया चलाने के लिए this code का उपयोग करता हूं (लिनक्स पर काम करता है)।

प्रक्रिया अपने आउटपुट के साथ एक फ़ाइल पर रीडायरेक्ट की जाती है।

इस तरह, अगर मुझे प्रक्रिया पर स्थिति प्रदर्शित करने की आवश्यकता है, तो यह आउटपुट फ़ाइल की सामग्री को पढ़ने और प्रदर्शित करने के लिए कोड की एक छोटी राशि लिखने की बात है।

मुझे यह दृष्टिकोण पसंद है क्योंकि इसका मतलब है कि आप ब्राउज़र को पूरी तरह बंद कर सकते हैं और स्थिति को जांचने के लिए बाद में आसानी से वापस आ सकते हैं।

0

मैं यहाँ एक अंग पर बाहर जा रहा हूँ, लेकिन शायद आप cURL कोशिश या निवेदक अद्यतन करने के लिए एक सॉकेट इस्तेमाल करना चाहिए?

0

आप pcntl_fork()

Provider.php 
{ 
    // Fork process 
    $pid = pcntl_fork(); 

    // You are now running both a daemon process and the parent process 
    // through the rest of the code below 

    if ($pid > 0) { 
     // PARENT Process 
     $answer = getAnswer($_GET['data']); 
     echo $answer;  
     //SIGNAL TO REQUESTER THAT WE ARE FINISHED 
     return; 
    } 

    if ($pid == 0) { 
     // DAEMON Process 
     processDBUpdates(); 
     return; 
    } 

    // If you get here the daemon process failed to start 
    handleDaemonErrorCondition(); 
    return; 

} 
का उपयोग कर Provider.php में एक और php प्रक्रिया शुरू कर सकता है
संबंधित मुद्दे