【问题标题】:Receive varying variable inputs from PHP into c++从 PHP 接收不同的变量输入到 c++
【发布时间】:2015-06-29 11:25:40
【问题描述】:

我有一个程序需要发送以下变量:

Boolintstringvector<int>vector<string>

这将来自PHP 电话,因为我已经查看了herehere

查看 this question 关于(int argc, char** argv[]),我知道您可以将各种参数传递给程序运行所需的参数,但这些都是Character Sequence 的形式.

所以我的问题是:如果可能,您如何在 PHP 调用中发送多个变量变量到 C++ 程序?

编辑(问题继续)...函数调用会是什么样子?

不使用(int argc, char** argv[])就这么简单吗:

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

因为这似乎让(int argc, char** argv[]) 有点多余?

【问题讨论】:

  • 您可以让 PHP 将 C++ 程序作为一个新进程执行,参见here。如果你想传递复杂的参数,你可能想以某种方式序列化参数。更复杂的方法是将 C++ 程序编译为库并使用 dl 之类的内容加载它,尽管我只是猜测,因为我没有这方面的经验。
  • exec() 确实看起来不错,但是使用exec() 传递命令,无论是否序列化,我会使用(int argc, char** argv[])(bool var1, int var2, std::vector&lt;std::string&gt; var3, std::string var4) 设置函数吗?
  • 总是必须使用(int argc, char** argv[])
  • 我已经在下面的回答中写道:您必须将数据序列化为字符序列。
  • 你不要这样分配它。我更新了我的答案

标签: php c++ variables call


【解决方案1】:

您可以使用exec 在 PHP 中执行您的 C++ 程序:

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

这会将$parameters 的内容作为命令行参数传递给您的C++ 程序。在main(int argc, char** argv) 中,您可以通过argcargv 访问这些数据。

为了一次传递多个变量,您应该使用某种serialization。这会将变量的内容转换为一个字符串,然后您可以再次将其作为命令行参数传递。 您只需确保 C++ 端知道如何再次将此字符串反序列化为正确的变量/数据类型。

有多种可能性,从发明自己的格式(不要这样做)到使用已建立的格式之一(这样做)。

会想到 JSON、XML、MessagePack 等格式。你甚至可以使用PHP's own serialize 方法来实现一些东西。


为了让事情更清楚,让我们假设您希望将此数据从 PHP 传递到 C++:

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

让我们进一步假设您有一个 PHP 函数 my_serialize(),它将 array($var1, $var2, $var3, $var4) 转换为虚构的序列化格式 false|123|&lt;some,string,data&gt;|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_serializemy_deserialize的实现细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    相关资源
    最近更新 更多