Windows Server2012服务器上配置PHP调用PowerPoint COM组件方法

弄这做啥?

  1. 实际的需求是:要通过PHP程序将PPT文件(.ppt,.pptx)按页转为.jpg图片的功能。
  2. 代码不难写,网上有很多。本地测试也容易,很快就搞定,但是到了服务器上,配置了很久。
  3. 每个人的服务器环境不同,我写的方法不一定适应你的情况,但是大同小异,多试试应该就OK。

配置步骤

1. Windows服务器。

我的服务器是安装的Windows Server 2012版本。

2. 安装Office。

想要调用PowerPoint的com组件,必须要在服务器上安装office,我选择的是安装office 2013 64位版本。
安装过程中,报了数次错误,我大概看了下,都是和日志写入什么的相关的,应该不会影响com组件,所以遇到错误我也一概忽略了。

3. php.ini配置。

我的php用的是7.2版本。
在php.ini文件中:
A. 将com.allow_dcom = true前面的#去掉。
B. 增加一行:extension=php_com_dotnet.dll
注意:老版本php中,extension=php_com_dotnet.dll是默认加#写在php.ini文件中的,7.2版本中没有写,但是我去php的ext文文件夹中看了一眼,是有php_com_dotnet.dll这个文件的,所以就放心的把extension=php_com_dotnet.dll加上了。

4.DCOM配置

在DCOM配置的问题上,网上有两个版本,我都列出来。
两个版本都需要先在cmd中输入dcomcnfg,然后会打开【组件服务】的窗口。
点击左侧树形目录中的【DCOM】后,再右侧找到Microsoft PowerPoint幻灯片后,在上面点击右键选择【属性】,会弹出属性窗口,切换到最右侧的【标识】标签,如下图所示:
file
要注意的是,如果你的服务器上没有安装Office PowerPoint,这个服务是找不到的。

版本1:【交互式用户】版本(有瑕疵)。

  1. 在【标识】标签里面选择【交互式用户】。
  2. 这时测试一下,会出现 ERR: Failed to create COM object powerpoint.application': 拒绝访问。的错误。
  3. 这时就需要进行下面的配置:
    切换到【安全】标签下。
    我的做法是在三个权限配置的地方都选择自定义:
    file
    然后,将以下几个用户都添加进去,并赋予全部权限:
    Everyone、NETWORK、SERVICE、Internet来宾用户(IUSER)、IIS、站点用户。

    问题:这样配置后的问题是,在远程桌面连接的情况下,程序运转是正常的,但是如果关闭远程桌面,则会报“因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码”的错误。所以这个版本的解决方案并不完美。

版本2:【下列用户】版本。

  1. 在【标识】标签里面选择【下列用户】。
  2. 然后通过【浏览】的方式选择Administrator用户,并输入密码。
    file
  3. 在版本1的基础上,再增加Administrator用户和Administrators用户组。

    其中的一个插曲是,当我选择了一个用户并输入密码想要保存的时候,报“8000401a”错误,网上查了下,需要在services.msc中开启server服务才可以。

6. 重启IIS,关掉安全狗。

以上配置完成后,重启IIS还是不能正常使用。我怀疑是服务器安全狗进行了限制,于是关掉了安全狗服务,但还是不行。

7. 重启服务器。

最后想到了重启大法,重启后,程序可以正常运转了。

总结

  1. 安全狗似乎不会对服务器调用DCOM组件做限制,至少我没有遇到。
  2. 重启后才生效的问题。有可能是因为安装了office后需要重启,也有可能是因为做完权限配置后需要重启。
  3. 除了上面提到的用户外,由于我的网站是通过nginx配置的SSL,所以我还加了很多用户,不知道是否有用,都列出来备查吧。
    file
  4. 还有就是在方案2中,添加Administrator账户时,似乎必须通过【浏览】按钮添加,如果直接写Administrator似乎会有问题。
  5. 网上还有说要在web.config中添加<system.web><identity impersonate="true" userName="用户名" password="密码" /></system.web>的,至少在我的服务器环境下这个方案没用。

参考过的文章:
https://blog.csdn.net/weixin_30520015/article/details/99214214
https://blog.csdn.net/taoyuanjsj/article/details/5319582
http://www.wangyang.me/2018/study_01/70.shtml
https://blog.csdn.net/luochuan/article/details/8806705
https://www.heiyu100.cn/news114.html

