Ho aggiornato di recente uno dei miei server e da allora, ho un problema con alcuni comandi PHP specifici (vedi sotto). Credo che sia un problema di configurazione, ma ho già esaminato un paio di cose e non ne so più. Così forse uno di voi ha una buona idea:file_exists o getimagesize funzionano solo con percorsi di file assoluti locali, ma non con URL in PHP
Sto usando il seguente codice al fine di visualizzare sia un logo standard su un sito Intranet o un definito logo utente:
if(L_HEADER) {
$logo = L_HEADER;
}
else {
$logo = 'logo.png';
}
$properties = getimagesize(CONFIG_URL . 'images/' . $logo)
L_HEADER e CONFIG_URL sono costanti con i valori predefiniti (un altro file):
- L_HEADER contiene "opb_beta.png"
- CONFIG_URL contiene "http://billing.intranet.opb/"
Concatenazione funziona correttamente, che è anche confermata dal messaggio di errore del file di log di Apache:
PHP Warning: getimagesize (http://billing.intranet.opb/images/opb_beta.png): failed to open stream: HTTP richiesta non riuscita! HTTP/1.1 404 Not Found
in /var/www/billing/templates/header.inc.php on line 42
Quindi la prima conclusione ovvia sarebbe: il percorso è sbagliato. Ma non è, credimi. L'ho controllato come 1.000 volte. In effetti, la prima curiosità è che l'immagine viene visualizzata e fa riferimento correttamente un paio di righe più in basso nel codice dello stesso file:
echo '<img src="' . CONFIG_URL . 'images/' . $logo . '"
width="' . $properties[0] . '" height = "' . $properties[1] . '" />";
Come ottengo l'errore citato sopra, l'altezza e la larghezza sono "0 ", ma guardando il codice sorgente, l'URL va bene, l'accesso manualmente apre l'immagine e quando si sostituiscono larghezza e altezza con valori manuali, l'immagine viene visualizzata bene.
più curioso però (e anche il mio attuale Finx), quando si cambia il getimagesize al seguente, funziona bene:
$properties = getimagesize($_SERVER['DOCUMENT_ROOT'] . /public_html/images/' . $logo);
io dire che sto usando reindirizzamento di Apache; questo è il motivo per cui nell'URL non vedi "public_html", mentre nel percorso assoluto del secondo esempio lo vedi.
Lo stesso accade con "file_exist". L'URL non funziona, il percorso locale assoluto per lo stesso file lo fa.
Un'altra curiosità: in un altro pezzo di codice, sto verificando online gli aggiornamenti. Lì, sto usando un URL "reale" pubblico con file_exists e fopen. Mi sembra che questa e funziona perfettamente bene:
if(file_exists('http://desk.co.cr/df_stable.txt') {
if(($handle = fopen('http://desk.co.cr/df_stable.txt', 'r')) !== FALSE) {
// some other code
}
}
Ora, le cose che ho già controllato:
- I permessi dei file sono impostate correttamente, per tutto il percorso, con www-data di essere gruppo e proprietario della tutti i file e accesso in lettura e scrittura per il file immagine
- allow_url_fopen in "On".
- open_basedir è impostato su "nessun valore" e non c'è override nelle definizioni degli host virtuali di Apache.
- il file esiste definitivamente e la sintassi + percorso sono corretti.
Alcune informazioni di fondo:
- Server è in esecuzione su Ubuntu 14.04 LTS
- Apache 2.4.7
- PHP 5.5.9
Per ora, io sono fuori idee.
hai guardato al access_log per vedere quale URL è stato realmente richiesto? forse hai una riscrittura impeccabile. –
File host del server forse? Cosa succede quando si esegue un nslookup sul server per il dominio? –
@MarcB Sì, ho controllato access_log e error_log. Entrambi mostrano un URL corretto. Ho anche copiato + incollato in un browser per controllare e l'immagine si presenta bene. – Sebastian