我正在尝试在运行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上运行。我真的想让这个扩展工作。建议?
答案 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更新可能会破坏您的配置。
非常适合开发,您不必担心正确移植依赖项!