在 Mac OSX 上启用 PHP pdo_odbc 扩展

Posted

技术标签:

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

我正在尝试在运行 php 5.3 的 Mac 上启用 PHP 的 pdo_odbc 扩展,这是我为使其正常工作所做的:

    我用 brew 安装了 UnixODBC

    $ brew install unixodbc
    

    下载了 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。这次它遵守了。

    然后我运行“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 扩展。 【参考方案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(管理我的网络项目)

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

【讨论】:

以上是关于在 Mac OSX 上启用 PHP pdo_odbc 扩展的主要内容,如果未能解决你的问题,请参考以下文章

如何在mac osx下启用mysql(转载)

如何在 mac osx 10.11 El Capitan 上安装 php 7.4 版? [复制]

如何在 OSX 上为 Python 应用程序启用 App 沙箱(Python 应用程序针对 Mac App Store)

从 PHP 5.2.8 源代码在 Mac OSX (10.5) 上安装 mcrypt 测试失败,我该怎么办?

MAC OSX10.10上搭建Apache,PHP,MySQL5.6.22,phpMyAdmin开发环境

Mac / OSx - 更改在 bash 中调用的 PHP 版本