From e5f44c33a2862fd0df1cab36e293525ed7bae993 Mon Sep 17 00:00:00 2001 From: Daniele Alessandri Date: Fri, 4 Sep 2020 17:56:19 +0200 Subject: [PATCH] No need for socket_import_stream() to set TCP_NODELAY since PHP 7.1. --- src/Connection/PhpiredisStreamConnection.php | 7 ++-- src/Connection/StreamConnection.php | 8 +--- .../PhpiredisStreamConnectionTest.php | 42 +++++++++++++++++++ .../Connection/StreamConnectionTest.php | 42 +++++++++++++++++++ 4 files changed, 89 insertions(+), 10 deletions(-) diff --git a/src/Connection/PhpiredisStreamConnection.php b/src/Connection/PhpiredisStreamConnection.php index c63a5979..47dd0474 100644 --- a/src/Connection/PhpiredisStreamConnection.php +++ b/src/Connection/PhpiredisStreamConnection.php @@ -109,14 +109,13 @@ class PhpiredisStreamConnection extends StreamConnection /** * {@inheritdoc} */ - protected function createStreamSocket(ParametersInterface $parameters, $address, $flags, $context = null) + protected function createStreamSocket(ParametersInterface $parameters, $address, $flags) { $socket = null; $timeout = (isset($parameters->timeout) ? (float) $parameters->timeout : 5.0); + $context = stream_context_create(['socket' => ['tcp_nodelay' => (bool) $parameters->tcp_nodelay]]); - $resource = @stream_socket_client($address, $errno, $errstr, $timeout, $flags); - - if (!$resource) { + if (!$resource = @stream_socket_client($address, $errno, $errstr, $timeout, $flags, $context)) { $this->onConnectionError(trim($errstr), $errno); } diff --git a/src/Connection/StreamConnection.php b/src/Connection/StreamConnection.php index 06f90e7a..ebb9f55b 100644 --- a/src/Connection/StreamConnection.php +++ b/src/Connection/StreamConnection.php @@ -103,8 +103,9 @@ class StreamConnection extends AbstractConnection protected function createStreamSocket(ParametersInterface $parameters, $address, $flags) { $timeout = (isset($parameters->timeout) ? (float) $parameters->timeout : 5.0); + $context = stream_context_create(['socket' => ['tcp_nodelay' => (bool) $parameters->tcp_nodelay]]); - if (!$resource = @stream_socket_client($address, $errno, $errstr, $timeout, $flags)) { + if (!$resource = @stream_socket_client($address, $errno, $errstr, $timeout, $flags, $context)) { $this->onConnectionError(trim($errstr), $errno); } @@ -116,11 +117,6 @@ class StreamConnection extends AbstractConnection stream_set_timeout($resource, $timeoutSeconds, $timeoutUSeconds); } - if (isset($parameters->tcp_nodelay) && function_exists('socket_import_stream')) { - $socket = socket_import_stream($resource); - socket_set_option($socket, SOL_TCP, TCP_NODELAY, (int) $parameters->tcp_nodelay); - } - return $resource; } diff --git a/tests/Predis/Connection/PhpiredisStreamConnectionTest.php b/tests/Predis/Connection/PhpiredisStreamConnectionTest.php index 078e25a3..b9d6b5bc 100644 --- a/tests/Predis/Connection/PhpiredisStreamConnectionTest.php +++ b/tests/Predis/Connection/PhpiredisStreamConnectionTest.php @@ -194,4 +194,46 @@ class PhpiredisStreamConnectionTest extends PredisConnectionTestCase $this->assertNotSame($connection1->getResource(), $connection2->getResource()); } + + /** + * @group connected + */ + public function testTcpNodelayParameterSetsContextFlagWhenTrue() + { + $connection = $this->createConnectionWithParams(['tcp_nodelay' => true]); + $options = stream_context_get_options($connection->getResource()); + + $this->assertIsArray($options); + $this->assertArrayHasKey('socket', $options); + $this->assertArrayHasKey('tcp_nodelay', $options['socket']); + $this->assertTrue($options['socket']['tcp_nodelay']); + } + + /** + * @group connected + */ + public function testTcpNodelayParameterDoesNotSetContextFlagWhenFalse() + { + $connection = $this->createConnectionWithParams(['tcp_nodelay' => false]); + $options = stream_context_get_options($connection->getResource()); + + $this->assertIsArray($options); + $this->assertArrayHasKey('socket', $options); + $this->assertArrayHasKey('tcp_nodelay', $options['socket']); + $this->assertFalse($options['socket']['tcp_nodelay']); + } + + /** + * @group connected + */ + public function testTcpDelayContextFlagIsNotSetByDefault() + { + $connection = $this->createConnectionWithParams([]); + $options = stream_context_get_options($connection->getResource()); + + $this->assertIsArray($options); + $this->assertArrayHasKey('socket', $options); + $this->assertArrayHasKey('tcp_nodelay', $options['socket']); + $this->assertFalse($options['socket']['tcp_nodelay']); + } } diff --git a/tests/Predis/Connection/StreamConnectionTest.php b/tests/Predis/Connection/StreamConnectionTest.php index 8eb04bed..683f20fc 100644 --- a/tests/Predis/Connection/StreamConnectionTest.php +++ b/tests/Predis/Connection/StreamConnectionTest.php @@ -132,4 +132,46 @@ class StreamConnectionTest extends PredisConnectionTestCase $this->assertNotSame($connection1->getResource(), $connection2->getResource()); } + + /** + * @group connected + */ + public function testTcpNodelayParameterSetsContextFlagWhenTrue() + { + $connection = $this->createConnectionWithParams(['tcp_nodelay' => true]); + $options = stream_context_get_options($connection->getResource()); + + $this->assertIsArray($options); + $this->assertArrayHasKey('socket', $options); + $this->assertArrayHasKey('tcp_nodelay', $options['socket']); + $this->assertTrue($options['socket']['tcp_nodelay']); + } + + /** + * @group connected + */ + public function testTcpNodelayParameterDoesNotSetContextFlagWhenFalse() + { + $connection = $this->createConnectionWithParams(['tcp_nodelay' => false]); + $options = stream_context_get_options($connection->getResource()); + + $this->assertIsArray($options); + $this->assertArrayHasKey('socket', $options); + $this->assertArrayHasKey('tcp_nodelay', $options['socket']); + $this->assertFalse($options['socket']['tcp_nodelay']); + } + + /** + * @group connected + */ + public function testTcpDelayContextFlagIsNotSetByDefault() + { + $connection = $this->createConnectionWithParams([]); + $options = stream_context_get_options($connection->getResource()); + + $this->assertIsArray($options); + $this->assertArrayHasKey('socket', $options); + $this->assertArrayHasKey('tcp_nodelay', $options['socket']); + $this->assertFalse($options['socket']['tcp_nodelay']); + } }