0

执行摘要:Apache 默默地失败了 SSI 包含,其中包含的 HTML 是由与 SQLite 和/或 pthread 链接的 C++ 程序生成的。当 C++ 不使用 SQLite 时,SSI 包含工作。

更长的版本:我有两个非常相似的 C++ 程序,它们产生 SSI 虚拟包含所需的输出。两者都为 HTML 生成大约 100 个选项的列表select。其中一个包含按预期工作,但另一个什么也不做。

  1. 两个程序(独立运行时)在 stdout 上产生完全相同的输出,而在 stderr 上没有任何输出。因此,原则上,就 Apache 而言,它们的行为应该相同,但事实并非如此。
  2. 工作的程序(版本A)是简单的独立 C++ 代码,它使用 STL 生成一个字符串,该字符串被写入cout;没问题。
  3. 失败的程序(版本B)稍微复杂一些。它是 C 和 C++ 的混合体,包括一个嵌入式 SQLite 数据库,通过 C API 与之对话。SQLite 也使用 pthread。
  4. 版本B在链接到静态和动态 SQLite 代码时都会失败。静态和动态版本都依赖于 pthreads 共享库。
  5. Apache 在运行版本时不会在错误日志中生成任何内容B,但它也不会将任何内容替换到 HTMLselect中。我可以很容易地让 Apache 生成错误消息( #include例如,通过在 HTML 中指定错误的可执行文件名称),所以我很确定 Apache 实际上至少确实尝试执行该程序。
  6. 两者都是Avalgrind B-clean。
  7. Apache 2.2.16、Ubuntu 10.10、prefork MPM
  8. 我根本无法得到任何输出ScriptLog,所以我可能设置不正确。我已设置LogLeveldebug,但它仍然没有告诉我有关脚本执行的任何信息。

有任何想法吗?谢谢。

4

1 回答 1

0

嗯,这很烦人。该数据库是 cgi-bin 目录中的符号链接,它指向其他地方。apache 用户对指向位置的最后一个目录没有搜索权限。如果我su'ed 到 Apache 用户,然后手动运行 CGI 程序,它会返回 400 错误消息。但是,这并没有到达 Apache error.log,即使LogLevel设置为debug,我也无法获得任何ScriptLog输出,并且 firebug 在 net 选项卡中没有显示任何内容。当我更改目录权限时,一切正常。

于 2013-10-27T21:45:05.740 回答