質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

20799閲覧

PHP Fatal error: Out of memory について

xxhiroxx_chan

総合スコア41

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/01/04 02:47

xxhiroxx_chanと申します。
いつも回答を頂きありがとうございます。

PHPとSQLServerの件で教えて頂きたく存じます。
環境は以下です。

Windows Server 2012 R2 64bit OS
SQLServer2014
Apache 2.412 (Win64)
PHP 5.5.24

SQLServerの例えばnvarchar(4000)のフィールドで
odbc_execにてINSERT、UPDATEは正しくでき、DBに格納されるが、
その登録したデータが2000文字以上だと、
SELECT文を実行後odbc_resultで結果を取得しようとするところで
PHP Fatal error: Out of memory (allocated 786432) (tried to allocate 4294967293 bytes)
のエラーが出ます。

ちなみに、別のサーバでは問題なくいけています。
php.iniのodbc関連のパラメータは全く同じなので、
他に原因があると思われるのですが、調べてもよくわかりません。

解決方法を教えて頂けると、またヒントでも頂けると幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

そもそもODBCでは無くPHPのメモリの話だと思いますが。
他と同じなのにとかつべこべ言わずに、とりあえず
「php.ini」の「memory_limit」を「-1」に変更しましょう。
それでエラーは発生しなくなる可能性が高いと思います。

それで問題が発生しなくなれば、単に取り扱うデータサイズが
PHPで設けた上限を超えたということがはっきりします。

「odbc関連のパラメータは全く同じ」という情報しかないので
「memory_limit」はどうなっているんだという話になりますが、
もしそこが違うのならあわせましょう。

もし同じなら、なぜそのサーバーだけサイズが大きくなってしまうのかの話になります。
そのサーバーだけ何かが違うはずです。必ず絶対に違う点があります。
「同じはずなんだけど」という思い込みは捨て違う点を探しましょう。

Windows Server 2012 R2 64bit OS
SQLServer2014
Apache 2.412 (Win64)
PHP 5.5.24

が完全に一致しているかどうか、「php.ini」のdiffをとって相違点を探す。
あと、当然、リクエストが一致していることの確認と、
PHPのソースやconfファイル等の内容が同一であることの確認。
最低限ここまではやりましょう。

投稿2016/01/04 03:21

miu_ras

総合スコア902

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xxhiroxx_chan

2016/01/06 00:11

確認するポイントを教えて頂きありがとうございました。 確かに、まずOS、PHP、Apache、SQLServerのバージョンがすべて異なります。 またphp.iniはmemory関係やodbcを含め、関係してそうなものはすべて調べたつもりでしたが、php.iniすべてを調査しているか、といわれるとそこまでしていません。 あと、すみません、環境を書き間違えていました。 【エラーが出る環境】 Windows Server 2008 R2 64bit OS SQLServer2012 Apache 2.2.21 (Win32) PHP 5.2.17 【エラーが出ない環境】 ← こちらでエラーが出ると投稿していました・・・ Windows Server 2012 R2 64bit OS SQLServer2014 Apache 2.412 (Win64) PHP 5.5.24 他の方もおっしゃっているように、私も以下のようなサイトを見て、PHPのバグなのかなぁと思っていたところです。 http://stackoverflow.com/questions/17703180/php-odbc-error-tried-to-allocate-4294967293-bytes ・・・がもしかして、と思いまして質問させて頂きました。 今回は、必要があれば別サーバに移行という状況にあるのでそれで対応したいと思います。 回答頂きありがとうございました。
miu_ras

2016/01/06 12:49

そうですね…そこまで環境が違っていると可能性はいろいろ考えられますがPHPのバージョンが一番怪しそうですよね。 私だったらまず【エラーが出る環境】にPHPの5.5系を入れてApacheが参照するPHPを切り替えて試します。 OSはまだ違っていてもいいのですが、最低限PHPのバージョンは必ずあわせたほうがいいですよ。今回の件に限らず、開発する際の基本です。
xxhiroxx_chan

2016/01/13 03:01

アドバイスありがとうございます!
guest

0

4294967293バイトってほぼ4GBなのでいくらなんでもべらぼうなサイズですし、よくよくみると2**32-3という偶然にしてはちょっとできすぎな値です。phpやodbc関係のバグっぽいです。

phpのChangeLogを見るとPHP 5.5.24より後にもいくつかodbc関連のバグ修正があったと記載されてますし、別のサーバでは問題がないということなのでmiu_rasさんの言うとおりバージョン周りを確認してみてください。

また検索したところ気になるブログを見つけました。関係あるかもしれません。(-4は32bitの符号つき整数で表現すると0xfffffffcなのですが、これを32bitの符号無し整数としてみると4294967292で、_estrndupは指定されたサイズ+1バイトのメモリを割り当てようとするのでちょうど4294967293になるのです)

が、ビューではやっぱり落ちる。まあ、今考えたら当たり前か。この修正では_estrndupに渡される値は

何もかわらないし。

テーブルの時はSQLBindColの第6引数のvallenにカラムサイズが入ってくるけど、ビューの時は-4が

入ってくる。-4はSQL_NO_TOTALを指すが何のこっちゃさっぱりだわ。
ビューだからカラムサイズとれないのかなー?

Linux版PHP5.4以降のODBCエクステンションがsegmentation fault

投稿2016/01/05 00:47

crhg

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xxhiroxx_chan

2016/01/06 00:07

すみません、環境を書き間違えていました。 【エラーが出る環境】 Windows Server 2008 R2 64bit OS SQLServer2012 Apache 2.2.21 (Win32) PHP 5.2.17 【エラーが出ない環境】 ← こちらでエラーが出ると投稿していました・・・ Windows Server 2012 R2 64bit OS SQLServer2014 Apache 2.412 (Win64) PHP 5.5.24 私も以下のようなサイトを見つけており、PHPのバグなのかなぁと思っていたところです。 http://stackoverflow.com/questions/17703180/php-odbc-error-tried-to-allocate-4294967293-bytes ・・・がもしかして、と思いまして質問させて頂きました。 今回は、必要があれば別サーバに移行できるのでそれで対応しようと思います。 回答頂きありがとうございました。
guest

0

php.iniのmemory limitについて調べてください。

投稿2016/01/04 02:52

orange0190

総合スコア1698

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xxhiroxx_chan

2016/01/04 04:22

早速ありがとうございます。 400MBです。少し大目にとってあり、問題ないサーバと同じです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問