有可能从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 和会话?
如果您无论如何都使用 Apache 来代理流量,我只会排除所有到 Piwik 的流量,并直接从文件系统/mod_php
/php-fpm
/您通常使用的任何内容中提供这些流量。
您也可以使用 php-cgi
并传递适当的环境变量,但这会使很多事情变得复杂,例如您还必须将响应代理回浏览器。Apache已经支持这一点,所以不要在你的应用程序中实现另一个代理,直接在Apache中实现。
您可以从代理中排除目录:
ProxyPass /piwik !
ProxyPass / 127.0.0.1:8080
ProxyPassReverse / 127.0.0.1:8080
当您从命令行执行 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。
感谢 kelunik 使用 Apache 排除流量和帮助的想法 通过费德里科 我已经使用这个 Apache 规则解决了这个问题:
ProxyPass /phpdir !
ProxyPass / 127.0.0.1:8080
ProxyPassReverse / 127.0.0.1:8080
Apache 将所有请求重定向到端口 8080,文件夹 /phpdir 除外。在 Apache 文档根目录中,我创建了目录 phpdir,这是运行 PHP 应用程序的新根目录。
就是这样