12

strlen($str)を使用して作成された「巨大な文字列」に対して負の値を返していますstr_repeat:

<?php

error_reporting(E_STRICT|E_ALL);
echo phpversion(); // 5.3.26
echo PHP_INT_MAX; // 9223372036854775807
ini_set('memory_limit', '-1');
ini_set('max_execution_time', 0);

$gb = 1024 * 1024 * 1024;
$str = str_repeat('a', 2 * $gb);
echo strlen($str); // gives int(-2147483648)
echo $str[0]; // Notice: Uninitialized string offset: 0

$str2 = str_repeat('a', 4 * $gb);
echo strlen($str2); // gives int(0)

$str3 = str_repeat('a', 123 + 4 * $gb);
echo strlen($str3); // gives int(123)

$str4 = str_repeat('a', 6 * $gb); // starts to wrap again...
echo strlen($str4); // gives int(-2147483648)
echo $str4[0]; // Notice: Uninitialized string offset: 0

$str5 = str_repeat('a', 123 + 8 * $gb);
echo strlen($str5); // gives int(123)

?>

この動作は定義されていますか?

それともこれはPHPのバグですか?

4

2 に答える 2

5

string2GB まで大きくすることができます。

実際には (2GB - 1) のようです。これは私のx64ボックスでうまくいきます:

$str = str_repeat('a', 2 * 1024 * 1024 * 1024 -1);
echo $str[0];

...これが壊れている間:

$str = str_repeat('a', 2 * 1024 * 1024 * 1024);
echo $str[0];

あなたがやっていることは単にundefinedであり、マニュアルを修正する必要があります。私も警告を期待していたでしょう。

興味深いことに、これにより致命的なエラーが発生します。

$str = str_repeat('a', 2 * 1024 * 1024 * 1024 -2); // 2GB - 2 bytes
$str .= 'b'; // ok
$str .= 'c'; // PHP Fatal error:  String size overflow


アップデート:

バグレポートに参加しました。php.net のドキュメントが修正され、「最大 2147483647 バイト」と表示されるようになりました。

于 2013-07-10T16:59:47.877 に答える