From 15d4185b94390810af1b5ad52160cd5dd6c03f58 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Mon, 23 Sep 2024 07:58:36 +0200 Subject: test build for upcoming 6.1.0RC2 --- PHPINFO | 2 +- REFLECTION | 2 +- SessionHelpers.php | 353 --------------------------------------------------- php-pecl-redis6.spec | 11 +- redis-upstream.patch | 116 ----------------- 5 files changed, 7 insertions(+), 477 deletions(-) delete mode 100644 SessionHelpers.php delete mode 100644 redis-upstream.patch diff --git a/PHPINFO b/PHPINFO index 35333b6..dc83670 100644 --- a/PHPINFO +++ b/PHPINFO @@ -2,7 +2,7 @@ redis Redis Support => enabled -Redis Version => 6.1.0RC1 +Redis Version => 6.1.0RC2 Redis Sentinel Version => 1.0 Available serializers => php, json, igbinary, msgpack Available compression => lzf, zstd, lz4 diff --git a/REFLECTION b/REFLECTION index 74d6e30..4f320ec 100644 --- a/REFLECTION +++ b/REFLECTION @@ -1,4 +1,4 @@ -Extension [ extension #107 redis version 6.1.0RC1 ] { +Extension [ extension #113 redis version 6.1.0RC2 ] { - Dependencies { Dependency [ igbinary (Required) ] diff --git a/SessionHelpers.php b/SessionHelpers.php deleted file mode 100644 index 90ae73b..0000000 --- a/SessionHelpers.php +++ /dev/null @@ -1,353 +0,0 @@ - null, - 'save-path' => null, - 'id' => null, - 'sleep' => 0, - 'max-execution-time' => 300, - 'locking-enabled' => true, - 'lock-wait-time' => null, - 'lock-retries' => -1, - 'lock-expires' => 0, - 'data' => '', - 'lifetime' => 1440, - 'compression' => 'none', - ]; - - private $prefix = NULL; - private $output_file; - private $exit_code = -1; - private $cmd = NULL; - private $pid; - private $output; - - public function __construct() { - $this->args['id'] = $this->createId(); - } - - public function getExitCode(): int { - return $this->exit_code; - } - - public function getCmd(): ?string { - return $this->cmd; - } - - public function getId(): ?string { - return $this->args['id']; - } - - public function prefix(string $prefix): self { - $this->prefix = $prefix; - return $this; - } - - public function getSessionKey(): string { - return $this->prefix . $this->getId(); - } - - public function getSessionLockKey(): string { - return $this->getSessionKey() . '_LOCK'; - } - - protected function set($setting, $v): self { - $this->args[$setting] = $v; - return $this; - } - - public function handler(string $handler): self { - return $this->set('handler', $handler); - } - - public function savePath(string $path): self { - return $this->set('save-path', $path); - } - - public function id(string $id): self { - return $this->set('id', $id); - } - - public function sleep(int $sleep): self { - return $this->set('sleep', $sleep); - } - - public function maxExecutionTime(int $time): self { - return $this->set('max-execution-time', $time); - } - - public function lockingEnabled(bool $enabled): self { - return $this->set('locking-enabled', $enabled); - } - - public function lockWaitTime(int $time): self { - return $this->set('lock-wait-time', $time); - } - - public function lockRetries(int $retries): self { - return $this->set('lock-retries', $retries); - } - - public function lockExpires(int $expires): self { - return $this->set('lock-expires', $expires); - } - - public function data(string $data): self { - return $this->set('data', $data); - } - - public function lifetime(int $lifetime): self { - return $this->set('lifetime', $lifetime); - } - - public function compression(string $compression): self { - return $this->set('compression', $compression); - } - - protected function validateArgs(array $required) { - foreach ($required as $req) { - if ( ! isset($this->args[$req]) || $this->args[$req] === null) - throw new \Exception("Command requires '$req' arg"); - } - } - - private function createId(): string { - if (function_exists('session_create_id')) - return session_create_id(); - - return uniqid(); - } - - private function getTmpFileName() { - return '/tmp/sessiontmp.txt'; - return tempnam(sys_get_temp_dir(), 'session'); - } - - /* - * @param $client Redis client - * @param string $max_wait_sec - * - * Sometimes we want to block until a session lock has been detected - * This is better and faster than arbitrarily sleeping. If we don't - * detect the session key within the specified maximum number of - * seconds, the function returns failure. - * - * @return bool - */ - public function waitForLockKey($redis, $max_wait_sec) { - $now = microtime(true); - - do { - if ($redis->exists($this->getSessionLockKey())) - return true; - usleep(10000); - } while (microtime(true) <= $now + $max_wait_sec); - - return false; - } - - private function appendCmdArgs(array $args): string { - $append = []; - - foreach ($args as $arg => $val) { - if ( ! $val) - continue; - - if (is_string($val)) - $val = escapeshellarg($val); - - $append[] = "--$arg"; - $append[] = $val; - } - - return implode(' ', $append); - } - - private function buildPhpCmd(string $script, array $args): string { - return PhpSpawner::cmd($script) . ' ' . $this->appendCmdArgs($args); - } - - private function startSessionCmd(): string { - return $this->buildPhpCmd(self::start_script, $this->args); - } - - public function output(?int $timeout = NULL): ?string { - if ($this->output) { - var_dump("early return"); - return $this->output; - } - - if ( ! $this->output_file || ! $this->pid) { - throw new \Exception("Process was not started in the background"); - } - - $st = microtime(true); - - do { - if (pcntl_waitpid($this->pid, $exit_code, WNOHANG) == 0) - break; - usleep(100000); - } while ((microtime(true) - $st) < $timeout); - - if ( ! file_exists($this->output_file)) - return ""; - - $this->output = file_get_contents($this->output_file); - $this->output_file = NULL; - $this->exit_code = $exit_code; - $this->pid = NULL; - - return $this->output; - } - - public function execBg(): bool { - if ($this->cmd) - throw new \Exception("Command already executed!"); - - $output_file = $this->getTmpFileName(); - - $this->cmd = $this->startSessionCmd(); - $this->cmd .= " >$output_file 2>&1 & echo $!"; - - $pid = exec($this->cmd, $output, $exit_code); - $this->exit_code = $exit_code; - - if ($this->exit_code || !is_numeric($pid)) - return false; - - $this->pid = (int)$pid; - $this->output_file = $output_file; - - return true; - } - - public function execFg() { - if ($this->cmd) - throw new \Exception("Command already executed!"); - - $this->cmd = $this->startSessionCmd() . ' 2>&1'; - - exec($this->cmd, $output, $exit_code); - $this->exit_code = $exit_code; - $this->output = implode("\n", array_filter($output)); - - return $this->output; - } - - private function regenerateIdCmd($locking, $destroy, $proxy): string { - $this->validateArgs(['handler', 'id', 'save-path']); - - $args = [ - 'handler' => $this->args['handler'], - 'save-path' => $this->args['save-path'], - 'id' => $this->args['id'], - 'locking-enabled' => !!$locking, - 'destroy' => !!$destroy, - 'proxy' => !!$proxy, - ]; - - return $this->buildPhpCmd(self::regenerate_id_script, $args); - } - - public function regenerateId($locking = false, $destroy = false, $proxy = false) { - if ( ! $this->cmd) - throw new \Exception("Cannot regenerate id before starting session!"); - - $cmd = $this->regenerateIdCmd($locking, $destroy, $proxy); - - exec($cmd, $output, $exit_code); - - if ($exit_code != 0) - return false; - - return $output[0]; - } - - private function getDataCmd(?int $lifetime): string { - $this->validateArgs(['handler', 'save-path', 'id']); - - $args = [ - 'handler' => $this->args['handler'], - 'save-path' => $this->args['save-path'], - 'id' => $this->args['id'], - 'lifetime' => is_int($lifetime) ? $lifetime : $this->args['lifetime'], - ]; - - return $this->buildPhpCmd(self::get_data_script, $args); - } - - public function getData(?int $lifetime = NULL): string { - $cmd = $this->getDataCmd($lifetime); - - exec($cmd, $output, $exit_code); - if ($exit_code != 0) { - return implode("\n", $output); - } - - return $output[0]; - } -} diff --git a/php-pecl-redis6.spec b/php-pecl-redis6.spec index 2f17c9c..142f068 100644 --- a/php-pecl-redis6.spec +++ b/php-pecl-redis6.spec @@ -31,22 +31,20 @@ %global ini_name 50-%{pecl_name}.ini %global upstream_version 6.1.0 -%global upstream_prever RC1 +%global upstream_prever RC2 %global sources %{pecl_name}-%{upstream_version}%{?upstream_prever} %global _configure ../%{sources}/configure Summary: Extension for communicating with the Redis key-value store Name: %{?scl_prefix}php-pecl-redis6 Version: %{upstream_version}%{?upstream_prever:~%{upstream_prever}} -Release: 1%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}} +Release: 0%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}} License: PHP-3.01 URL: https://pecl.php.net/package/redis Source0: https://pecl.php.net/get/%{sources}.tgz -Source1: https://raw.githubusercontent.com/phpredis/phpredis/%{upstream_version}%{?upstream_prever}/tests/SessionHelpers.php BuildRequires: make BuildRequires: %{?dtsprefix}gcc -# see https://github.com/phpredis/phpredis/issues/2531#issuecomment-2268309251 BuildRequires: %{?scl_prefix}php-devel >= 7.4 BuildRequires: %{?scl_prefix}php-pear BuildRequires: %{?scl_prefix}php-json @@ -127,8 +125,6 @@ sed -e 's/role="test"/role="src"/' \ -i package.xml cd %{sources} -cp %{SOURCE1} tests/ - # Use system library rm -r liblzf @@ -341,6 +337,9 @@ exit $ret %changelog +* Mon Sep 23 2024 Remi Collet - 6.1.0~RC2-0 +- test build for upcoming 6.1.0RC2 + * Mon Aug 5 2024 Remi Collet - 6.1.0~RC1-1 - update to 6.1.0RC1 - open https://github.com/phpredis/phpredis/pull/2532 missing file diff --git a/redis-upstream.patch b/redis-upstream.patch deleted file mode 100644 index 03bd34f..0000000 --- a/redis-upstream.patch +++ /dev/null @@ -1,116 +0,0 @@ -From a51215ce2b22bcd1f506780c35b6833471e0b8cb Mon Sep 17 00:00:00 2001 -From: michael-grunder -Date: Mon, 18 Mar 2024 14:42:35 -0700 -Subject: [PATCH] Update random includes. - -PHP 8.4 has some breaking changes with respect to where PHP's random methods and -helpers are. This commit fixes those issues while staying backward compatible. - -Fixes #2463 ---- - backoff.c | 12 ++++++------ - library.c | 7 ++++++- - redis.c | 6 +++++- - 3 files changed, 17 insertions(+), 8 deletions(-) - -diff --git a/backoff.c b/backoff.c -index d0961fcfaf..1be04a8fe8 100644 ---- a/backoff.c -+++ b/backoff.c -@@ -1,14 +1,14 @@ - #include "common.h" - -+#if PHP_VERSION_ID < 80400 - #include -- --#if PHP_VERSION_ID >= 70100 --#include - #else -+#include -+#endif -+ -+#if PHP_VERSION_ID < 70100 - static zend_long php_mt_rand_range(zend_long min, zend_long max) { -- zend_long number = php_rand(); -- RAND_RANGE(number, min, max, PHP_RAND_MAX); -- return number; -+ return min + php_rand() % (max - min + 1) - } - #endif - -diff --git a/library.c b/library.c -index 3d65c8529d..f81556a9ed 100644 ---- a/library.c -+++ b/library.c -@@ -56,9 +56,14 @@ - #include - #endif - --#include - #include - -+#if PHP_VERSION_ID < 80400 -+#include -+#else -+#include -+#endif -+ - #define UNSERIALIZE_NONE 0 - #define UNSERIALIZE_KEYS 1 - #define UNSERIALIZE_VALS 2 -diff --git a/redis.c b/redis.c -index ec6f65d2ed..2330bf7edf 100644 ---- a/redis.c -+++ b/redis.c -@@ -27,12 +27,16 @@ - #include "redis_cluster.h" - #include "redis_commands.h" - #include "redis_sentinel.h" --#include - #include - #include - #include - #include - -+#if PHP_VERSION_ID < 80400 -+#include -+#else -+#include -+#endif - - #ifdef PHP_SESSION - #include -From c139de3abac1dd33b97ef0de5af41b6e3a78f7ab Mon Sep 17 00:00:00 2001 -From: michael-grunder -Date: Sat, 1 Jun 2024 13:09:30 -0700 -Subject: [PATCH] We don't need to use a ranom value for our ECHO liveness - challenge. - -A microsecond resolution timestamp combined with a monotonically -incremented counter should be sufficient. - -This also fixes PHP 8.4 compilation as PHP 8.4 doesn't seem to have -`php_rand()`. ---- - library.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/library.c b/library.c -index ce0cbda26..42a132c4c 100644 ---- a/library.c -+++ b/library.c -@@ -2886,11 +2886,13 @@ redis_sock_create(char *host, int host_len, int port, - } - - static int redis_uniqid(char *buf, size_t buflen) { -+ static unsigned long counter = 0; - struct timeval tv; -+ - gettimeofday(&tv, NULL); - - return snprintf(buf, buflen, "phpredis:%08lx%05lx:%08lx", -- (long)tv.tv_sec, (long)tv.tv_usec, (long)php_rand()); -+ (long)tv.tv_sec, (long)tv.tv_usec, counter++); - } - - static int redis_stream_liveness_check(php_stream *stream) { -- cgit