我有以下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不是......第30行的有效GMP整数资源
如果我用base=6, power=9
手动运行代码,它可以正常工作,所以错误只发生在循环多次运行时。
错误消息听起来像是分配了GMP句柄,当它们不再使用时不会被释放。所以在很短的时间之后,句柄超出了整数范围。但是如何释放GMP句柄呢?我已尝试在任何地方使用unset()
,但gmp_free()
或gmp_destroy()
等功能不存在。
更新
向PHP报告了问题,因为我认为这不是预期的行为:https://bugs.php.net/bug.php?id=69702