Получать различные переменные входные данные из PHP в c++


У меня есть программа, в которую необходимо отправить следующие переменные:

Bool int string vector<int> vector<string>

Это произойдет в результате вызова PHP, как я уже выяснил здесь и здесь.

Глядя на этот вопрос о (int argc, char** argv[]), я знаю, что вы можете передавать различные аргументы программе, которые ей необходимы для запуска, но все они представлены в виде Характер Последовательность.

Итак, мой вопрос: Если это возможно, как вы собираетесь отправлять несколько переменных в вызове PHP программе C++?

РЕДАКТИРОВАТЬ (Продолжение вопроса)...и как будет выглядеть вызов функции?

Так ли это просто, как не использовать (int argc, char** argv[]) и просто делать:

int main(bool var1, int var2, std::vector<std::string> var3, std::string var4)
{
...
}

Потому что это, кажется, делает (int argc, char** argv[]) немного избыточным?

Author: Community, 2015-06-29

1 answers

Вы можете выполнить свою программу на C++ на PHP с помощью exec:

exec("./your_program.exe $parameters", $output);

Это передаст содержимое $parameters в качестве аргумента командной строки вашей программе на C++. В пределах main(int argc, char** argv) вы можете получить доступ к этим данным через argc и argv.

Чтобы передать несколько переменных одновременно, вы должны использовать какую-то сериализацию . Это преобразует содержимое ваших переменных в одну строку, которую вы затем можете снова передать в качестве аргумента командной строки. У вас просто есть чтобы убедиться, что сторона C++ знает, как снова отменить сериализацию этой строки в правильные переменные/типы данных.

Существует множество возможностей, начиная от изобретения собственного формата (не делайте этого) до использования одного из установленных (сделайте это).

На ум приходят такие форматы, как JSON, XML, Пакет сообщений и т.д. Вы даже могли бы реализовать что-то, используя собственный PHP serialize метод.


Чтобы прояснить ситуацию, давайте предположим что вы хотите передать эти данные из PHP в C++:

$var1 = false;
$var2 = 123;
$var3 = array("some","string","data");
$var4 = "anotherstring";

Давайте далее предположим, что у вас есть функция PHP my_serialize(), которая преобразует array($var1, $var2, $var3, $var4) в вымышленный формат сериализации false|123|<some,string,data>|anotherstring:

$serialized_data = my_serialize(array($var1, $var2, $var3, $var4));
// $serialized_data  == "false|123|<some,string,data>|anotherstring"

// invoke your program and pass the data
exec("./your_program.exe '$serialized_data'", $output);

В вашей программе сериализованные данные теперь находятся в пределах argv[1]. Теперь вам понадобится функция my_deserialize(), которая анализирует входные данные и преобразует их в соответствующий формат данных.

int main(int argc, char** argv)
{
    std::cout << argv[1] << std::endl;
    MyData data = my_deserialize(argv[1]);
    std::cout << data.var4 << std::endl; // outputs "another string"
}

Используйте один из методов сериализации, которые я перечислил выше, и вам не нужно беспокоиться о детали реализации my_serialize и my_deserialize.

 4
Author: m.s., 2017-05-23 12:10:51