允许 Glassfish 和 PHP 使用 Apache 在同一台服务器中协同工作


Allow Glassfish and PHP to work together in the same server using Apache

有可能从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 应用程序的新根目录。

就是这样