Преглед изворни кода

Only close handles that have been opened by the StreamHandler, fixes #764

Jordi Boggiano пре 9 година
родитељ
комит
a7ade9d68f
2 измењених фајлова са 18 додато и 2 уклоњено
  1. 1 1
      src/Monolog/Handler/StreamHandler.php
  2. 17 1
      tests/Monolog/Handler/StreamHandlerTest.php

+ 1 - 1
src/Monolog/Handler/StreamHandler.php

@@ -59,7 +59,7 @@ class StreamHandler extends AbstractProcessingHandler
      */
      */
     public function close()
     public function close()
     {
     {
-        if (is_resource($this->stream)) {
+        if ($this->url && is_resource($this->stream)) {
             fclose($this->stream);
             fclose($this->stream);
         }
         }
         $this->stream = null;
         $this->stream = null;

+ 17 - 1
tests/Monolog/Handler/StreamHandlerTest.php

@@ -35,10 +35,26 @@ class StreamHandlerTest extends TestCase
     /**
     /**
      * @covers Monolog\Handler\StreamHandler::close
      * @covers Monolog\Handler\StreamHandler::close
      */
      */
-    public function testClose()
+    public function testCloseKeepsExternalHandlersOpen()
     {
     {
         $handle = fopen('php://memory', 'a+');
         $handle = fopen('php://memory', 'a+');
         $handler = new StreamHandler($handle);
         $handler = new StreamHandler($handle);
+        $this->assertTrue(is_resource($handle));
+        $handler->close();
+        $this->assertTrue(is_resource($handle));
+    }
+
+    /**
+     * @covers Monolog\Handler\StreamHandler::close
+     */
+    public function testClose()
+    {
+        $handler = new StreamHandler('php://memory');
+        $handler->handle($this->getRecord(Logger::WARNING, 'test'));
+        $streamProp = new \ReflectionProperty('Monolog\Handler\StreamHandler', 'stream');
+        $streamProp->setAccessible(true);
+        $handle = $streamProp->getValue($handler);
+
         $this->assertTrue(is_resource($handle));
         $this->assertTrue(is_resource($handle));
         $handler->close();
         $handler->close();
         $this->assertFalse(is_resource($handle));
         $this->assertFalse(is_resource($handle));