2012-05-08 19 views
8

- PHP 5.3.8 in esecuzione su Linux-get_browser() restituisce FALSE

Per iniziare, abbiamo risolto questo problema al punto in cui la funzione restituisce i valori attesi. Tuttavia ci sono ancora molte domande senza risposta che ho, e la "soluzione" è più di un hack-around che altro.

Ho trascorso la maggior parte della giornata su questo argomento, quindi abbi pazienza con me mentre spiego cosa è stato fatto. Per iniziare, il problema è che il valore restituito di get_browser() è FALSE, che non è un valore di ritorno documentato. Questo mi porta ad assumere che FALSE restituito significhi una sorta di stato di errore all'interno della funzione.

Il codice di prova, dopo molte iterazioni, è diventato solo un semplice var_dump(get_browser($agent, true)). Ho eseguito test sia con il passaggio diretto della stringa user-agent, sia senza il passaggio di argomenti, ad es. var_dump(get_browser()), che avevano tutti gli stessi valori di ritorno.

Ciò che è stato provato/verificato, con nessun cambiamento nel valore di ritorno:

Browscap.ini:

  • avere l'ultima versione, ha anche testato alcune versioni precedenti

Autorizzazioni:

  • bowscap.ini - autorizzazioni iniziali erano 644, ma ho provato di tutto 644-777

  • Directory Browscap.ini contenente - autorizzazioni iniziali erano 755, tentarono 777 così

  • verificato che PHP può accedere al file e directory con altre funzioni come file()

User Agent

  • provato passando una stringa agente manuale

  • provato passando $ _SERVER [ 'HTTP_USER_AGENT']

  • verificato la mia stringa user agent con un amico in una terra lontana - get_browser() restituito valori come previsto .

php.ini

  • I punti di impostazione BrowsCap alla posizione corretta

  • verificato di nuovo con echo count(file(ini_get('browscap')));

log di errore

  • Controllato PHP & Apache err o registra per qualsiasi menzione di 'browscap' o qualsiasi cosa anche strettamente correlata - niente di straordinario.

Struttura del file

Questo è dove ho il sospetto che l'errore viene da. browscap.ini vive in /var/php/, che ha le autorizzazioni appropriate come sopra indicato. Il mio pensiero era che forse PHP non poteva accedere a questa directory o qualcosa del genere. Tuttavia, questa directory è anche il luogo in cui sono archiviate le sessioni, quindi diventa meno probabile.

la "soluzione"

Che ha risolto il problema stava muovendo Browscap.ini per la directory web pubblico. Sono curioso di sapere perché questo è il caso, soprattutto dato il valore di ritorno non documentato. La "soluzione" funziona, ma non è la soluzione che pensavo avrei trovato ...

get_browser() ha requisiti di autorizzazioni speciali o qualcosa del genere? file() potrebbe accedere alla directory e file correttamente, ma get_browser() non potrebbe (presumibilmente). Ho praticamente tirato i miei capelli su questo tema e mi piacerebbe avere qualche soluzione!

Grazie per la lettura!

+1

A cosa stai usando questa funzione? L'intestazione user-agent e il suo riconoscimento non sono esattamente affidabili. Probabilmente avresti miglior fortuna testando le funzionalità del browser con javascript e inviando queste informazioni al server. Questo tuttavia non dovrebbe essere necessario neanche, dal momento che normalmente gestirai le varianze al 100% lato client. – dqhendricks

+0

@dqhendricks Questo è per la manutenzione su una base di codice esistente (abbastanza grande). I valori di questa chiamata vengono utilizzati in tutto il sito sia nel preelaborazione che nel contenuto di pubblicazione. Sono sempre aperto a nuovi/migliori modi di fare le cose, ma probabilmente sarebbe troppo lavoro per cambiare l'intero sistema nel suo stato attuale. – orourkek

+0

vedo. bene buona fortuna allora. – dqhendricks

risposta

4

In realtà, anche se non è documentato nella pagina di manuale, la funzione get_browser può restituire FALSE per diversi motivi.

Almeno uno sguardo su the underlying source code si supponga che.

Ti suggerisco di dare un'occhiata in là e poi fammi sapere se hai altre domande. Potrei essere in grado di rispondere loro allora.

+1

Ho esaminato le varie ragioni per cui potrebbe restituire false, ma nessuna di esse ha senso, considerato l'ambiente. La mia ipotesi migliore per l'errore è qualche problema con la lettura/apertura del file e le mie domande specifiche riguardano questa teoria, ad es. se 'file()' può accedere al file, perché non può 'get_browser()'? PHP non ha problemi ad aprire, leggere e scrivere su questo file con molte funzioni, eccetto 'get_browser()', che fallisce per un motivo sconosciuto. – orourkek

4

Hai provato in giro ogni metodo richiesto.

http://php.net/manual/en/function.get-browser.php avendo nota:

Affinché questo funzioni, le impostazioni di configurazione BrowsCap in php.ini deve puntare alla posizione corretta del file Browscap.ini sul vostro sistema.

browscap.ini non è fornito in bundle con PHP, ma è possibile trovare qui un file php_browscap.ini aggiornato.

Mentre browscap.ini contiene informazioni su molti browser, si basa sugli aggiornamenti degli utenti per mantenere il database corrente. Il formato del file è abbastanza auto-esplicativo.

What solved the issue was moving browscap.ini to the public web directory. 

Potrebbe essere indicando tale posizione. ovvero l'elenco web pubblico

Does get_browser() have special permissions requirements, or anything like that? 

Le autorizzazioni di lettura sono necessarie solo.

+0

Il browscap.ini utilizzato era l'ultima versione disponibile. Ho anche provato più versioni precedenti che avevamo nel nostro filesystem. Per quanto riguarda le autorizzazioni, PHP ** aveva ** permessi di lettura sul file e sulla directory, e ci siamo persino spinti a provare 777 permessi su entrambi. – orourkek

+0

Intendo dire che c'è l'impostazione browscap in php.ini che è in realtà il percorso di quel file. Controlla quale directory sta puntando. –

3

Ho avuto lo stesso identico problema del poster originale. La soluzione? php.ini richiedeva un percorso assoluto per il file browscap.ini.

Quindi, anche se PHP ha trovato il file e si presentava in uscita phpinfo() s', la seguente riga è stato il problema:

browscap = browscap.ini 

Con questa linea, getBrowser() restituito false.

Tuttavia, cambiandolo in un percorso assoluto ha funzionato, in questo modo:

browscap = /etc/browscap.ini 

Spero che questo aiuti qualcuno! È strano ...

+0

È interessante notare che questa non era la causa del problema che stavo vivendo: originariamente avevo un percorso relativo, ma cambiato in assoluto nel mio debugging. Anche se guardando il [codice sorgente] (http://lxr.php.net/xref/PHP_5_3/ext/standard/browscap.c#454) in questione mostra alcuni punti in cui viene restituito 'FALSE'. – orourkek

Problemi correlati