2016-02-29 1 views
2

J'ai un script PHP qui exécute un processus externe.Lighttpd mise en cache shell_exec() sortie?

Le processus externe génère une chaîne JSON avec des données du système qui change de temps en temps. Lorsque j'exécute le processus externe, je peux clairement voir que la chaîne JSON est différente chaque fois que je l'exécute.

Cependant, lorsque j'appelle mon script PHP en utilisant AJAX à partir d'un navigateur Web, la chaîne JSON n'est pas mise à jour après le premier appel au script PHP.

La seule fois où la chaîne JSON est mise à jour, c'est si je rafraîchis la page ou si j'exécute le processus externe manuellement lorsque je suis dans le site Web.

Pourquoi cela se produit-il?

Est-ce que LIGHTTPD cache la sortie?

EDIT:

Voici le contenu de mon fichier de configuration 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" => "" 
) 

EDIT

According to the following Google Product thread une personne appelée johnjbarton mentionne ce qui suit:

Ok, j'ai parlé avec un expert de cache Chrome. Le problème dans mon cas est très probablement décrit sur ce bogue: Bug 30862 - Dynamiquement inséré sous-ressources ne sont pas revalidation même lorsque le document contenant est rechargées https://bugs.webkit.org/show_bug.cgi?id=30862

La force rafraîchir la seule ressource des forces chargées dans la page externe . Il ne force pas l'actualisation sur les ressources chargées XHR. Qui est à peu près toutes les ressources dans une application dojo.

Quand je regarde la console de chrome dans la section Network il dit que toutes les demandes que mon site est de type fait ne soient XHR.

Est-ce que cela peut être lié?

EDIT

Les en-têtes de ma demande sont

Accept */*

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

TRÈS IMPORTANT EDIT J'ai modifié mon script PHP pour qu'il ajoute les résultats du le processus exécute dans un fichier journal.

Il s'avère que la sortie du processus est toujours la même.Cependant, lorsque j'exécute le processus manuellement, il change constamment comme prévu.

Il me semble que LIGHTTPD met en cache la sortie du processus qu'il exécute.

EDIT

Voici ce que mon script PHP ressemble:

<?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; 
} 

>

+0

Pouvez-vous publier des parties pertinentes de la configuration lighttpd? – Will

+0

Dans votre navigateur vérifier le trafic réseau lors des appels AJAX, il est très probable que le résultat est mis en cache dans votre navigateur. Vérifiez avec n'importe quel framework JS que vous utilisez pour AJAX sur la façon d'éviter la mise en cache des réponses AJAX, si vous n'utilisez pas un framework, vous devrez par exemple. ajouter un horodatage à chaque URL de requête. – Eborbob

+0

@Eborbob oh, d'accord. Alors, comment ajouter un horodatage et où dois-je ajouter cet horodatage? Est-ce que je l'ajoute du côté client ou côté serveur? Avez-vous des suggestions sur où je peux en lire plus à ce sujet? Et enfin: Pourquoi un horodatage changerait-il le comportement de la mise en cache du navigateur? – vaid

Répondre

1

Ok, donc je l'ai trouvé la cause du problème.

Le processus que j'exécute que j'appelle myProcess exécute un processus lui-même appelé iwlist.

iwlist semble avoir besoin d'être exécuté en tant que root.

Depuis mon script PHP exécute tout processus que l'utilisateur du serveur lighttpd appelé www-data, le processus myProcess sera exécuté comme www-data qui à son tour tente d'exécuter iwlist comme www-data aussi bien, et qui est là où tout a échoué.

Ma solution était d'exécuter myProcess via un démon qui déverse la sortie de myProcess dans un fichier que mon script PHP peut lire.

Cela fonctionne parfaitement. `