使用固定的PHP 5.3.5数组进行分段错误

时间:2011-06-15 01:45:38

标签: php arrays segmentation-fault

尝试定义这样的数组时:

$array = new SPLFixedArray(256);

for ($i = 0; $i < 256; $i++) {
    $array[$i] = new SPLFixedArray(256);

    for ($j = 0; $j < 256; $j++) {
        $array[$i][$j] = new SPLFixedArray(5);

        for ($k = 0; $k < 5; $k++) {
            $array[$i][$j][$k] = 0;
        }
    }
}

我只能在CLI中获得“Segmentation Fault”。我在C / C ++中的SO上读到了这样的错误,这可能是一个内存问题,并建议使用malloc()将所有内容加载到堆内存中。在PHP中我们有这样的工具吗?

即使在小的3d数组中也会发生这种情况,例如15而不是256(但在15以下)。

谢谢!

3 个答案:

答案 0 :(得分:5)

只有一个PHP错误会出现段错误;你永远不应该那样做。它在PHP 5.3.5上为我分段。我在5.3.6的更改日志中看不到任何内容,表明它已被修复。 (它也为我在5.3.6崩溃。)

作为一种解决方法,您可以这样做:

$array = new SplFixedArray(256 * 256 * 5);
$array[$i * JK + $j * K + $k] = $foo;

JK和K是常数。 JK = $jsize * $ksize;K = $ksize

无论如何,这可能会比创建3D阵列提供更好的性能。

更新

我在PHP 5.3.7-dev上尝试过,并且没有段错误。因此,手指交叉,它已被修复,并将在PHP 5.3.7中正常工作。

答案 1 :(得分:1)

您没有说出您正在运行的PHP版本。不确定这是否相关,但SPLFixedArrays有bug posted,修复程序在6月初移植到快照中。

您可以针对快照试用代码,看看它是否能解决您的问题,Linux snapshotWindows Snapshot

答案 2 :(得分:0)

段错误可能来自操作系统级别,告诉您已经破坏了堆栈。这就是说,你破坏堆栈的原因来自你从循环嵌套调用的SplFixedArray()的多次调用。这就是为什么,就像你提到的那样,在小型3d数组中,它也会被破坏。

话虽如此,如果可能,尽量不要有这样的筑巢。这相当于具有无限递归。更不用说PHP的底层机制仍然是C。

希望它有所帮助!干杯!