2017-07-04 81 views
7

Çok garip bir problemle karşılaştım ve olası bir hatayı potansiyel olarak ortaya çıkaracak şekilde kaydedeceğimi düşündüm. Şimdilik kabul edilebilir bir çözümüm var.PHP özelliklerinin nesne özelliklerinde saklanmasıyla ilgili bilinen herhangi bir yan etkisi var mı?

Projem, uzak sunucuya SSH ve SFTP bağlantıları yapmak için phpseclib kullanan PHP tabanlı bir dağıtım aracıdır. Bununla SSH2 uzantısından daha fazla şansım oldu, bu yüzden şimdilik bununla uğraşmaya karar verdim. Dockerised Alpine 3.5 ortamında PHP 7.0.16 çalıştırıyorum. PHPUnit içinde gerçek (yerel) bir SSH sunucusuna bağlanan fonksiyonel testleri çalıştırdığımda problem yüzeyleri.

İletim için bir dosya hazırladığımda, geçici bir kopyasını oluşturma işleminden geçiyor, böylece dizeleri arama ve değiştirme işlemlerini kullanarak her durum için değişiklik yapabilirim. Test için bir şey daha az dinamik istiyorum, bu yüzden ben gibi bir tarih benzediğini tanımlamak için bir sınıf çapında kapatma eklemek düşündüm gerçi:

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'); }; 
    } 
} 

Yani burada bir fikir kapatma "gerçek" jeneratör, ve Test ortamlarında sadece statik bir şeyle değiştirebilirim. aslında hiç bir yere kullanılmaz

~ # ./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 

Not $this->dateGenerator o: bildirimler sürü -

Yani, burada sorunun tezahürüdür. Şimdi, burada tuhaflık olduğunu, boş bir kapatma ile değiştirin, ve ben tekrar bildirimleri almak:

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

Ancak, bu açıklama ise, uyarılar kaybolur.

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

Bu etrafında bir çok şey denedim ve ben sadece bir şey değişen am tamamen emin değilim. Sorunun ctorda kapaklar sakladığını merak ettim, bu yüzden bir sette boş kapağı enjekte etmeyi denedim ve uyarıları tekrar aldım.

Bir sınıf için kapatmayı değiştirdim ve sorun bir daha gider. Bu şekilde düzelteceğim, ancak bildirimler beni phpseclib kütüphanesi veya inşa ettiğim her şeyin istikrarı konusunda endişelendiriyor! Ben PHP, Docker, PHPUnit, phpseclib, ssh ve sshd kullanıyorum beri, bir sorun enjekte olabilir şeyler var çok takdir ediyorum.

phpseclib bilet listesinde, bu bildirim #1125 ve #985 numaralı belgelerde belirtilmiştir, ancak her ikisinin de burada gösterdiğim görünürde alakasız özellik yerine belirli bir nedeni olduğu görülmektedir.

Bunu nasıl araştıracağım hakkında bir fikrin var mı? Şu anda kapanışların farkında olmadığım bir yan etkiye sahip olduğunun teorisini yapıyorum. Hatta “kapalı” olması gerektiğinde, bir yıkıcıda kapanmayı boşa çıkarmaya çalıştım, ancak bu uyarıları durdurmadı. o onun fsock geçerli bir kaynak veya yok Bir EOF işaretleyici ulaştığında o istisna atar send_binary_packet(), geliyor gibi

+0

Kapanışlar hakkında bildiğim bir sorun, bazı libs/hacks kullanmadan seri/seri hale getirilememeleridir. Ama sonra atmak gerekir "Kapama 'Serileştirme' izin verilmez" hata –

+0

Evet, bu, keşfetmeye değer olabilirMichal - teşekkürler. Testler arasında kaynakların serileştirilmesiyle ilgili PHPUnit'te bazı seçenekler olduğunu biliyorum, bu yüzden denemeye değer bir şey olabilir. Bununla ilgili daha fazla problemim olmadı, bu yüzden biraz araştırma yapmak istediğim zaman beklemek zorundayım ':-)'. – halfer

cevap

1

phpseclib\Net\SSH2 hata satır numarasını aradıktan sonra, bana bakıyor.

Bu Base sınıfından devralınan herhangi bir nesnenin nerede kullanıldığına bakar ve onlarla ne yapıldığını görürüm. dateGenerator'unuz açık bir şekilde çağrılmayabilir, ancak yine de orada bir şey görmekten ve bir sebepten hoşlanmamaktan başka bir şey olabilir. Kendi bile olmayan bir kodu bile girebilir.:/

+0

Bu konudaki düşünceleriniz için teşekkür ederiz. Temmuz ayından beri problemin nüksetmemesi (ve hala aynı kod tabanında çalışıyorum). Kapatmayı tekrar eklediğimi sanırdım, geri gelirdi, ama yine de düzeltmeyi tercih ederim. DateGenerator'ın (yanlışlıkla) nasıl kullanılabileceği hakkında sahip olduğum en iyi fikir, testler arasında PHPUnit tarafından otomatik olarak yapılan bir serileştirme/desantizasyon işlemidir. – halfer