在Linux和PHP之间传递数据

在Linux下,如果我想从PHP传递纯string到C,我该怎么做? 我所尝试做的远远是:

exec("./myexec.bin -a mystring"); 

在PHP和

 getopt(argc,argv, "a:"); 

在C

一切正常,但是当我传递比MAX_ARG_STRLEN (131072)长的string时,它将不再返回0,而是返回127,这是命令未find….

有没有其他的方法可以将string数据传递给一个linux可执行文件? 还是有什么办法来克服MAX_ARG_STRLEN问题?

Solutions Collecting From Web of "在Linux和PHP之间传递数据"

您可以使用popen()打开一个管道到可执行文件:

 $fp = popen('./myexec.bin', 'w'); fwrite($fp, $data); pclose($fp); 

然后,如前所述,从C程序的stdin读取:

 fopen(stdin, "r"); // ... 

使用popen()而不是exec('/bin/echo')更“安全”,因为您可以编写可能由shell(&,|,…)解释的字符。 请注意,从PHP的popen()返回的句柄必须pclose()关闭。

有几个选项可以立刻回想起来:

  • 将数据存储在文件中并在命令行上传递文件名。 这很容易和简单,但需要权限创建和存储在文件系统的某个地方的文件。

  • 打开你的程序和C程序之间的管道; 让这两个进程一直运行,至少在C程序已经消耗完整个字符串的内容之前。 popen()是围绕这种方法的一个方便的包装,但它确实假定标准输入是正确的目标,而且是单向的 。 自己管理管道使您可以使用不同的文件描述符 – 您可以通过命令行参数告诉子文件读取哪个文件描述符。 (请参阅gpg(1)的命令行选项--passphrase-fd来查看我的意思。)

  • 使用SysV或POSIX 共享内存段将数据存储在PHP中,然后从C程序中连接到共享内存段以读取内容。 请注意,共享内存段仍然存在 ,所以当你完成后,你必须清理它,否则你会泄漏内存。 这不需要在文件系统中创建文件的权限,并且可能是一个比处理管道更好的机制,并使两个进程保持足够长的时间,以便完全写入数据而另一个完全读取数据。

如果它更像是一个数据结构而不是一个字符串,那么使用嵌入式Web服务器怎么样? 乍看起来,这可能听起来像是为了你的目的,但猫鼬例如是一个非常轻量级的嵌入式网络服务器:

http://code.google.com/p/mongoose/

在PHP应用程序和C / C ++应用程序之间传输数据也是一个很好的教程。 这是在德国,虽然…但也许谷歌翻译可以帮助:

http://blog.aditu.de/2010/05/15/serverbridge-zwischen-php-und-cc/

尝试使用echo并输出到您的C可执行文件,而不是使用args:

exec("/bin/echo | ./myexec.bin");

正如@sarnold在评论中提到的那样是错误的。 看看@Linus Kleen 回答 。

在你的C程序中:

 fopen(stdin, "r"); // ...