PHP正则表达式函数preg_match_all()用法

1. preg_match_all()

preg_match_all("/匹配模式/",$字符串,$匹配结果);

1.1 $匹配结果

匹配出来的结果存储在多维数组中,从多维数组中获取匹配结果的方式如下:

1.1.1 如果不含()子表达式

如果匹配模式中不含()子表达式的话,所有匹配结果都存储在返回结果第一个维度的第一个元素中,即:

$匹配结果[0][0];
$匹配结果[0][1];
$匹配结果[0][2];
1.1.2 如果含()子表达式

如果匹配模式不含()子表达式的话,整体匹配结果存储在返回结果第一个维度的第一个元素中;子表达式的匹配结果则顺延至返回结果的第一个维度的第二个、第三个...元素中,即:

//整体匹配结果
$匹配结果[0][0];
$匹配结果[0][1];
$匹配结果[0][2];
//第一个子表达式匹配结果
$匹配结果[1][0];
$匹配结果[1][1];
$匹配结果[1][2];
//第二个子表达式匹配结果
$匹配结果[2][0];
$匹配结果[2][1];
$匹配结果[2][2];

1.2 $字符串

$字符串必须在一行中。如果不在一行,则再匹配是需要考虑换行符\r\n的问题。

2. 任务描述

通过PHP的SOAP获得了一个XML的字符串,需要对这个XML字符串中的内容进行提取。XML字符串内容如下:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
    <soap:Body>
        <dbs:resultset xmlns:dbs="http://www.royotech.com/">
        <record>
            <float_id>95551e1d7bf9430d80361a0d21d13cd3</float_id>
            <float_name>张三</float_name>
            <float_sex>男</float_sex>
            <float_native>北京市东城区</float_native>
            <float_card>110102199008080808</float_card>
            <float_address>福建省莆田区</float_address>
            <float_unit>福州市美术设计制作有限公司</float_unit>
            <float_unit_adress>福建省莆田区</float_unit_adress>
            <float_job>销售</float_job>
            <float_states>0</float_states>
        </record>
        <record>
            <float_id>be7b91fed02641108ddb612bf15de26c</float_id>
            <float_name>李四</float_name>
            <float_sex>男</float_sex>
            <float_native>北京市东城区</float_native>
            <float_card>110103199106060606</float_card>
            <float_address>新乡市</float_address>
            <float_unit>新乡市电子技术有限公司</float_unit>
            <float_unit_adress>新乡市</float_unit_adress>
            <float_job>IT开发</float_job>
            <float_states>0</float_states>
        </record>
        </dbs:resultset>
    </soap:Body>
</soap:Envelope>

3. 代码

<?php
    $xml = '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/><soap:Body><dbs:resultset xmlns:dbs="http://dbservices.tongtech.com/"><record><float_id>95551e1d7bf9430d80361a0d21d13cd3</float_id><float_name>庄正卿</float_name><float_sex>男</float_sex><float_native>北京市东城区</float_native><float_card>110101199003077950</float_card><float_address>福建省莆田区</float_address><float_unit>福州市益聚美术设计制作有限公司</float_unit><float_unit_adress>福建省莆田区</float_unit_adress><float_job>销售</float_job><float_states>0</float_states></record><record><float_id>be7b91fed02641108ddb612bf15de26c</float_id><float_name>逯俊郎</float_name><float_sex>男</float_sex><float_native>北京市东城区</float_native><float_card>110101199003078793</float_card><float_address>新乡市</float_address><float_unit>新乡市欣丰电子技术有限公司</float_unit><float_unit_adress>新乡市</float_unit_adress><float_job>IT开发</float_job><float_states>0</float_states></record></dbs:resultset></soap:Body></soap:Envelope>';

    $records = null;
    preg_match_all("/\<record\>.*?\<\/record\>/",$xml,$records);

    $tags = [   "inspect_id",
                "report_time",
                "recorder_name",
                "report_name",
                "report_dex",
                "report_card",
                "report_phone",
                "report_dec",
                "result",
                "inspect_states",
            ];

    foreach ($records as $record){
        foreach ($tags as $tag){
            echo $tag . " " . getTagInfo($tag,$record[0]) . "<br/>";
        }
    }

    function getTagInfo($tagName,$str){
        $arr_tag = "";
        preg_match_all("/\<".$tagName."\>(.*?)\<\/".$tagName."\>/",$str,$arr_tag);
        return $arr_tag[1][0];
    }
