Skip to main content
 首页 » 编程设计

php之Python 日志记录阻止来自 PHP 脚本的调用

2025年05月04日19davidwang456

我的服务器是 Python 和 PHP 的混合体 - PHP 管理来自用户的传入消息,然后将它与要处理的参数一起发送到 Python,然后返回适当的计算:

#!/usr/bin/env python 
 
import argparse 
 
def addTwoArgs(a, b): 
    return a + b 
 
if __name__ == "__main__": 
 
    # create the top-level parser 
    parser = argparse.ArgumentParser() 
 
    parser.add_argument('integera', type=int, help='first integer') 
    parser.add_argument('integerb', type=int, help='second integer') 
 
    args = parser.parse_args() 
 
    if args.integera and args.integerb: 
 
        result = addTwoArgs(args.integera, args.integerb) 
 
        print(result) 

虽然我确信我可以在这里做得更好(并且将不胜感激关于如何更好地设置它以发送到 PHP 的建议),但它以当前形式工作。这只是 PHP 调用的问题:

exec("python /home/ubuntu/php_test.py 60 7", $output); 

这将给出 67 的答案。一切都很好。

但是,我正在尝试添加日志记录以便了解 PHP 何时进行调用。甚至在正式添加处理程序之前,脚本在尝试创建文件处理程序或调用 handler = logging.FileHandler("addTwoArgs.log") 时实际上“退出”了在下面的示例中:

#!/usr/bin/env python 
 
import argparse 
import logging 
 
logger = logging.getLogger(__name__) 
logger.setLevel(logging.INFO) 
 
# create a file handler (PHP CALL FAILS HERE) 
handler = logging.FileHandler("addTwoArgs.log") 
 
# other logging commands 
.... 
.... 
logger.addHandler(handler) 
 
def addTwoArgs(a, b): 
    return a + b 
 
if __name__ == "__main__": 
 
    # create the top-level parser 
    parser = argparse.ArgumentParser() 
 
    parser.add_argument('integera', type=int, help='first integer') 
    parser.add_argument('integerb', type=int, help='second integer') 
 
    args = parser.parse_args() 
 
    if args.integera and args.integerb: 
 
        result = addTwoArgs(args.integera, args.integerb) 
 
        print(result) 

考虑到此脚本在通过 SSH 调用时完美运行,需要一段时间才能获取该记录器可能是个问题。我认为这是用户权限的问题。我可以通过具有相当全面权限的 SSH 正常运行脚本,但我将从 Web 浏览器调用 PHP 脚本(我认为此处使用 www 用户)。

我试过将文件权限更改为 666,但没有任何更改。

我也试过用 Python 3 调用脚本,没有任何变化。

exec("/usr/bin/python3 /home/ubuntu/php_test.py 60 7", $output); 

如有任何帮助,我们将不胜感激!

请您参考如下方法:

handler = logging.FileHandler("addTwoArgs.log") 

将尝试在当前工作目录 中创建一个addTwoArgs.log 文件,执行该进程的用户可能无法写入该文件(因此会失败) .请参阅最后的失败示例。

要解决您的问题,请改用完整路径,并确保用户对该路径具有写入权限:

# Edit your code: 
handler = logging.FileHandler("/var/log/addTwoArgs/main.log") 
 
# Run this once before in your shell 
mkdir -p /var/log/addTwoArgs 
chown www-data:www-data /var/log/addTwoArgs 

确保将上面的 www-data 替换为您的 web 进程运行的实际用户。


这是我尝试在我无权写入的目录中使用日志文件:

>>> handler = logging.FileHandler("/addTwoArgs.log")  # / is only writable by root 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
  File "/usr/local/Cellar/python/2.7.8/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 911, in __init__ 
    StreamHandler.__init__(self, self._open()) 
  File "/usr/local/Cellar/python/2.7.8/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 936, in _open 
    stream = open(self.baseFilename, self.mode) 
IOError: [Errno 13] Permission denied: '/addTwoArgs.log'