У меня есть следующий скрипт PHP, который я вызываю через CLI:
#!/usr/bin/php
<?php
$max_stellen = 10;
for ($base=2; $base<=62; $base++) {
for ($power=2; $power<=10; $power++) {
$result = array();
$max_base = gmp_pow($base, $max_stellen);
$x = gmp_init(0);
while ((gmp_cmp($x, $max_base) == -1)) {
$val = gmp_strval($x, $base);
$i = strlen($val);
$left = gmp_pow($x, $power);
$right = gmp_pow($base, $i);
$mod = gmp_mod($left, $right);
if (gmp_cmp($mod, $x) == 0) {
$result[] = $val;
}
unset($left);
unset($right);
unset($mod);
$x = gmp_add($x, 1); // !!! line 30
}
unset($x);
unset($max_base);
$res2 = array();
foreach ($result as &$r) {
$root = substr($r, -1);
$res2[$root][] = $r;
}
unset($result);
foreach ($res2 as $root => &$r) {
echo "X^${power}_${base}($root) = {".implode(', ', $r)."}\n";
}
unset($res2);
echo "\n";
}
}
Через некоторое время (значения base=6, power=9
), Я получаю следующее сообщение об ошибке:
Предупреждение PHP: gmp_add (): -2147483648 не является допустимым целочисленным ресурсом GMP в … в строке 30
Если я вручную запустить код с base=6, power=9
, это работает, поэтому ошибка происходит только тогда, когда цикл выполняется несколько раз.
Звучит сообщение об ошибке, как будто выделены дескрипторы GMP, которые не освобождаются, когда они больше не используются. Поэтому через короткое время дескриптор выходит за пределы целочисленного диапазона. Но как мне освободить ручки GMP? Я уже пытался использовать unset()
везде и функционирует как gmp_free()
или же gmp_destroy()
не существует.
Обновить
О проблеме сообщили в PHP, так как я считаю, что это не ожидаемое поведение: https://bugs.php.net/bug.php?id=69702
Задача ещё не решена.
Других решений пока нет …