Newsgroup: it.comp.www.php
Titolo: Stronzata PHP: file status cache

Incredibile la colossale idiozia di questa funzionalità, un sistema di 
caching di informazioni riguardanti i file comune alle funzioni:
 
stat(), lstat(), file_exists(), is_writable(), is_readable(), 
is_executable(), is_file(), is_dir(), is_link(), filectime(), 
fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), 
filesize(), filetype(), fileperms().
 
Quindi tu chiami la funzione file_exists() per sapere se esiste un file 
perché cazzo ti serve sapere se quel file esiste, ADESSO, mica ieri!
 
Invece PHP potrebbe risponderti se quel file esisteva nel momento in cui 
ha cachato l'informazione. Ma si può essere così stupidi? Dovrebbe 
essere evidente che se chiamo la funzione file_exists() è perché ho la 
stracazzo di esigenza di sapere se il file esiste ora!
 
Pazzesco.
 
E non si può neanche disabilitare.
 
Ho dovuto riempire il codice di clearstatcache().

 Ho dovuto riempire il codice di clearstatcache().
 
Devi fare cose ben strane, comunque. La cache muore con la fine dello 
script, non viene valorizzata se il file non esiste, e viene cancellata 
quando usi unlink.
 
clearstatcache dovrebbe essere un'eccezione, non la regola.
 
Bye.


Pare strano anche a me.
L'unica cosa che mi viene in mente è la gestione di un qualche tipo di 
spool, ma se ha questi problemi di concorrenza sarebbe meglio imho 
appoggiarsi ad un db
M
 
-- 
I fatti mi cosano

 Devi fare cose ben strane, comunque. La cache muore con la fine dello
 
Non mi pare una cosa così estrema. Devo leggere un file creato da altre 
pagine, verificando prima che ci sia e poi che non sia vuoto, in 
quest'ultimo caso aspettando un paio di secondi con ripetuti controlli 
che venga riempito.
 
Adesso ho scoperto che il ciclo di file_exists() e filesize() non 
serviva a un cazzo perché non mi veniva restituita una informazione 
aggiornata in tempo reale ma una informazione vecchia e sempre la stessa 
nonostante i ripetuti controlli.
 
E' veramente una cazzata che una funzione del genere che chiede una 
informazione su uno stato in tempo reale sia cachata. Come se chiedendo 
time() venisse restituito il primo time() chiamato nella pagina.

 spool
 
Direi di polling piuttosto, in ogni caso il fatto che la cache non sia 
disattibale (ini_set o altro), pare na mezza ciofeca anche a me...

Quindi tu hai un altra pagina/script che apre un file, ci scrive
dentro delle cose, e nel mentre tu da php apri il file (in lettura
spero), e con un ciclo for con uno sleep() provi a leggere quello che
il script ci mette dentro?
 
Ma finchè il suddetto script non chiude il puntatore del file, il file
stesso non dovrebbe sembrare vuoto ad altre applicazioni che cercano
di leggerlo?

informazione su uno stato in tempo reale sia cachata.
 
Perche' lo "stato in tempo reale" che chiedi alla stat() e' ESSO STESSO
in linea di principio cachato. Così, per quella strada ti cacha l'orso.
 
Su una stessa macchina puoi usare le primitive di IPC (non a caso, vuol
dire 'Inter Process Communication' :-) ). Molto piu' veloci, e di norma
"collaborano" con lo schedulatore, in modo che gli script che aspettano
una condizione occupano MOLTA meno CPU del normale.
 
In rete, se già hai un database, puoi usarlo per implementare un mutex.
 
Su larga scala, dai una occhiata ad AMQP (anche cloudabile. A proposito
di larghe scale).
 
Oppure puoi implementare un broker dentro il processo che, adesso, crea
il file, che apra un socket e fornisca informazioni sul proprio stato a
eventuali client. Idealmente (ma le cose si complicano), potresti anche
fare in modo che i client si registrino ed il broker comunichi loro che
possono procedere, magari accodandoli:
 
(pseudocodice del broker)
	open socket
	start work
	on receiving "REGISTER ip"
		clients[] = { ip, socket, ... }
		write "OK" (o magari FAIL...)
	if work-to-do
		continue
	end
 
	foreach client in clients
		write(ip, "READY")
		// gestire errore di lettura dal client magari morto
		finish = read(ip)
		// gestire timeout dal client magari morto
		if 'OK' == finish
			continue
		// Gestire errore verificatosi lato client
	end
 
(pseudocodice del client)
	open client socket (broker)
	write "REGISTER myIp"
	status = read
	if 'OK' == status:
		status = read
		// E qui il programma si addormenta
	else:
		...
		exit
	if 'READY' == status:
		// Abbiamo via libera
		...
		write 'OK'
		exit
 
Leonardo
 
-- 
Tell us whether you spy, in the light of the morn,
what saluted was fiercely at the fall of the past day:
whose pips and whose bands in the very heart of the fray
bravely floated from the bulwarks to which we were sworn?