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

Calling Excel from PHP 5 through COM fails on Windows 7 when Apache started through Task Planner

大家好,这个问题不能太复杂。请提供一个解决方案,至少找出问题的最终根本原因。

我目前正在编写一个应用程序,它通过 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 对话。

当我调用使用 COM 调用 Excel 并与 Excel 交互的 PHP 控制器时,我确实收到了一个错误。

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

  • Excel 无法读取指定的 Excel 文件
  • 由于工作表名称错误,Excel 无法保存文件

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

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

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

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

并发问题不可能是问题的原因。特定 PHP 控制器的单个实例与 Excel 交互。

问题

谁能提供详细信息,为什么会这样?或者提供隔离问题最终原因的方法(例如,通过 PowerShell 2 脚本)?

UPDATE-1 :: 2011-11-29

按照建议,我将 Task Planner 作业从 SYSTEM 切换到常规用户。作品。 Apache 和 MySQL 启动并处理请求。

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

如前所述,EXCEL COM 服务器启动。我可以通过 COM 实例毫无问题地更改各种设置(例如抑制对话框)。

调用这个时出现问题:

1
$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 甚至无法读取此文件。


进入任务计划器,让一切以本地用户身份运行。这可能需要您输入密码,如果您还没有密码,请创建一个。

Excel 是一个用户级应用程序,不应作为系统运行。我敢肯定有办法绕过它,但你应该让一切运行在正确的水平。

让 Apache 在用户级别运行不是问题。


尝试创建以下目录:

1
2
3
C:\\Windows\\SysWOW64\\Config\\Systemprofile\\Desktop

C:\\Windows\\System32\\Config\\Systemprofile\\Desktop

它对我有用:-)

http://social.msdn.microsoft.com/Forums/en-US/innovateonoffice/thread/b81a3c4e-62db-488b-af06-44421818ef91


在过去(阅读:Vista 之前)服务有一个名为"允许服务与桌面交互"的选项,它允许服务生成窗口等。从 Vista 开始,这不再被允许。

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

您可以使用 Windows XP 并允许与您的 Apache 进程进行桌面交互,出于明显的原因,我并不真正推荐这样做。

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

这听起来可能很复杂,但实际上代码并不多,而且它解决了您很快就会遇到的问题:您应该只运行一个 Excel 实例,否则您可能会遇到问题。辅助脚本可以对请求进行排队,将请求一个接一个地交给 Excel,然后将下一个放入队列中。