Python日志影响PHP脚本调用
我的服务器是用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与Python之间的传递的建议,我会很感激),但目前的形式是可以工作的。其实就是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顺利运行这个脚本,因为SSH的权限比较全面,但我会通过网页浏览器来调用PHP脚本(我想这里是用的www用户)。
我尝试把文件权限改成666,但没有任何变化。
我也尝试用Python 3来调用这个脚本,但结果还是一样。
exec("/usr/bin/python3 /home/ubuntu/php_test.py 60 7", $output);
任何帮助都会非常感激!
1 个回答
1
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
替换成你实际运行网页程序的用户。
下面是我尝试在一个我没有写入权限的目录中使用日志文件的例子:
>>> 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'