[PHP-dev 1148] Re: 32bit CPU で 64bit整数を扱う PHP5 パッチ

Yoshihiro Kawabe sowhat @ amnis.co.jp
2005年 6月 16日 (木) 22:17:50 JST


川辺と申します。

>>>>> "大垣さん" == Yasuo Ohgaki <yohgaki @ ohgaki.net> writes:

大垣さん> 巨大なファイルを取り扱う為に似たようなパッチをつくろうかなと思っていた
大垣さん> ところなので助かります。

なるほど。確かに、今のままだと、fseek関数とかで、2GBオーバを扱えないで
すね。私のパッチ版のPHP5で、ちょっと試してみました。

環境は、
    Debian sid (i386版)
    libc6-i686 (2.3.2.ds1-22)
    Kernel(Vanillaの 2.6.11.7をオリジナルコンフィグレーション)
    php5-cli 5.0.3-1.llext.1 (これが私のパッチ版)
です。(CPUは、Pentium 4 2.4GHz HTTの無い L2 512KB版)

ddコマンドで、取りあえず 8GB スキップして、後ろに適当なテキストファイ
ルを書いた /tmp/BIGFILE-01 と言うのを用意して、テストスクリプトをCLI版
で動かしてみました。

すると、シーク位置を 0x200000000 (0は8個) だと、失敗してしまい、10進数
で 8589934592 を指定した場合には、きちんと8GBスキップした後で、きちん
とテキストが取得できました。

-------------------------<ここから>-------------------------
#!/usr/bin/php5
<?php

$in = fopen('/tmp/BIGFILE-01', 'r');

echo "1st position: ";
echo ftell($in);
echo "\n";

$result = fseek($in, 8589934592, SEEK_SET);
if($result != 0) {
    echo "fseek failed\n";
    exit(2);
}

echo "after seek(0x200000000) position: ";
echo ftell($in);
echo "\n";

echo "lines\n";
echo "-------------------------------------\n";

while($l1 = fgets($in)) {
    echo $l1;
}

fclose($in);

?>
-------------------------<ここまで>-------------------------

と言うことで、一部解析部分にバグが残っていました。

調べたところ、zend_language_scanner.l に strtol のままの個所が見つかり
ました。配列のインデックス等の処理は、strtol のままにしていますが、ス
クリプトに書いた即値の解析に関して漏れていました。

大垣さん> 今どうなっているのか知りませんが、ストリームをラージファイル対応に、と
大垣さん> 言う投稿もphp-internalsにあったので時間の問題かと思います。

取りあえず、私の環境では、通常の stdio 関数群(Cレベルの)がLARGEFILEな
ので、PHP内で seek 等の off_t ハンドリングが long でなく、long longに
なり、それが PHPスクリプトから扱えればそのまま 2G越えが出来ました。

もし、off_t が 32bit のままの環境だとこうはいきません。その場合には、
off_t の代りに zoff_t とか用意して long long にしてあげないといけない
かもしれません。で、lseek64 が呼ばれるように調整しないといけないですね。
その場合には、

   main/streams/streams.c
   ext/standard/streamsfuncs.h
   ext/standard/streamsfuncs.c

辺の seek 周りの関数を変更しないといけないと思います。

上記のバグ修正版ですが、明日にはら出せると思いますので、試してみるので
したら今しばらくお待ち下さい。
--
  Kawabe,Yoshihiro <sowhat @ amnis.co.jp>
  As the stars blink in the night sky, our married hearts are never splitted.
  Even if we will unclasp each other hands, until we retain that. by H.S.


PHP-dev メーリングリストの案内