我的服务器是 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'
