signed

QiShunwang

“诚信为本、客户至上”

CentOS 8部署PhpWord深坑指南

2021/3/21 1:22:50   来源:

​PhpWord是一个纯PHP语言编写的跨平台库,它提供了一组用于读写不同文档格式的类。

小猿在领导说(逼)服(迫)下,接下了一个小小的活计。鉴于领导提出的需求:能够根据用户输入的数据导出Word文档,要部署到网络上。听着这小(巨)小(复杂)的需求,内心想着最好的实现方式就是Web应用了。基于此开始研究如何使用PHP语言导出Word文件。

行业内流行语,千万不要自己造轮子。

经过百般挑选,觉得PHPWord最适合。Windows平台的部署基于PhpStudy很快完成,窃以为CentOS也不过尔尔也。事实证明小猿草率了,以下记录博各位看官老爷一笑。

手头刚好有一台前几天装好的CentOS 8的Linux开发机,安装CentOS 8的时候自带了PHP 7.2 和 Nginx,心想不用费事儿安装部署PHP和Web服务了。

第一步,安装composer。一种方式是局部安装,此种安装方式最大不便就是使用的时候要麻烦一些,命令格式:php composer.phar

curl -sS https://getcomposer.org/installer | php

为了使用方便,各位看官老爷可以选择和我一样使用全局安装。

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

注意:如果mv命令因为权限失败,请使用sudo后再次尝试。

sudo mv composer.phar /usr/local/bin/composer

现在只需要运行 composer 命令就可以使用 Composer 而不需要输入 php composer.phar。

第二步,当然是直接将Windows平台下部署好的文件拷贝到CentOS相应的目录下。在浏览器中访问测试网页,本以为会是一个皆大欢喜的结果,没想到是无尽无休的系统修复。

Round 1. 运行结果缺少依赖项:dompdf,这个简单容易解决,使用下面命令即可。

composer require dompdf/dompdf

当然看官老爷也可以通过修改composer.json文件来达到目的。

{
    "require": {
        "phpoffice/phpword": "v0.18.*",
        "dompdf/dompdf": "^1.0"
    }
}

Round 2. 依赖项安装成功,赖次狗!哦,什么鬼!服务器返回了一个500的错误,WTF?加句代码看看到底是什么错。

ini_set("display_errors", 1);

竟然是找不到 'ZipArchive'类,查了一下资料CentOS 8安装PHP的时候没有安装这个包。好吧,手动安装吧。

#添加几个源,不然会报错
#php高版本的yum源地址,有两部分,其中一部分是epel-release,另外一部分来自webtatic。如果跳过epel-release的话,安装webtatic的时候
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-8.rpm
yum install php-pecl-zip

注意:如果yum命令因为权限失败,请使用sudo后再次尝试。

Round 3. 安装成功,赖次狗!冲冲冲!呸!还有错误!

Warning: copy(***.docx): failed to open stream: Permission denied in 
/usr/share/nginx/html/projectauth/vendor/phpoffice/phpword/src/PhpWord/TemplateProcessor.php on line 945

不过这个错误是文件权限问题了,解决这个当然很简单啦。但是最稳妥的解决方案就是不要放大权限,因此最好的解决方案就是修改存储文件目录的所有者。修改之前,先检查一个Nginx和PHP的用户配置信息。

首先,打开nginx.conf查看Nginx的用户配置。

vim /etc/nginx/nginx.conf

文件内容中,包含Nginx运行所用的用户信息。

#定义Nginx运行的用户和用户组
user  nginx; 

下一步,打开PHP的配置文件,查看PHP的用户配置:

#sudo vim /etc/php-fpm.d/www.conf

因为我登录系统不是使用的root账户,考虑可能会需要修改这个配置文件,小猿就先画蛇添足的添加了sudo。

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = apache
group = apache

将用户和用户组都修改为nginx,使用Nginx相同的配置。进一步修改存储文件目录的所有者,并且将权限修改为755(各位看官老爷有兴趣,可以自行查阅755这个权限的具体含义)。当然看官老爷不一定非要写nginx,看官老爷可以修改为自己喜欢的用户和用户组,但是一定要保持Nginx和PHP使用相同的用户组。

#chown -R nginx:nginx your_folder
#chmod -R 755 your_folder

Round 4. 元气满满,继续运行!我呸!又失败,还是权限错误。

Warning: copy(***.docx): failed to open stream: Permission denied in 
/usr/share/nginx/html/projectauth/vendor/phpoffice/phpword/src/PhpWord/TemplateProcessor.php on line 945

这是一个深深的大坑,小猿的CentOS是新装的,SELINUX 忘记关了,害我调试了一个下午,坑爹啊!!!

关闭SELINUX:

#sudo vim /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存退出
#setenforce 0 #使配置立即生效