如何从PHP执行CGI文件?
我正在尝试制作一个网页应用,来管理我的Mercurial代码库。
我希望当我告诉它加载某个代码库X时,能做到以下几点:
- 连接到MySQL服务器,确保代码库X存在。
- 检查用户是否有权限访问这个代码库。
- 如果用户有权限,就从MySQL服务器获取代码库X的位置。
- 运行一个hgweb的cgi脚本(用Python写的),这个脚本里包含了代码库的路径。
现在的问题是,我想要:拿到hgweb脚本,修改它,然后直接运行。
但我不想要:拿到hgweb脚本,修改它,然后把它写到一个文件里再去重定向到那个文件。
我正在使用Apache来运行httpd进程。
3 个回答
0
关于你的问题,不,你不太可能让php执行一个修改过的脚本,而不把它写到某个地方,比如硬盘上的文件、映射到内存的虚拟文件,或者类似的东西。
听起来你可能是在用一根小树枝去敲铁路钉。如果你已经到了根据存储在MySQL中的用户权限来过滤访问的地步,是否考虑过现有的HG解决方案,看看有没有比hgweb更合适的选择?hgweb其实是为了做好一件事而设计的,而你现在的需求超出了它的正常范围。
我建议你可以看看apache的原生认证,这样可以更方便地控制对代码库的访问,然后直接提供代码库,而不需要修改脚本。
2
你可以在PHP里面运行shell脚本。有很多种方法可以做到这一点,但有些主机可能没有提供正确的权限,这些问题在php.net上都有详细的说明。不过,最简单的方法就是把你的命令放在反引号里面。所以,如果我想解压一个文件,可以这样写:
`unzip /path/to/file`
所以,如果你的Python脚本可以在命令行环境中运行(或者你可以修改它让它可以运行),那么这似乎是最推荐的方法。
2
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`;