最近碰到的两个小问题(权限,session)
问题1, 权限
工作中可能会碰到需要在线播放用户上传的office文件,比较简单的可以借助第三方应用,如果想自己开发通常是office -> pdf -> swf,然后借助前端flash插件进行播放。
office -> pdf用的命令是 unoconv
pdf -> swf用的命令是 pdf2swf
我曾经维护过一个系统也是按着上面流程进行处理的,但是最近出现了一个问题,在pdf -> swf的过程中出问题了,代码如下:
exec("pdf2swf a.pdf -o b.swf", $output);
通过打印$output得到的错误是:不能打开a.pdf文件,基本可以确定是权限问题。那说明是office -> pdf的过程出现了问题。office -> pdf的代码是:
exec("unoconv --connection \"socket,host=127.0.0.1,port=8111;urp;StarOffice.ComponentContext\" -f pdf -o a.pdf a.doc");
通过查看生成的a.pdf文件权限为:600,所有者和所属组都是root。
所以现在的问题就是程序生成的pdf文件在pdf到swf过程中没有读取权限。
为什么之前没有问题呢?
经过查询发现是之前脚本是使用root用户运行的,现在切换成了其他用户,但是进程一直用的root用户。进程如下:
/usr/lib/libreoffice/program/soffice.bin --nologo --headless --accept="socket,host=127.0.0.1,port=8111;urp;StarOffice.ServiceManager"
重点来了:虽然php exec执行的是unoconv,但是unoconv使用的是libreoffice进程,libreoffice进程是root用户,生成的文件就是root权限,而并不是调用unoconv的脚本权限。
问题2,session
php的session默认运行机制是在浏览器生成一个cookie,这个cookie里面放着PHPSESSID,当请求发起的时候php会根据这个PHPSESSID去服务器上找对应的session文件,反序列化里面的内容,存储在$_SESSION中。
默认情况下,php使用内置的文件会话管理器来保存数据,也就是说session是以文件的形式存储在服务器上的,所以当我们有多台服务器的时候共享session就成了问题。
当然我们可以通过自定义会话管理器来解决这方面的问题。
(完)
- 本文作者:吴泽辉
- 本文链接:https://mutex.top/posts/ea48e9cb/
- 发表日期:2017年10月29日
- 版权声明:本文章为原创,采用《知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议》进行许可