2017-07-04 17 views
7

मुझे एक बहुत ही अजीब समस्या का सामना करना पड़ा है, और मैंने सोचा कि मैं इसे रिकॉर्ड करूंगा ताकि संभावित बग को संभावित रूप से उजागर किया जा सके। मेरे पास अब के लिए एक स्वीकार्य कामकाज है।क्या ऑब्जेक्ट गुणों में PHP बंद करने के साथ कोई ज्ञात दुष्प्रभाव हैं?

मेरा प्रोजेक्ट एक PHP- आधारित परिनियोजन उपकरण है जो किसी दूरस्थ सर्वर पर SSH और SFTP कनेक्शन बनाने के लिए phpseclib का उपयोग करता है। एसएसएच 2 एक्सटेंशन की तुलना में मुझे इसके साथ अधिक भाग्य मिला है, इसलिए मैंने अभी इसके साथ चिपकने का फैसला किया है। मैं एक डॉकरीज्ड अल्पाइन 3.5 पर्यावरण के अंदर PHP 7.0.16 चला रहा हूं। समस्या तब होती है जब मैं PHPUnit के अंदर कार्यात्मक परीक्षण चला रहा हूं जो वास्तविक (स्थानीय) SSH सर्वर से कनेक्ट होता है।

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

abstract class Base 
{ 
    // (other properties here) 
    protected $dateGenerator; 

    public function __construct(QueueState $queueState, BaseFetcher $fetcher) 
    { 
     $this->queueState = $queueState; 
     $this->fetcher = $fetcher; 

     // Sets a default date generator 
     $this->dateGenerator = function() { return date('r'); }; 
    } 
} 

तो विचार यहाँ बंद "असली" जनरेटर है, और मैं इसे केवल कुछ स्थिर के साथ परीक्षण वातावरण में बदल सकता हूं।

~ # ./phpunit test/functional/tests/Sftp --stop-on-error 
PHPUnit 6.2.2 by Sebastian Bergmann and contributors. 

...........              11/11 (100%) 

Time: 7.56 seconds, Memory: 6.00MB 

OK (11 tests, 17 assertions) 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 
PHP Notice: Connection closed prematurely in /root/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php on line 3599 

ध्यान दें कि $this->dateGenerator है वास्तव में कहीं भी इस्तेमाल नहीं: नोटिस के बहुत सारे -

तो, यहाँ समस्या की अभिव्यक्ति है। अब, यहाँ विषमता है, मैं इसे एक खाली बंद के साथ की जगह ले सकता है, और मैं नोटिस फिर से मिलता है:

$this->dateGenerator = function() {}; 

हालांकि, अगर मुझे लगता है कि बाहर टिप्पणी, नोटिस गायब हो जाते हैं।

#$this->dateGenerator = function() {}; 

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

मैंने कक्षा के लिए बंद कर दिया है, और समस्या फिर से चली गई है। इस तरह मैं इसे ठीक कर दूंगा, लेकिन नोटिस की समस्या मुझे phpseclib लाइब्रेरी के बारे में परेशान करती है, या वास्तव में जो कुछ भी मैं बना रहा हूं उसकी स्थिरता! मैं सराहना करता हूं कि चूंकि मैं PHP, डॉकर, PHPUnit, phpseclib, ssh और sshd का उपयोग कर रहा हूं, ऐसी कई चीजें हैं जो किसी समस्या को इंजेक्ट कर सकती हैं।

phpseclib टिकट सूची पर, इस नोटिस का उल्लेख #1125 और #985 में किया गया है, लेकिन स्पष्ट रूप से असंबंधित संपत्ति के बजाय दोनों का एक विशिष्ट कारण है, जो मैं यहां प्रदर्शित कर रहा हूं।

इस पर कोई विचार है कि मैं इसका शोध कैसे कर सकता हूं? वर्तमान में मैं थोरिज़िंग कर रहा हूं कि बंद होने का दुष्प्रभाव होता है जिसे मुझे पता नहीं है। मैंने इसे "बंद" होने की आवश्यकता होने पर, एक विनाशक में बंद करने की भी कोशिश की, लेकिन इसने नोटिस को नहीं रोका।

+0

क्लोजर के बारे में मुझे पता है कि एक समस्या यह है कि उन्हें कुछ libs/हैक्स का उपयोग किए बिना धारावाहिक/deserialized नहीं किया जा सकता है। लेकिन फिर इसे "क्लोजर 'के सीरियलाइजेशन की अनुमति नहीं दी जानी चाहिए" त्रुटि –

+0

हाँ, यह खोज के लायक हो सकता है, @Michal - धन्यवाद। मुझे पता है कि PHPUnit में परीक्षणों के बीच संसाधनों के क्रमिकरण के बारे में कुछ विकल्प हैं, ताकि यह मेरी कोशिश के लायक हो। मुझे इससे संबंधित कोई और समस्या नहीं है, इसलिए इसे एक समय इंतजार करना होगा जब मैं कुछ आराम से शोध करने में सक्षम हूं ':-) '। – halfer

उत्तर

1

phpseclib\Net\SSH2 में त्रुटि के लाइन नंबर देखने के बाद, यह ऐसा लगता है जैसे send_binary_packet() है, जो कि अपवाद फेंकता है जब इसकी fsock या तो एक वैध संसाधन नहीं है या एक EOF मार्कर तक पहुँच गया है से आ रहा है मेरे लिए लग रहा है।

मैं देखता हूं कि इस ऑब्जेक्ट का उपयोग किस प्रकार किया जाता है जो इस Base कक्षा से प्राप्त होता है, और देखें कि उनके साथ क्या किया जाता है। आपके dateGenerator को स्पष्ट रूप से नहीं कहा जा सकता है, लेकिन वहां कुछ भी हो सकता है और इसे किसी कारण से पसंद नहीं किया जा सकता है। शायद कोड के माध्यम से खोदना भी हो सकता है जो आपका नहीं है।:/

+0

इस पर आपके विचारों के लिए धन्यवाद। जुलाई से समस्या का पुनरावृत्ति नहीं हुआ है (और अभी भी एक ही कोडबेस पर काम कर रहा है)। मुझे संदेह है कि अगर मैंने फिर से बंद किया तो यह वापस आ जाएगा, लेकिन मैं वैसे भी अपना फिक्स पसंद करता हूं। मेरे बारे में सबसे अच्छा विचार था कि 'डेट जेनरेटर' का उपयोग कैसे किया जा सकता है (गलती से) परीक्षणों के बीच PHPUnit द्वारा स्वचालित रूप से किया गया एक क्रमिकरण/deserialisation है। – halfer

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