Новое расширение PHP-CPP работает по команде cli 'php', но не в браузере
Я использую PHP-CPP для создания расширения php, которое содержит функцию, которая будет анализировать таблицу из mysql.
extension.cpp
#include <phpcpp.h>
#include <iostream>
#include <mysql.h>
Php::Value ss_parse_table(Php::Parameters ¶ms)
{
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
MYSQL_FIELD *field;
/* INITIALIZE CONNECTION HANDLER, DO NOT CHANGE */
conn = mysql_init (NULL);
// @param orders: host,username,password,database,
mysql_real_connect (conn, params[0], params[1], params[2], params[3], 3306, NULL, 0);
/* show tables in the database (test for errors also) */
mysql_query(conn,("SELECT * FROM table");
res = mysql_store_result(conn);
// get the number of the columns
int num_fields = mysql_num_fields(res);
Php::Value array;
Php::Value rows;
int i = 0;
while((field = mysql_fetch_field(res))){
array[i] = field->name;
i++;
}
int x = 0;
while ((row = mysql_fetch_row(res)))
{
for (int z=0;z<num_fields;z++)
{
std::string fieldname = array[z];
rows[x][fieldname] = row[z];
}
x++;
}
// DON'T FORGET TO CLEAN RESULT AFTER YOU DON'T NEED IT
// ANYMORE
if(res != NULL)
mysql_free_result(res);
/* disconnect from server */
mysql_close (conn);
return rows;
}
extern "C" {
PHPCPP_EXPORT void *get_module()
{
\
static Php::Extension extension("extension", "1.0");
extension.add("ss_parse_table",ss_parse_table);
// @todo add your own functions, classes, namespaces to the extension
// return the extension
return extension;
}
}
и при компиляции я отредактировал MakeFile и добавил mysql_config --cflags --libs
в команде компилятора, чтобы загрузить mysql, чтобы он выглядел как g++ -shared -o extension.so extension.o -lphpcpp mysql_config --cflags --libs
компиляция работает отлично.
Я попытался проверить, действительно ли компиляция работала с использованием определенной функции (ss_parse_table) из расширения. Итак, я создал файл php:
test.php
<?php
print_r(ss_parse_table( "localhost", "dbuser","dbpassword","database"));
?>
и из CLI, когда я запускаю команду 'php /mnt/test/index.php', она работает нормально. Команда выведет массив, возвращенный определенной функцией расширения (ss_parse_table), что-то вроде этого
Array
(
[0] => Array
(
[id] => 'erd'
)
)
но когда я просматриваю его из браузера, http не работает
"Данные не получены" (ошибка Chrome) или "Соединение было сброшено" (ошибка Firefox)
1 ответ
У меня была точно такая же проблема. Я решил эту проблему, добавив каталог, в котором находится мой файл libmysqlclient.so, в системный PATH:
PATH=$PATH:/usr/lib64
а затем перезапустите службу httpd:
systemctl restart httpd.service
После этого все заработало нормально.
Я надеюсь, что это помогает