Lighttpd缓存shell_exec()输出?

时间:2016-02-29 03:17:41

标签: php json ajax lighttpd shell-exec

我有一个运行外部进程的PHP脚本。

外部进程输出一个JSON字符串,其中包含来自系统的数据,该数据随时会发生变化。

当我运行外部进程时,我可以清楚地看到JSON字符串是 每次运行都不同。

但是,当我从Web浏览器使用AJAX调用我的PHP脚本时,在第一次调用PHP脚本后,JSON字符串不会更新。

JSON字符串更新的唯一时间是我刷新页面或在我进入网站时手动运行外部进程。

为什么会这样?

LIGHTTPD是否缓存输出?

修改

这是我的LIGHTTPD配置文件内容:

server.modules = (
    "mod_access",
        "mod_cgi",
    "mod_alias",
    "mod_compress",
    "mod_redirect",
#       "mod_rewrite",
)

server.document-root        = "/var/www"
server.upload-dirs          = ( "/var/cache/lighttpd/uploads" )
server.errorlog             = "/var/log/lighttpd/error.log"
server.pid-file             = "/var/run/lighttpd.pid"
server.username             = "www-data"
server.groupname            = "www-data"
server.port                 = 80


index-file.names            = ( "index.php", "index.html", "index.lighttpd.html" )
url.access-deny             = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

compress.cache-dir          = "/var/cache/lighttpd/compress/"
compress.filetype           = ( "application/javascript", "text/css", "text/html", "text/plain" )

# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"

$HTTP["url"] =~ "/cgi-bin/" {
        cgi.assign = ( "" => "" )
}

cgi.assign      = (
        ".cgi"  => ""
)

修改

According to the following Google Product thread名为johnjbarton的人提及以下内容:

  

好的,我采访了Chrome缓存专家。我的问题非常严重   可能在这个bug上描述:Bug 30862 - 动态插入   即使包含文档,子资源也不会重新生效   重新加载https://bugs.webkit.org/show_bug.cgi?id=30862

     

强制刷新仅强制在外部页面中加载资源。它   不会强制刷新XHR加载的资源。这几乎是   道场应用程序中的所有资源。

当我在Network部分看到镀铬控制台时,它说 我的网站发出的所有请求都是XHR类型。

这可能与某种程度有关吗?

修改

我的请求标题是

Accept */*

Content-Type application/x-www-form-urlencoded

非常重要的编辑 我编辑了我的PHP脚本,以便将执行过程的结果附加到日志文件中。

事实证明,过程的输出始终是相同的。

但是,当我手动运行该过程时,它会不断按预期更改。

在我看来好像LIGHTTPD正在缓存它执行的进程的输出。

修改

这就是我的PHP脚本:

<?php
session_start();
if(!isset($_SESSION['user'])){
    header("Location: /");
} else {
    header('Content-type: application/json');
    $output = shell_exec('/home/debian/myProcess/myProcess');
    file_put_contents("/var/log/lighttpd/access.log", $output, FILE_APPEND | LOCK_EX);
    echo $output;
}

&GT;

1 个答案:

答案 0 :(得分:1)

好的,所以我找到了问题的原因。

我正在执行的流程(我称之为myProcess)运行一个名为iwlist的流程。

iwlist似乎需要以root身份运行。

由于我的PHP脚本以名为www-data的LIGHTTPD服务器用户执行 ANY 进程,因此进程myProcess将作为www-data执行,而iwlist依次尝试同时将www-data作为myProcess执行,这就是失败的原因。

我的解决方案是通过一个守护进程运行myProcess,该守护进程将type A = { a: string; parameters: parameter list } type B = { b: string; parameters: parameter list } 的输出转储到我的PHP脚本可以读取的文件中。

这完美无缺。 `