在Mac OSX上启用PHP pdo_odbc扩展

时间:2012-03-31 19:18:39

标签: php macos pdo odbc

我正在尝试在运行PHP 5.3的Mac上启用PHP的pdo_odbc扩展。以下是我尝试让它工作的方法:

  1. 我用brew

    安装了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()

  4. 到目前为止一切顺利。但是当我开始运行简单的测试时,我会遇到其他所有尝试的错误

    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上运行。我真的想让这个扩展工作。建议?

4 个答案:

答案 0 :(得分:2)

也许值得注意的是,Apple选择了iODBC(通过UnixODBC)用于Mac OS X并将其与Jaguar(10.2)捆绑在一起。您应该得到latest update from the iodbc.org site,因为Apple从未跟上官方项目补丁。我建议同时安装Frameworks等,并将单独的补丁应用于Apple捆绑的标题和dylib。

与UnixODBC相关的过去malloc问题已通过转移到iODBC来解决。我不知道你会遇到这种情况,但尝试这似乎是一笔不小的投资。

(ObDisclaimer:我为OpenLink Software工作;我们维护和支持iODBC项目。我个人从你追求这个选项中得不到任何好处。)

答案 1 :(得分:0)

你检查过你的php.ini(或同等版本),看看你的'memory_limit'设置是否足够高?

错误12似乎与内存耗尽有关,但我不确定它是否与您正在运行的测试中的失控循环相关,或者只是太多非常大的分配。检查 phpinfo()转储中有关当前“memory_limit”设置的内容,然后将其设置为查看是否可以纠正错误。

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

答案 2 :(得分:0)

我个人更喜欢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.

答案 3 :(得分:-2)

我在我的MacBook上使用VirtualBox和Ubuntu Server Distro。

由于我注意到一次OSX更新可能会破坏您的配置。

  • VirtualBox(20GB VDI)
  • Ubuntu Linux-Server(带主机专用适配器)
  • LAMP(Apache,MySQL&amp; PHP)
  • Samba(管理我的网络项目)

非常适合开发,您不必担心正确移植依赖项!