मुझे एक बहुत ही अजीब समस्या का सामना करना पड़ा है, और मैंने सोचा कि मैं इसे रिकॉर्ड करूंगा ताकि संभावित बग को संभावित रूप से उजागर किया जा सके। मेरे पास अब के लिए एक स्वीकार्य कामकाज है।क्या ऑब्जेक्ट गुणों में 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 में किया गया है, लेकिन स्पष्ट रूप से असंबंधित संपत्ति के बजाय दोनों का एक विशिष्ट कारण है, जो मैं यहां प्रदर्शित कर रहा हूं।
इस पर कोई विचार है कि मैं इसका शोध कैसे कर सकता हूं? वर्तमान में मैं थोरिज़िंग कर रहा हूं कि बंद होने का दुष्प्रभाव होता है जिसे मुझे पता नहीं है। मैंने इसे "बंद" होने की आवश्यकता होने पर, एक विनाशक में बंद करने की भी कोशिश की, लेकिन इसने नोटिस को नहीं रोका।
क्लोजर के बारे में मुझे पता है कि एक समस्या यह है कि उन्हें कुछ libs/हैक्स का उपयोग किए बिना धारावाहिक/deserialized नहीं किया जा सकता है। लेकिन फिर इसे "क्लोजर 'के सीरियलाइजेशन की अनुमति नहीं दी जानी चाहिए" त्रुटि –
हाँ, यह खोज के लायक हो सकता है, @Michal - धन्यवाद। मुझे पता है कि PHPUnit में परीक्षणों के बीच संसाधनों के क्रमिकरण के बारे में कुछ विकल्प हैं, ताकि यह मेरी कोशिश के लायक हो। मुझे इससे संबंधित कोई और समस्या नहीं है, इसलिए इसे एक समय इंतजार करना होगा जब मैं कुछ आराम से शोध करने में सक्षम हूं ':-) '। – halfer