使用PHP执行Python脚本以打开套接字

4

我有一个名为chatserver.py的Python脚本,它包括以下内容:

#!/usr/bin/python
from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
<SNIP>
reactor.listenTCP(3800, factory)
print "Server Started"
reactor.run()

我在端口3800上打开了一个socket,如果我从SSH启动它,它可以工作,但我想检查该端口是否关闭,并使用PHP重新打开它。但是我似乎无法执行Python脚本。

目前我是通过PHP调用它的:

function serverCheck() {
   $host = "MYHOST";
   $port = 3800;
   $connection = @fsockopen($host, $port);

   if ( !is_resource($connection) ) { // port not open
       exec('/usr/bin/python PATH_TO_FILE/chatserver.py 2>&1');

    if($connection)
       fclose($connection);
}

我尝试了很多搜索到的方法,但似乎无法使文件执行。


PATH_TO_FILE 在 PHP 中是一个常量吗?PHP 常量不会在字符串中插值。 - Joe Frambach
@JoeFrambach 不,完整路径是 exec('/var/www/vhosts/httpdocs/chat/chatserver.py 2>&1');。 - Will Roberts
1
ls -l chatserver.py 显示 root:root?我猜你正在以 yourname:yourname 的身份运行 php 脚本?那就是你的问题所在 :) - Joe Frambach
是的,它显示为root:root。有什么想法可以使其以root身份运行吗? - Will Roberts
我现在正在撰写一个答案。 - Joe Frambach
显示剩余9条评论
2个回答

1
似乎是权限问题。目前的 chatserver.py 需要 root 用户才能运行。
不要仅仅使用 chmod 777 chatserver.py。那是危险的。
我喜欢的方法是为这些管理任务创建一个组:
groupadd chatserver

然后将自己添加到该组中:
usermod -a -G chatserver willroberts

然后将chatserver.py的所有权改为该组:

chown root:chatserver chatserver.py

当php由您的用户运行时,它将具有正确的组成员身份以运行py文件。此方法允许更多灵活性,适用于更多的"chatserver"可执行文件。如果您感兴趣,可以阅读更多相关内容:https://wiki.archlinux.org/index.php/Users_and_Groupshttp://www.tldp.org/LDP/intro-linux/html/sect_03_04.html

用户名称为 apache。将用户 apache 添加到组 chatserver 中,并更改 php 文件的所有者为 chatserver 组。 - Joe Frambach
将Apache添加到新组不应该出现任何错误。这听起来不对。无论如何,请运行“groups apache”以确保用户“apache”在组“chatserver”中。 - Joe Frambach
php -r "phpinfo();" | grep exec 打印出了很多内容。我应该在里面寻找什么?再次感谢! - Will Roberts
对不起,我不知道那是什么意思 :( - Joe Frambach
我应该首先作为apache SSH登录还是当我以root身份SSH登录时? - Will Roberts
显示剩余24条评论

0
问题已经解决 :)
最后发现是shebang的问题 :| 我知道...我感觉很蠢!
应该是 #!/usr/bin/python,但由于各种测试原因,我不知道为什么改变了它!
非常感谢您的帮助!非常感激!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接