【问题标题】:Enabling PHP pdo_odbc extension on a Mac OSX在 Mac OSX 上启用 PHP pdo_odbc 扩展
【发布时间】:2012-04-15 01:55:00
【问题描述】:

我正在尝试在运行 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()

到目前为止一切顺利。但是当我开始运行简单的测试时,每次尝试都会出错

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

【问题讨论】:

  • 不确定是否有 brew 等价物,但我只是运行了“sudo port install php5-odbc”,它很容易安装。
  • 看起来 PDO_ODBC 扩展中有一个错误:bugs.php.net/bug.php?id=52942 我的猜测是一个错误的 malloc() 调用来分配已经分配的内存。
  • Kevin,我很确定 php5-odbc 只是旧的非 PDO ODBC 扩展。我正在尝试在 mac 上运行 PDO-ODBC 扩展。

标签: php macos pdo odbc


【解决方案1】:

也许值得注意的是,Apple 为 Mac OS X 选择了 iODBC(而不是 UnixODBC),并从 Jaguar (10.2) 开始捆绑它。你应该得到latest update from the iodbc.org site,因为苹果从来没有跟上官方项目补丁。我建议同时安装框架等,并将单独的补丁应用到 Apple 捆绑的标头和 dylib。

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

(ObDisclaimer:我为 OpenLink Software 工作;我们维护和支持 iODBC 项目。我个人从您选择此选项中没有任何收获。)

【讨论】:

    【解决方案2】:

    您是否检查过您的 php.ini(或同等文件)以查看您的“memory_limit”设置是否足够高?

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

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

    【讨论】:

      【解决方案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.
      

      【讨论】:

        【解决方案4】:

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

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

        • VirtualBox (20GB VDI)
        • Ubuntu Linux-Server(带有仅主机适配器)
        • LAMP(Apache、MySQL 和 PHP)
        • Samba(管理我的网络项目)

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-08
          • 2012-06-10
          • 2020-08-27
          • 1970-01-01
          • 2017-07-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多