在 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 10.11 El Capitan 上安装 php 7.4 版? [复制]
如何在 OSX 上为 Python 应用程序启用 App 沙箱(Python 应用程序针对 Mac App Store)
从 PHP 5.2.8 源代码在 Mac OSX (10.5) 上安装 mcrypt 测试失败,我该怎么办?