ODBC から (IBM AS400 に) テーブルを読み取り、それをテキスト ファイルに毎日書き込む関数を PHP で取得しました。1GB++ 以上になるまで問題なく動作します。その後、いくつかの行で停止し、完全には書き込まれませんでした。
function write_data_to_txt($table_new, $query)
{
global $path_data;
global $odbc_db, $date2;
if(!($odbc_rs = odbc_exec($odbc_db,$query))) die("Error executing query $query");
$num_cols = odbc_num_fields($odbc_rs);
$path_folder = $path_data.$table_new."/";
if (!file_exists($path_folder)) mkdir ($path_folder,0777);
$filename1 = $path_folder. $table_new. "_" . $date2 . ".txt";
$comma = "|";
$newline = chr(13).chr(10);
$handle = fopen($filename1, "w+");
if (is_writable($filename1)) {
$ctr=0;
while(odbc_fetch_row($odbc_rs))
{
//function for writing all field
// for($i=1; $i<=$num_cols; $i++)
// {
// $data = odbc_result($odbc_rs, $i);
// if (!fwrite($handle, $data) || !fwrite($handle, $comma)) {
// print "Cannot write to file ($filename1)";
// exit;
// }
//}
//end of function writing all field
$data = odbc_result($odbc_rs, 1);
fwrite($handle,$ctr.$comma.$data.$newline);
$ctr++;
}
echo "Write Success. Row = $ctr <br><br>";
}
else
{
echo "Write Failed<br><br>";
}
fclose($handle);
}
エラーはありません。成功メッセージだけですが、3,690,498 行になるはずですが (それでも増加します)、約 3,670,009 行になりました
私のクエリは、次のような通常の選択です。
select field1 , field2, field3 , field4, fieldetc from table1
私が試したことと私が想定していること:
- fwriteの制限だったと思うので、すべてのフィールドを書き込まないようにします($ctrと最初のレコードを書き込むだけです)が、それでも同じ行にスタックしています..だから、fwriteが制限を超えているわけではないと思います..
- 選択したフィールドを削減しようとすると、完全に機能します!! だから私はそれがodbcにいくつかの制限があると仮定します.
- SQL Server で同じ odbc データソースを使用しようとして、すべてのフィールドを選択しようとすると、完全な行が得られます。だから私はそれがodbcの制限ではないと仮定します。
- 私も64ビットマシンで試してみましたが、さらに悪いことに、約3,145,812行しか返されません..だから、32/64ビットインフラストラクチャではないと思います。
- PHP iniのmemory_limitを1024mbに増やそうとしましたが、うまくいきませんでした..
私のPHPでodbc接続に何かを設定する必要があるかどうか知っている人はいますか??