redis

2016-12-21 21 views
10

से पढ़ने के वास्तविक समय नहीं कर सकते मैं एक सर्वर लंबे समय के आवेदन चल रहा है जो इस तरह की दुकान की प्रक्रिया:redis

routes.php टुकड़ा की

Route::post('cloud/slice/{modelfileid}', '[email protected]'); 
Route::get('cloud/slice/sliceProgress', '[email protected]'); 

हिस्सा() फ़ंक्शन:

while($s = fgets($pipes[2])) 
{ 
    if(strpos($s, "Progress:") !== FALSE) 
    { 
     Log::info(100 * substr($s, -10, 4) . '%'); 
     $this->redis->SET('sliceProgress' . $uid, 100 * substr($s, -10, 4) . '%'); 

    } 
} 

और मेरे ग्राहक प्रत्येक 0.5 सेकंड के साथ रेडिस में प्रगति का अनुरोध करते हैं:

public function sliceProgress() 
{ 
    if (!isset($_SESSION["uid"])) 
     return Redirect::to('cloud'); 
    $uid = $_SESSION["uid"]; 
    return Response::json(array('status' => 'success', 'data' => array('progress' => $this->redis->GET('sliceProgress' . $uid)))); 
} 

और

$interval(function() 
{ 
    $scope.refreshProgress(); 
}, 500); 

लेकिन ग्राहक प्रगति अनुरोध प्राप्त प्रगति कि 100% से कम के बिना 100% के साथ समाप्त करने के लिए जब तक आयोजित करेगा। यह कहना है कि सर्वर स्लाइस एप्लिकेशन समाप्त होने पर मुझे प्रगति प्रतिक्रिया मिलती है। मुझे लगता है कि टुकड़ा प्रसंस्करण करते समय लार्वेल दूसरे अनुरोध को संसाधित नहीं करता है।


संपादित: मैं नीचे दिए गए कोड का उपयोग टुकड़ा() redis- बाद में redis पाने के लिए> सेट में अच्छी तरह से, यह उत्पादन sliceProgress वास्तविक समय काम करता है।

Log::info($this->redis->GET('sliceProgress' . $uid));

+0

पूरी तरह से अपने प्रश्न को समझ में नहीं आता है। पुनः प्रयास करें? –

+0

@ सोमोन विशेष अब इसे जांचें। –

+0

@KrisRoofe आपका प्रश्न क्या है? –

उत्तर

2

कोशिश async कतारों या crons

while($s = fgets($pipes[2])) 
{ 
if(strpos($s, "Progress:") !== FALSE) 
{ 
    Log::info(100 * substr($s, -10, 4) . '%'); 
    $this->redis->SET('sliceProgress' . $uid, 100 * substr($s, -10, 4) . '%'); 

} 
} 
+0

कुछ समझाया जा सकता है कि कुछ मददगार हो। Thansk सब वही। –

+0

इस पैकेज का उपयोग कर लार्वेल कमांड, या एसिंक कतारों का उपयोग करके कमांड बनाने का प्रयास करें https://github.com/barryvdh/laravel-async-queue –

+0

मुझे लगता है कि आप सही हैं, आप सुझाव एक अच्छा कार्यान्वयन है। लेकिन मैं यह भी जानना चाहता हूं कि दूसरा अनुरोध कब तक पूरा हो जाएगा। –

2

मेरा मानना ​​है कि समस्या सत्र बंद हो सकता है की तरह एक पृष्ठभूमि प्रक्रिया में इस कोड को चलाने के लिए। एकाधिक जीईटी कॉल के बाद आपको POST अनुरोध निकाल दिया गया है। अब यदि सत्र लॉक है, तो कोई भी अनुरोध PHP को तब तक संभाला नहीं जाएगा जब तक कि पहले कोई नहीं किया जाता।

सत्र लॉक कैसे काम करता है?
अच्छी तरह से PHP बस सत्र फ़ाइल को पढ़ने के लिए लॉक करता है, इसलिए अन्य सभी अपाचे प्रक्रियाओं को प्रतीक्षा करना पड़ता है। लैरावेल फ़ाइल आधारित सत्र प्रबंधन का भी उपयोग करते हैं।

अब सत्र लॉक को हटाने का कोई अच्छा विचार नहीं है, हालांकि आप ऐसा कर सकते हैं। विभिन्न होस्ट या पोर्ट से यह सेवा प्राप्त करने का प्रयास करें।

मुझे 100% यकीन नहीं है कि लार्वेल सत्र लॉक कैसे संभालता है, इसलिए यह समस्या है या नहीं, तो बस क्रॉस करें।

निकाला जा रहा है सत्र लॉक:
पहले रास्ता: उपयोग विधि एक बार आप सत्र से निपटने session_write_close के साथ किया।
दूसरा: read_and_close दर्रा session_start

सुनिश्चित नहीं हूं कि laravel ऐसा करने की अनुमति देता है के साथ सत्र प्रारंभ करते समय सच किया जाना है। रीयलटाइम प्रगति सिंक करने के अन्य तरीके हैं।

+0

लिखता है लॉक लिखता है, मुझे पता है कि क्यों पढ़ा जाएगा। –

+0

सत्र लॉक के लिए मुझे डुबकी खुदाई कहां मिल सकती है। –

+0

आप अपडेट किए गए उत्तर की जांच कर सकते हैं, लेकिन फिर भी सावधान रहें। – anwerj