Другой номер API для расширения PHP

Итак, дело в том, что я пытаюсь разработать php-расширение для своих клиентов. Я использую SWIG для генерации кода-оболочки, а мой основной код — C++. После того, как я успешно создам свое расширение, я загружаю его в /ext и перезапускаю веб-сервер для его тестирования. У меня есть ошибка, в которой упоминается, что расширение было построено с API 20090626, но API сервера PHP (в моем случае XAMPP) — 20100525. Я полностью понимаю ошибку, поэтому я открываю файл заголовка Zend_modules.h в исходном коде php и измените номер API с 20090626 на 20100525, затем я создам свое расширение с обновленным заголовочным файлом zend_modules.h, и теперь у меня нет проблем.

Вопрос в том, что мои клиенты наверняка используют разные php-серверы с разными API, и я планировал дать им dll (моё расширение), которое можно легко загрузить без каких-либо проблем. Но теперь я должен дать им решение VS2010 с динамически загруженным моим основным кодом (dll). Я имею в виду, что каждый пользователь должен сначала проверить PHP API на своем собственном сервере и изменить заголовочный файл Zend_modules.h, собрать решение, а затем использовать расширение. Мне нужно решение, которое сделает мое расширение полностью независимым от этого номера API.

Я очень ценю любую идею.


person A23149577    schedule 02.03.2013    source источник
comment
Какая??!! расширения php в окнах - это dll !!   -  person A23149577    schedule 02.03.2013
comment
Ах, я пользователь Mac, извините! Глупый комментарий удален.   -  person StackExchange User    schedule 02.03.2013


Ответы (1)


Я полностью понимаю ошибку, поэтому я открываю заголовочный файл Zend_modules.h в исходном коде php и меняю номер API с 20090626 на 20100525.

Тот факт, что вы делаете это, говорит мне, что вы на самом деле не понимаете ошибки.

Модули НЕ совместимы между различными основными версиями PHP — номер Zend API используется для гарантии того, что PHP не попытается непреднамеренно загрузить модуль, созданный для другой версии. Модификации, которые вы вносите в свое дерево сборки PHP, приводят к тому, что он создает модули, которые вообще не будут работать правильно ни в одной из версий.

Если вам нужно собрать модули для нескольких основных версий PHP, вам нужно запускать сборки с использованием соответствующей версии PHP. Вы не можете смешивать и сочетать, и вы не можете создать один модуль, который будет работать для нескольких версий. (Вы также не должны советовать своим пользователям модифицировать свою сборку PHP, чтобы принять несовместимый модуль. Это просто приведет к ужасным вещам.)

Версии API для нескольких версий PHP перечислены ниже:

  • PHP 5.2: 20060613
  • PHP 5.3: 20090626
  • PHP 5.4: 20100525
  • PHP 5.5: 20120211
person Community    schedule 02.03.2013
comment
Большое спасибо за ваш полезный ответ. - person A23149577; 02.03.2013
comment
Кстати, у вас есть мнение об использовании моих функций C++ в PHP без использования расширений. Мне нужно решение, которое может быть независимым от версии. - person A23149577; 02.03.2013
comment
Если ваше расширение будет использоваться только в Windows, возможно, вы сможете что-то сделать с расширением COM. - person ; 02.03.2013
comment
Вы случайно не помните, где вы нашли эти номера версий? - person Pharap; 21.05.2015