Включение расширения PHP pdo_odbc на Mac OSX - PullRequest
8 голосов
/ 31 марта 2012

Я пытаюсь включить расширение pdo_odbc для PHP на моем Mac, работающем под управлением PHP 5.3. Вот что я сделал, чтобы попытаться заставить его работать:

  1. Я установил UnixODBC вместе с brew

    $ 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. Я бы очень хотел, чтобы это расширение заработало. Предложения?

Ответы [ 4 ]

2 голосов
/ 01 ноября 2012

Возможно, стоит отметить, что Apple выбрала iODBC (вместо UnixODBC) для Mac OS X и включила его, начиная с Jaguar (10.2).Вы должны получить последнее обновление с сайта iodbc.org , потому что Apple никогда не отставала от официальных патчей проекта.Я рекомендую установить и Frameworks, и другие приложения, а также применить отдельные исправления к заголовочным файлам и библиотекам Apple.

Прошлые проблемы malloc, связанные с UnixODBC, были решены путем перехода на iODBC.Я не знаю, так ли это для вас, но, похоже, стоит потратить немного денег.

(ObDisclaimer: я работаю на OpenLink Software ; мы поддерживаем и поддерживаем проект iODBCЯ лично ничего не выиграю от того, что ты выберешь этот вариант.)

0 голосов
/ 14 декабря 2012

Я лично предпочитаю MacPorts, хотя я думаю, что большинство людей предпочитают Fink. Самый простой способ получить более полнофункциональные версии стандартных пакетов Unix для OSX - использовать 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.
0 голосов
/ 02 ноября 2012

Я использую VirtualBox с дистрибутивом Ubuntu Server на моем MacBook.

Поскольку я заметил, что одно обновление OSX может испортить вашу конфигурацию.

  • VirtualBox (20 ГБ VDI)
  • Ubuntu Linux-Server (с адаптером только для хоста)
  • LAMP (Apache, MySQL & PHP)
  • Samba (для управления моими веб-проектами)

Прекрасно работает для разработки, и вам не нужно беспокоиться о правильном переносе зависимостей!

0 голосов
/ 08 мая 2012

Вы проверили свой php.ini (или его эквивалент), чтобы убедиться, что ваш параметр memory_limit достаточно высок?

Ошибка 12, по-видимому, связана с исчерпанием памяти, но я не уверен, связана ли она с циклом выбега в тестах, которые вы выполняете, или просто с слишком большим количеством очень больших выделений. Проверьте, что phpinfo () dump говорит о вашей текущей настройке 'memory_limit', а затем проверьте, исправляет ли она ошибку.

Смотри также: http://www.php.net/manual/en/ini.core.php#ini.memory-limit

...