【问题标题】:Segmentation fault with fixed PHP 5.3.5 array固定 PHP 5.3.5 数组的分段错误
【发布时间】:2011-09-15 04:16:14
【问题描述】:

当试图定义这样的数组时:

$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 中得到“分段错误”。我在 C/C++ 中的 SO 上阅读了此类错误,这可能是内存问题,并建议使用 malloc() 将所有内容加载到堆内存中。 PHP中有这样的工具吗?

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

谢谢!

【问题讨论】:

  • php 版本最好在此类问题中指定。
  • 没有这样的工具 within PHP 用户空间。请在备份时通过bugs.php.net 报告此问题。它不会作为 SO 问题得到回答。
  • 它似乎已在 PHP 5.3.7-dev 中修复。

标签: php arrays segmentation-fault


【解决方案1】:

只有 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 中正常工作。

【讨论】:

    【解决方案2】:

    你没有说你运行的是什么 PHP 版本。不确定这是否相关,但 SPLFixedArrays 有一个 bug posted,6 月初在快照中移植了一个修复程序。

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

    【讨论】:

      【解决方案3】:

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

      话虽如此,如果可能的话,尽量不要有这样的嵌套。这相当于有一个无限递归。更何况PHP的底层机制还是C。

      希望对您有所帮助!干杯!

      【讨论】:

        猜你喜欢
        • 2011-09-16
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2022-12-03
        • 2021-06-27
        • 2017-04-11
        • 1970-01-01
        • 2023-03-21
        相关资源
        最近更新 更多