当Apache通过Task Planner启动时,在Windows 7上从PHP 5调用Excel到COM失败

嘿伙计们,这个问题不能太复杂.请提供一个解决方案,至少找出问题的根本原因.我目前正在编写一个应用程序,它通过COM控制Excel:该应用程序创建一个基于COM的Excel实例,打开一些XLS文件并读取其内容.情景一在Windows...

嘿伙计们,这个问题不能太复杂.请提供一个解决方案,至少找出问题的根本原因.

我目前正在编写一个应用程序,它通过COM控制Excel:该应用程序创建一个基于COM的Excel实例,打开一些XLS文件并读取其内容.

情景一

在Windows 7上,我使用具有系统管理员权限的xmapp-control启动Apache和mySQL.一切都按预期工作.基于PHP的控制器脚本按预期与Excel交互.

情景二

如果我将Apache和mySQL作为“后台作业”启动,则会出现问题.方法如下:

>我使用Windows 7 Task Planner创建了两个作业.一个运行apache_start.bat,另一个运行mysql_start.bat.
>在Windows 7启动时,这两个任务都以SYSTEM的身份运行.

Apache和mySQL按预期工作.具体来说,Apache提供来自客户端的HTTP请求,PHP可以与mySQL通信.

当我调用PHP控制器,它使用COM调用并与Excel交互时,我收到一个错误.

错误消息来自Excel [不是COM本身],如下所示:

> Excel无法读取指定的Excel文件
>由于名称不正确的工作表,Excel无法保存文件

有趣的是,第一次运行基于PHP的控制器脚本时,首先需要几秒钟来呈现错误消息.每次后续运行都会立即呈现错误消息.

Windows系统日志未显示单个问题报告条目.

注意,PHP程序和Apache实例没有改变 – 除了Apache的启动方式.

至少PHP控制器脚本完全能够读取文件系统,因为它通过某个目录的scandir()为XLS文件提供了pathes.

并发问题不能成为问题的原因.特定PHP控制器的单个实例与Excel交互.

有人可以提供详情,为什么会这样?或者提供隔离问题的最终原因的方法(例如,通过PowerShell 2脚本)?

UPDATE-1 :: 2011-11-29

正如提议的那样,我将Task Planner工作从SYSTEM切换到传统用户.作品. Apache和MySQL启动并处理请求.

不幸的是,关于Excel的情况并没有改变.不过,我看到了错误.

如前所述,EXCEL COM服务器启动.我可以通过COM实例更改各种设置(例如,禁止对话框)而不会出现问题.

调用此问题时会发生此问题:

$excelComObject->Workbooks->Open( 'PathToXLSFile' );

UPDATE-2 :: 2011-11-30

使用READABLE权限将帐户USER,GUEST和EVERYONE添加到XLS文件的访问控制列表中.没变.

以这种方式修改了应用程序,PHP部分将XLS文件的副本创建为临时文件,并将原始文件的内容移动到此文件中.只是为了确保问题不是由奇数文件/路径名强制的.

但问题仍然存在.

UPDATE-2 :: 2011-12-05

我将以这种方式发送EXCEL COM-Server方法,Excel创建一个空白文件并将其保存到/ tmp.让我们看看,如果Excel甚至无法读取此文件.

解决方法:

在过去(阅读:Vista之前)服务有一个名为“允许服务与桌面交互”的选项,允许服务产生窗口等.启动Vista,这是不再允许的.

我怀疑Excel失败了,因为它无法在此限制下运行.因此,在Win7安装中将其作为服务运行的任何尝试都将失败.

您可以使用Windows XP并允许Apache进程进行桌面交互,出于显而易见的原因我不建议这样做.

我将采用的另一种方法是创建一个PHP脚本,该脚本作为常规进程运行并在无限循环中侦听套接字.在Apache下运行的PHP脚本将通过本地套接字与辅助脚本通信,并使辅助脚本生成Excel.

这可能听起来很复杂,但事实上它并不是很多代码,它解决了你很快就会遇到的问题:你应该只运行一个Excel实例,否则你可能会遇到问题.辅助脚本可以对请求进行排队,逐个切换到Excel,然后在队列中取下一个.

本文标题为:当Apache通过Task Planner启动时,在Windows 7上从PHP 5调用Excel到COM失败

基础教程推荐