mysql — компиляция PHP с MySQLi, встроенным в Windows 7

Я пытаюсь определить, возможно ли использовать MySQL, встроенный в PHP, в среде Windows 7. Руководство по PHP указывает, что расширение MySQLi может запускать и останавливать встроенный сервер MySQL.

Однако, похоже, что в распределенных сборках для Windows от PHP.net эта опция не включена. Мои интернет-поиски показали мне этот вопрос: Компиляция PHP с помощью —enable-embedded-mysqli и —with-mysqli что, по-видимому, указывает на то, что если я скомпилирую PHP, я могу включить встроенные команды сервера MySQL

Хотя я могу успешно построить ванильный PHP, я, кажется, не могу получить buildconf предоставлять configure с --enable-embedded-mysqli вариант. Может кто-нибудь мне помочь?

4

Решение

Хорошо, так что после обширных исследований и испытаний я нашел решение

Компиляция PHP в Windows основывается на файлах config.w32, которые предоставляют configure и make file необходимые инструкции для конфигурирования, а затем компилируют PHP. Вариант Unix — это файл config.m4.

Проблема в том, что у Windows-версии нет логики для активации встроенного сервера.

Оригинальный код (только часть интереса)

if (CHECK_LIB("libmysql.lib", "mysqli", PHP_MYSQLI) &&
CHECK_HEADER_ADD_INCLUDE("mysql.h", "CFLAGS_MYSQLI", PHP_MYSQLI +
"\\include;" + PHP_PHP_BUILD +
"\\include\\mysql;" + PHP_MYSQLI)) {
EXTENSION("mysqli", mysqli_source);
AC_DEFINE('HAVE_MYSQLILIB', 1, 'Have MySQLi library');
MESSAGE("\tlibmysql build");
PHP_INSTALL_HEADERS("ext/mysqli", "php_mysqli_structs.h");
} else {
WARNING("mysqli not enabled; libraries and headers not found");
PHP_MYSQLI = "no"}

Вам нужно изменить этот код, чтобы включить встроенный сервер.

if (PHP_EMBEDDED_MYSQLI != "no") {
if (CHECK_LIB("libmysqld.lib", "mysqli", PHP_MYSQLI) &&
CHECK_HEADER_ADD_INCLUDE("mysql.h", "CFLAGS_MYSQLI", PHP_MYSQLI +
"\\include;" + PHP_PHP_BUILD +
"\\include\\mysql;" + PHP_MYSQLI)) {
EXTENSION("mysqli", mysqli_source);
AC_DEFINE('HAVE_MYSQLILIB', 1, 'Have MySQLi library');
MESSAGE("\tlibmysql build");
AC_DEFINE('HAVE_EMBEDDED_MYSQLI', 1, 'Embedded MySQL support enabled');
MESSAGE("\tEmbedded MySQL build");
PHP_INSTALL_HEADERS("ext/mysqli", "php_mysqli_structs.h");
} else {
WARNING("mysqli not enabled; libraries and headers not found");
PHP_MYSQLI = "no"}
} else {
if (CHECK_LIB("libmysql.lib", "mysqli", PHP_MYSQLI) &&
CHECK_HEADER_ADD_INCLUDE("mysql.h", "CFLAGS_MYSQLI", PHP_MYSQLI +
"\\include;" + PHP_PHP_BUILD +
"\\include\\mysql;" + PHP_MYSQLI)) {
EXTENSION("mysqli", mysqli_source);
AC_DEFINE('HAVE_MYSQLILIB', 1, 'Have MySQLi library');
MESSAGE("\tlibmysql build");
PHP_INSTALL_HEADERS("ext/mysqli", "php_mysqli_structs.h");
} else {
WARNING("mysqli not enabled; libraries and headers not found");
PHP_MYSQLI = "no"}
}

Вам также необходимо добавить следующую строку вверху файла прямо под строкой ARG_WITH ().

ARG_ENABLE("embedded-mysqli", "Enable the embedded mysqli server", "no");

Бег buildconf теперь создаст файл конфигурации с возможностью встраивания mysqli и настройки.

configure --with-extra-includes=[path-to-mysql-dir\include] --with-extra-libs=[path-to-mysql-dir\lib] --without-mysqlnd --with-mysqli=shared,libmysqldclient --enable-embedded-mysqli [other options here]

Теперь вы можете запустить nmake а также nmake snap скомпилировать PHP 🙂

Вам нужно будет скопировать libmysqld.dll в C: \ mysql \ php (или куда бы вы ни поместили php). Вы включаете php через php.ini, как обычно.

Причиной создания PHP как общего модуля вместо статического является nmake snap происходит сбой, потому что он запускает PHP, чтобы упаковать дистрибутив php, если MySQLi был собран статически, он теперь будет искать свои зависимости mysql при запуске и молча терпит неудачу (без ошибок), когда не находит их.

Поместите файл конфигурации mysql (my.ini) на один каталог выше php.exe. Это позволит вам указать пользовательские каталоги, которые будут связывать PHP с вашей сборкой mysql. Используйте группу [встроенный], а не [mysqld] для передачи конфигураций.

Единственное, что могло бы сделать это решение еще лучше, было бы, если бы я смог найти способ поместить файл my.ini в тот же каталог, что и PHP. Я постараюсь собрать MySQL из исходного кода, чтобы установить эту переменную во время компиляции.

1

Другие решения

Других решений пока нет …