Sto provando a creare un file "virtuale" senza utilizzare né memoria né file temporaneo. Il file "virtuale" deve passare un controllo effettuato con file_exists()
senza generare alcun errore o avviso se utilizzato con require
o include
.Come creare un file falso/"virtuale"?
consente di implementare i propri gestori di protocollo e flussi per l'uso con all the other filesystem functions (come
fopen()
,fread()
ecc).
... dove file_exists()
è uno di questi. The docs page stati:
A partire da PHP 5.0.0, questa funzione può essere utilizzata anche con alcuni wrapper URL. Fare riferimento a Supported Protocols and Wrappers per determinare quali wrapper supportano la famiglia di funzionalità
stat()
.
Il mio tentativo non era quello di costruire una consuetudine, file di involucro virtuale
class VirtualFileWrapper
{
public $context;
public function stream_open($path, $mode, $options, &$opened_path)
{
return TRUE;
}
public function stream_stat()
{
var_dump(__METHOD__);
$data = [
'dev' => 0,
'ino' => getmyinode(),
'mode' => 'r',
'nlink' => 0,
'uid' => getmyuid(),
'gid' => getmygid(),
'rdev' => 0,
'size' => 0,
'atime' => time(),
'mtime' => getlastmod(),
'ctime' => FALSE,
'blksize' => 0,
'blocks' => 0,
];
return array_merge(array_values($data), $data);
}
}
stream_wrapper_register('virtual', 'VirtualFileWrapper');
$file = fopen("virtual://foo", 'r+');
// Executes VirtualFileWrapper::stream_stat()
fstat($file);
// Executes no VirtualFileWrapper method
file_exists($file);
Mentre la funzione fstat()
esegue il metodo, file_exists()
non esegue alcun metodo di classe flusso.
Come posso far funzionare un wrapper stream virtuale (con file_exists()
)?
Sono pienamente consapevole che tempnam(__DIR__, '')
passerà entrambi:
var_dump(tempnam(__DIR__, ''));
Returnstrue
require tempnam(__DIR__, '');
Nessun errore
ma io non voglio usare un file temporaneo in quanto non vi potrebbe essere un modo migliore (prestazioni saggio).
Non è possibile. file_exists() si aspetta una stringa come argomento. È possibile passare in un oggetto che implementa il metodo magico __toString(), ma in questo caso file_exists eseguirà 'stat()' quella stringa e non riuscirà, perché il file non esiste realmente. –
@MarcB In realtà [** Drupal ** ha funzionato] (http://drupal.stackexchange.com/a/24233/55237). Non riuscivo proprio a capire come la roba di 'vfsStream' sia solo quella incasinata nella fonte. – kaiser
Perché stai provando a realizzare con questo? Penso che creare un file falso sia una pratica molto strana. – Jehy