?>

Composer是什么?Windows和Linux下的Composer安装方法

Composer是什么?

  1. 比如我们在做PHP开发的时候,希望使用PHPExcel库进行Excel文件的处理。在没有Composer的时候,我们需要手工从PHPExcel官网上把相关库文件下载到本地,然后加入到PHP项目中。有了Composer,这个过程就可以交给Composer完成了。
  2. Composer是PHP中用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer会帮你安装这些依赖的库文件。
  3. 如果你做过Java开发,你一定知道MAVEN;Composer和MAVEN的功能类似。
  4. 使用Composer必须保证PHP项目版本在PHP5.3以上。

Composer的代码库

1. Packagist

https://packagist.org/
file
Packagist是Composer的官方数据源,其数据主要同步自GitHub。

2. 国内镜像

https://mirrors.aliyun.com/composer/
https://mirrors.cloud.tencent.com/composer/
https://pkg.phpcomposer.com
https://php.cnpkg.org
这里面还是推荐使用阿里云的镜像

Windows下Composer安装

1. 安装PHP+APACHE+MySQL环境。

这里使用集成化安装工具WAMP。安装后的PHP版本为7.0.10

2. 下载Composer的Windows安装包。

官方下载地址:https://getcomposer.org/download/

3. 安装程序。

file

4. 安装完成。

安装完毕后,在cmd中输入composer,出现如下界面代表安装完成:
file
注意,如果你之前打开了cmd界面,需要先关闭cmd后再打开才能生效。

Linux下Composer安装

1. 下载Composer.phar

wget https://getcomposer.org/download/1.9.3/composer.phar

如果非常慢就用阿里云的地址:

wget https://mirrors.aliyun.com/composer/composer.phar

2. 安装

php composer.phar

file
成功后能够看到和Windows安装后类似的画面:

3. 移动到bin目录方便使用

将composer.phar移动到bin目录并去掉扩展名,这样在bash的任何位置都可以直接使用composer命令了:

mv composer.phar composer

修改文件夹权限:

chmod +x /usr/bin/composer

在命令行里面直接输入就可以运行了:

composer

配置镜像地址

在Windows和Linux中操作方法相同,
打开 https://developer.aliyun.com/composer, 按照里面的提示输入以下命令:

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

设置好了后可以用以下命令查看当前镜像地址:

composer config -g -l

测试一下

  1. 我们以Windows为例,在cmd中切换到目标php文件夹。
  2. https://packagist.org/ 网站随便搜索个依赖,比如monolog。按照网站提示,在cmd中就可以用以下命令获得monolog:
    composer require monolog/monolog

    file
    运行完成后,在目标文件夹中就会出现对应的composer文件:
    file

  3. 在同目录下建立一个测试文件,比如index.php,按照网站提示在文件中加入如下代码:
    <?php
    require "vendor/autoload.php";//这句必须加上
    use Monolog\Logger;
    use Monolog\Handler\StreamHandler;
    // create a log channel
    $log = new Logger('name');
    $log->pushHandler(new StreamHandler('your.log', Logger::WARNING));
    // add records to the log
    $log->warning('Foo');
    $log->error('Bar');
    ?>

    看下你的文件夹里面,your.log文件已经生成啦:
    file

CentOS 8下安装Apache+PHP+MySQL环境

安装PHP和Apache

在CentOS 8中,安装PHP和Apache是非常简单的,只需要一句话:

yum install php

在安装PHP的时候,会默认将httpd(Apache)安装好。
file

配置Apache

1. 修改httpd.conf配置

编辑/etc/httpd/conf/httpd.conf文件,将AllowOverride的对应值改为all。
file

2. 放行80端口

firewall-cmd --permanent --zone=public --add-port=80/tcp

3. 重启apache和防火墙

systemctl restart httpd
systemctl restart firewalld

4. 测试

在/var/www/html下新建index.php里面写上phpinfo()测试一下:
file

安装MySQL

有关MySQL安装请参考:http://www.moonlightgate.com/archives/173