Persistenza delle risorse file in PHP

Sto sviluppando una semplice applicazione web di chat basata sul protocollo MSN. Il server comunica con il server MSN tramite una risorsa file restituita da fsockopen () . Il client accede al server tramite XMLHttpRequest . Il server accede inizialmente e printing l'elenco dei contatti (formattato in una tabella HTML) che il client riceve tramite responseText () dell'object XMLHttpRequest .

Ecco il problema La risorsa file responsabile della comunicazione con il server MSN deve essere mantenuta triggers affinché tutte le funzioni relative alla chat funzionino (creando conversazioni, tenendo traccia delle modifiche allo stato offline / online, ecc.). Tuttavia, affinché XMLHttpRequest sia completato, lo script PHP deve terminare l'esecuzione. Il che significa che il client non riceverà alcuna risposta da XMLHttpRequest mentre la session di chat è in corso.

Cosa c'è di peggio è che una risorsa file non può essere serializzata, il che significa che non posso semplicemente archiviare la session di chat in un segnaposto $_SESSION [] .

Quindi, la mia domanda è, c'è qualche modo per me per 'trasferire' una risorsa di file da un file all'altro?

Nella maggior parte delle lingue non è ansible passare gli handle di file tra le applicazioni: la maggior parte dei sisthemes operativi AFAIK non lo consente.

La soluzione è di mantenere il process del server in esecuzione come demone – il che significa che deve essere eseguito al di fuori del server web.

Vedere

http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html

e

http://www.phpclasss.org/browse/package/5758.html

C.

Una ansible soluzione sarebbe quella di avere uno script PHP sul lato server che non finisce proprio; in questo modo, la risorsa corrispondente alla chiamata fsockopen non verrebbe mai cancellata e la connessione non verrebbe chiusa.

A questo proposito, potresti voler cercare il termine " cometa "; l'idea di base è di avere uno script che gira per sempre sul lato server, che invia aggiornamenti al client each volta che è necessario.

Invece di fare in modo che il browser invii una richiesta Ajax each X secondi, manterrai una connessione aperta tra il client e il server: tieni presente che, sfortunatamente, si dice spesso che PHP non sia lo strumento migliore per quel lavoro …

Su stackoverflow: [php] cometa

La risorsa non può sopravvivere fino alla fine della richiesta a less che non si crei un'estensione PHP che lo fa (come le connessioni MySQL persistenti con mysql_pconnect() ad esempio). Tuttavia, è ansible utilizzare la tecnologia Comet e, ad esempio, il protocollo Bayeux supportto dal Dojo Toolkit, tra gli altri, per parlare al server. Ciò richiederebbe un server standalone o una richiesta di lunga durata, in questo caso assicurerà che i limiti di tempo di PHP e webserver non possano uccidere quella richiesta per l'esecuzione troppo lunga.

Grazie a tutti per i suggerimenti. Prima di iniziare questo progetto avevo preso in considerazione l'utilizzo della tecnologia comet, ma ho deciso contro (PHP / Apache non sembra funzionare bene). Ho trovato una soluzione hackerata, non la più elegante ma praticabile.

Uno script PHP è responsabile della comunicazione del server MSN, verrà eseguito finché l'utente è attivo. Scrive i dati in un file (email_out), oltre a leggere i dati da un file (email_in). Ogni volta che il client invia una richiesta AJAX, uno script PHP separato scriverà tutti i dati POST sul file (email_in) e restituirà tutti i dati da (email_out). Entrambi gli script non leggeranno / scrivono i dati fino a quando non avranno finalmente accesso al file (dato che ci sarà un conflitto per la risorsa file).

Non lo so, suggerimenti? Questa non è la certezza dei mezzi più efficaci per fare le cose, ma è davvero l'unica soluzione PHP / Apache a cui possa pensare.