最近碰到的两个小问题(权限,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就成了问题

当然我们可以通过自定义会话管理器来解决这方面的问题。

(完)