可以建立从Java到php文件的桥梁吗?
我有一个用Java编写的应用程序,我需要用PHP编写的执行http://piwik.org/。在服务器上我运行PHP,但是我无法从浏览器访问php目录,因为所有传入的流量都被apache重定向到glassfish应用服务器。
所以我的想法是使用Java servlet执行php文件:
Runtime.getRuntime().exec("php /path/to/file/file.php");
然后将PHP输出编写为java servlet响应。
实现这一目标的唯一问题是:
如何执行像浏览器一样的PHP cli?
我需要将哪些参数传递给PHP以允许PHP读取或写入cookie和会话?
答案 0 :(得分:4)
当您从命令行执行php脚本时GET
/ POST
/ SESSION
/ COOKIE
变量毫无意义。当您的file.php
发送Cookie时,没有浏览器可以接收它,请保存并将其用于后续请求。
您可以使用CGI SAPI,以便所有HTTP_*
变量都可用,并且标题将被写入输出。
php-cgi
二进制文件实现了CGI接口,允许您在命令行上传递cookie,如下所示:
HTTP_COOKIE='PHPSESSID=XXXX' php-cgi /path/to/file/file.php
其中XXXX
可以是用户的会话ID。您可以阅读分析输出标题的cookie。
答案 1 :(得分:4)
如果您仍在使用Apache来代理流量,我只会将所有流量排除在Piwik之外,并直接从文件系统/ mod_php
/ php-fpm
/通常用于您提供的流量。
你也可以使用php-cgi
并传递适当的环境变量,但这会使很多东西变得复杂,比如你必须将响应代理回浏览器。 Apache已经支持这一点,所以不要在你的应用程序中实现另一个代理,直接在Apache中执行。
您可以排除代理目录:
ProxyPass /piwik !
ProxyPass / 127.0.0.1:8080
ProxyPassReverse / 127.0.0.1:8080
答案 2 :(得分:2)
感谢 kelunik 使用Apache排除流量和帮助的想法 Federico 我已经使用此Apache规则解决了问题:
ProxyPass /phpdir !
ProxyPass / 127.0.0.1:8080
ProxyPassReverse / 127.0.0.1:8080
Apache将所有请求重定向到端口8080,文件夹 / phpdir 除外。在Apache文档根目录中,我创建了目录 phpdir ,这是运行PHP应用程序的新根目录。
那是