如何从PHP执行CGI文件?
问题描述:
我正在尝试制作一个Web应用程序,以便为我管理我的Mercurial存储库。 我想要它,以便当我告诉它加载存储库X时:如何从PHP执行CGI文件?
- 连接到MySQL服务器并确保X存在。
- 检查用户是否被允许访问存储库。
- 如果上述属实,从mysql服务器获取X的位置。
- 运行包含存储库路径的hgweb cgi脚本(python)。
这是问题所在,我想:采取hgweb脚本,修改它并运行它。 但我不想:采取hgweb脚本,修改它,将其写入文件并在那里重定向。 我使用Apache来运行httpd进程。
答
Ryan Ballantyne发表了正确答案(我向上投票)。反引号操作符是执行shell脚本的方式。
最简单的解决方案可能是修改hgweb脚本,使其不会“包含”存储库本身的路径。相反,将它作为命令行参数传递。这意味着您不必担心在任何地方修改和编写hgweb脚本。所有你需要做的是:
//do stuff to get location of repository from MySQL into variable $x
//run shell script
$res = `python hgweb.py $x`;
答
您可以在PHP中运行shell脚本。有很多种方法可以做到这一点,并且一些主机并没有提供适当的权限,所有这些在php.net上都有详细记录。也就是说,最简单的方法就是简单地将你的命令用反引号括起来。所以,要解压的文件,我可以说:
`unzip /path/to/file`
所以,如果你的Python脚本是这样的,它可以在命令行环境中运行(或者你可以修改它,以便运行),这将似乎是首选方法。
答
就你问题而言,不,你不可能让php执行一个修改后的脚本而不写入某个地方,无论这是磁盘上的文件,映射到内存的虚拟文件还是类似的东西。
这听起来像你可能试图用树枝砸铁路钉。如果您根据存储在MySQL中的用户权限过滤访问权限,您是否看过现有的HG解决方案以确保没有比hgweb更适用的东西?这确实是为了完成一件事而设计的,而且这超出了普通领域。
我可能会建议寻找Apache的本地身份验证作为一个更方便的方法来控制对存储库的访问,然后只提供回购而不修改脚本。
这并没有回答他的问题。 – 2009-07-26 23:42:08
@Paul McMillan:很确定它确实回答了这个问题。问题是“我如何从PHP执行CGI文件?”,反引号操作符是要走的路。 – zombat 2009-07-26 23:54:18