net - php odbc_connect db2 example



Mac OSX上でPHP pdo_odbc拡張を有効にする (3)

私はPHP 5.3を実行している私のMac上で有効になっているPHP用のpdo_odbc拡張を取得しようとしています。私はそれが動作するようにしようとしたものです:

  1. 私は醸造したUnixODBCをインストールしました

    $ brew install unixodbc
  2. PHP 5.3.8のソースをダウンロードしました。 ターミナルで私はpdo_odbcフォルダに移動しました。 次に、以下のことをしました。

    $ phpize
    $ ./configure --with-pdo-odbc=unixODBC
    $ make

    エラーが発生しました。

    /Users/todd/Downloads/php-5.3.8/ext/pdo_odbc/pdo_odbc.c:43: error: ZEND_MOD_END undeclared here (not in a function)
    /Users/todd/Downloads/php-5.3.8/ext/pdo_odbc/pdo_odbc.c: In function zm_startup_pdo_odbc’:
    /Users/todd/Downloads/php-5.3.8/ext/pdo_odbc/pdo_odbc.c:135: warning: cast to pointer from integer of different size

    いくつかのブログに基づいて、私はZEND_MOD_END{NULL,NUll, NULL} makeを再度実行しました。 今回はそれを遵守しました。

  3. それから、「sudo make install」を実行し、適切な場所に拡張機能をインストールしました。 私はそれを可能にするためにphp.iniを修正しました。 そしてそれはphpInfo()に現れます。

ここまでは順調ですね。 しかし、私がシンプルなテストを始めると、他のすべての試行でエラーが出ます

php(20048,0x7fff796f1960) malloc: *** mmap(size=2977160837258543104) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
terminate called throwing an exceptionAbort trap: 6

このコードを実行しようとすると、これがスローされました:

<?php

   $dsn = 'odbc:Driver={FileMaker ODBC};Server=localhost;Database=CalDAV;';
   $pdo = new PDO($dsn, "odbc", "odbc");

   $sql = "SELECT * From Users Where id = 2";
   $r = $pdo->query($sql);
   print_r($r->fetch(PDO::FETCH_ASSOC));

   $sql = "SELECT * From Users Where id = ?";
   $stmt = $pdo->prepare($sql);
   $stmt->execute(array(2));
   print_r($stmt->fetch(PDO::FETCH_ASSOC));

?>

この行によって例外が発生します。

$stmt->execute(array(2));

誰もがpdo_odbcをMacで動かす経験がありますか? 私は本当にこの拡張機能を働かせたいです。 提案?


Answer #1

あなたのphp.ini(または同等のもの)をチェックして、 'memory_limit'の設定が十分に高いかどうか確認しましたか?

エラー12はメモリが枯渇しているように見えますが、実行中のテストで暴走ループに関連しているかどうか、または非常に大きな割り当てが多すぎるかどうかはわかりません。 現在の 'memory_limit'設定に関するphpinfo()ダンプが何を示しているのかを調べ、エラーが修正されているかどうか確認してください。

参照: http : //www.php.net/manual/en/ini.core.php#ini.memory-limit


Answer #2

おそらくAppleがMac OS X用のiODBC(UnixODBC経由)を選び、それをJaguar(10.2)からバンドルしたことに気づくでしょう。 Appleが公式のプロジェクトパッチについていけなかったので、iodbc.orgサイトから最新のアップデートを入手する必要があります。 フレームワークなどをインストールして、アップルにバンドルされているヘッダーとdylibに別々のパッチを適用することをお勧めします。

UnixODBCに関連する過去のmallocの問題は、iODBCに移行することで解決されました。 私はこれがあなたの場合になるかどうかはわかりませんが、試してみるとわずかな投資のようです。

(ObDisclaimer:私はOpenLink Softwareのために働いています;私たちはiODBCプロジェクトを維持しサポートしています。


Answer #3

私は個人的にはMacPortsを好むが、ほとんどの人はFinkを好むと思う。 OSX用の標準的なunixパッケージのより完全なバージョンを手に入れる最も簡単な方法は、MacPortsまたはFinkを使うことです。

Locate the php.ini file on your Mac (/etc/php.ini)
Replace all instances of /var/mysql/mysql.sock to /tmp/mysql.sock
Save the file and restart Apache.




odbc