Sto scrivendo un sistema per un'applicazione browser che memorizzerà alcuni particolari script php in un database e quindi li estrarrà ed eseguirli quando necessario. All'inizio ho provato a usare exec() e piping per riprodurre l'output di uno script che ha ottenuto gli script dal database e li ha stampati. Questo ha funzionato in un caso d'uso, ma non in tutti, e si sente fragile comunque, quindi sto cercando un modo migliore.Includi dallo stream "php: // memory"
Ora sto tentando di farlo utilizzando un flusso di file PHP in memoria. Ad esempio:
$thing = <<<'TEST'
<?php
$thing = array();
print "Testing code in here.";
var_dump($thing);
?>
TEST;
$filename = "php://memory";
$fp = fopen($filename, "w+b");
fwrite($fp, $thing);
//rewind($fp);
fclose($fp);
include "php://memory";
Tuttavia, non viene stampato nulla quando viene eseguito lo script. Questo è possibile anche con questo mezzo, e se no, c'è un altro modo per farlo? Sto cercando di evitare di dover scrivere file temporanei e leggere da loro, poiché sono sicuro che l'accesso al filesystem rallenterebbe le cose. C'è un URL che posso fornire a "include" in modo che legga il flusso di memoria come se fosse un file?
Non penso che lo eval()
faccia ciò, poiché, se ricordo bene, è limitato a una sola riga.
Inoltre, per favore nessuna risposta "eval = include = hell". Gli utenti non amministratori non hanno accesso a scrivere gli script memorizzati nel database, so che questo richiede un trattamento speciale per il ciclo di vita della mia applicazione.
mio parola, ero totalmente sbagliato. Eval funziona per più di una linea. Non l'ho nemmeno provato lol ... supponiamo che funzionerà allora. Tuttavia, sono ancora curioso dei flussi di file archiviati in memoria, quindi se qualcuno ha una risposta a questa parte, sarei grato. –
C'è un motivo particolare per cui non si desidera creare file? Il filesystem è un database per i file. E: OMG NON FARLO CHE È PERICOLOSO. Non importa se solo gli amministratori possono scrivere su questi file php, non appena si ha un bug di SQL injection o qualcuno riesce a ottenere/indovinare/rivelare le proprie credenziali MySQL -> insta-remote-code-execution. – mensi