Update SCAN to handle very large cursor values. - #2458
Merged
Merged
Conversation
Member
Author
|
Tested and works on both 32-bit and 64-bit systems. |
Technically Redis may return any unsigned 64 bit integer as a scan
cursor. This presents a problem for PHP in that PHP's integers are
signed. Because of that if a scan cursor is > 2^63 it will overflow and
fail to work properly.
This commit updates our SCAN family of commands to deliver cursors in
their string form.
```php
public function scan(null|int|string $iterator, ...);
```
On initial entry into our SCAN family we convert either a NULL or empty
string cursor to zero, and send the initial scan command.
As Redis replies with cursors we either represent them as a long (if
they are <= ZEND_ULONG_MAX) and as a string if greater. This should
mean the fix is minimally breaking as the following code will still
work:
```php
$it = NULL;
do {
print_r($redis->scan($it));
} while ($it !== 0);
```
The `$it !== 0` still works because the zero cursor will be represented
as an integer. Only absurdly large (> 2^63) values are represented as a
string.
Fixes #2454
michael-grunder
force-pushed
the
large-scan-cursors
branch
from
March 16, 2024 17:39
2e37f5b to
1642954
Compare
yatsukhnenko
approved these changes
Mar 17, 2024
2 tasks done
2 tasks done
This was referenced Oct 9, 2024
|
A fix has been merged into Laravel for this into laravel:11.x with laravel/framework#53095 |
1 task
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Technically Redis may return any unsigned 64 bit integer as a scan cursor. This presents a problem for PHP in that PHP's integers are signed. Because of that if a scan cursor is > 2^63 it will overflow and fail to work properly.
This commit updates our SCAN family of commands to deliver cursors in their string form.
On initial entry into our SCAN family we convert either a NULL or empty string cursor to zero, and send the initial scan command.
As Redis replies with cursors we either represent them as a long (if they are <= ZEND_ULONG_MAX) and as a string if greater. This should mean the fix is minimally breaking as the following code will still work:
The
$it !== 0still works because the zero cursor will be represented as an integer. Only absurdly large (> 2^63) values are represented as a string.Fixes #2454