Lighttpd кэширует вывод shell_exec()?

У меня есть PHP-скрипт, который запускает внешний процесс.

Внешний процесс выводит строку JSON с данными из системы, которые время от времени меняются.

Когда я запускаю внешний процесс, я ясно вижу, что строка JSON каждый раз меняется.

Однако, когда я вызываю свой PHP-скрипт с помощью AJAX из веб-браузера, строка JSON не обновляется после первого вызова PHP-скрипта.

Единственный раз, когда строка 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"  => ""
)

ИЗМЕНИТЬ

Согласно следующей ветке продуктов Google, человек по имени johnjbarton упоминает следующее:

Хорошо, я поговорил с экспертом по кешу Chrome. Проблема в моем случае, скорее всего, описана в этой ошибке: Ошибка 30862 - Динамически вставленные подресурсы не проверяются повторно, даже когда содержащий документ перезагружается https://bugs.webkit.org/show_bug.cgi?id=30862

Принудительное обновление только принудительно загружает ресурс на внешней странице. Он не принудительно обновляет загруженные ресурсы XHR. Это практически все ресурсы приложения додзё.

Когда я смотрю на консоль Chrome в разделе 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;
}

?>


person vaid    schedule 29.02.2016    source источник
comment
Можете ли вы опубликовать соответствующие части конфигурации lighttpd?   -  person Will    schedule 29.02.2016
comment
В вашем браузере проверьте сетевой трафик при выполнении вызовов AJAX, вполне вероятно, что результат кэшируется в вашем браузере. Проверьте с помощью любой JS-фреймворка, который вы используете для AJAX, как избежать кэширования ответов AJAX, если вы не используете фреймворк, который вам придется, например. добавить отметку времени к каждому URL-адресу запроса.   -  person Eborbob    schedule 29.02.2016
comment
@Eborbob о, хорошо. Итак, как мне добавить временную метку и где я могу добавить эту временную метку? Я добавляю его на стороне клиента или на стороне сервера? Есть ли у вас какие-либо предложения о том, где я могу прочитать больше об этом? И наконец: почему метка времени может изменить поведение кэширования браузера?   -  person vaid    schedule 29.02.2016
comment
@Eborbob, ты имеешь в виду что-то вроде ответа № 2 на этом SO? stackoverflow.com/questions/367786/prevent-caching-of -ajax-вызов   -  person vaid    schedule 29.02.2016
comment
Скажем, вы делаете AJAX-вызов http://example.com/ajax.php?action=ping, чтобы браузер не кэшировал ответ, который вы могли бы вместо этого вызвать http://example.com/ajax.php?action=ping&nocache=1456765882. Поскольку этот URL-адрес отличается, браузер отправит запрос на сервер, а не получит что-то из своего кеша.   -  person Eborbob    schedule 29.02.2016
comment
Да, ответ, на который вы ссылаетесь, верен, если вы используете jQuery.   -  person Eborbob    schedule 29.02.2016
comment
@Eborbob Я пытался изменить URL-адрес для каждого запроса, добавляя ?rnd=‹случайное число›, но все равно получаю те же результаты. Любое другое предложение?   -  person vaid    schedule 29.02.2016
comment
Проверьте журналы Lighttpd, чтобы убедиться, что запросы AJAX доходят до сервера. Это должно помочь вам сузить проблему до стороны сервера или клиента.   -  person Eborbob    schedule 01.03.2016
comment
Какой заголовок Content-Type вы используете для отправки JSON?   -  person Will    schedule 01.03.2016
comment
@Eborbob, судя по журналам, все в порядке. Регистрируется каждый отдельный запрос, каждый со своим совпадающим случайным числом в конце. Так что в этом нет ничего плохого. Мое подозрение теперь такое же, как и ваше первоначальное подозрение; браузер кэширует результаты. Однако на этот раз полностью игнорируя измененный URL.   -  person vaid    schedule 01.03.2016
comment
@Буду ли я использовать header('Content-type: application/json');   -  person vaid    schedule 01.03.2016
comment
Пожалуйста, смотрите редактирование в моем вопросе.   -  person vaid    schedule 01.03.2016
comment
Я думаю, вам лучше показать свой PHP-код.   -  person Eborbob    schedule 01.03.2016
comment
@Эборбоб конечно. Я добавил код своего PHP-скрипта в конец моего вопроса.   -  person vaid    schedule 01.03.2016
comment
Какой процесс вы выполняете (/home/debian/myProcess/myProcess в коде выше)? Что произойдет, если вы измените его на /bin/date или что-то еще в этом роде?   -  person Eborbob    schedule 01.03.2016
comment
Процесс /bin/dateработает безупречно. Время обновляется и принимается веб-браузером   -  person vaid    schedule 01.03.2016
comment
Я нашел проблему.   -  person vaid    schedule 02.03.2016


Ответы (1)


Итак, я нашел причину проблемы.

Процесс, который я выполняю и который я называю myProcess, запускает сам процесс с именем iwlist.

iwlist, кажется, требует запуска от имени пользователя root.

Поскольку мой PHP-скрипт выполняет процесс ЛЮБОЙ от имени пользователя сервера LIGHTTPD с именем www-data, процесс myProcess будет выполняться как www-data, который, в свою очередь, пытается выполнить iwlist также как www-data, и именно здесь все потерпело неудачу.

Мое решение состояло в том, чтобы запустить myProcess через демона, который выгружает вывод myProcess в файл, который может прочитать мой PHP-скрипт.

Это работает отлично. `

person vaid    schedule 02.03.2016