Tempo per una risposta.

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Salve ragazzi, so che sono un po di giorni che vi rompo le bolas XD ma purtroppo mi vado ad impelagare in situazioni alquanto seccanti :D

Spiego il mio problema:

Ho un sito che gestisce la lingua in base all'ip dell'utente: se l'utente è italiano allora la lingua sarà italiana, se è diversa la lingua allora sarà l'inglese.

Per fare ciò mi sono avvalso di questa funzione

PHP:
<?php
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
  $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
  $ip = $_SERVER['REMOTE_ADDR'];
}
function ipToCountry($ip){
  $info = file_get_contents("http://who.is/whois-ip/ip-address/$ip");
  list($a, $b) = explode('COUNTRY: ', strtoupper($info));
  return substr(trim($b),0,2);
}

$lingua = strtolower(ipToCountry($ip));


if($lingua == 'it'){

	echo "lingua ita";
}else{

	echo "non ita";
}
?>

Lo script funziona, ma ha alcune evidenti lacune che andrò ad elencare:
1. E' lento nel dare la risposta
2. Oggi è successo che il sito che utilizzo per tracciare l'ip dell'utente http://who.is/whois-ip/ip-address ha avuto qualche problema e praticamente per 20 min non ha più caricato. La cosa si è ripercossa sul mio sito che, non avendo risposta da who.is non caricava affatto. Una volta che ho tolto la funzione scritta su tutto è tornato normale.
3. Inaffidabile.

Onestamente avevo pensato ad alcune soluzioni:
1. Vorrei sapere se è possibile che alcuni "grandi" della rete come Google mettano a disposizione delle api gratuite per il tracciamento dell'ip in modo da far capo a loro.
2. Avevo pensato di dare "un tempo di risposta massimo" entro il quale ricevere la localizzazione dell'utente. Se questa non avviene ad es in un secondo allora riempio la varibile lingua $lingua == 'it', solo che non ho idea di come fare questa cosa, idee?

:rolleyes:
 

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Ho provato con quest'altro servizio e pare vada meglio ma vorrei sempre impostare un limite massimo per la risposta e non so come fare.
PHP:
$object = json_decode(file_get_contents("http://ip-api.com/json/$ip"),true);
echo strtolower($object['countryCode']);

Idee?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.041
149
63
PR
www.borgo-italia.it
ciao
poi provare a fare una cosa del genere, cioè verificare se il codice lingua viene letto
PHP:
<?php
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
  $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
  $ip = $_SERVER['REMOTE_ADDR'];
}
function ipToCountry($ip){
	//messo il silent @ davanti a file_get_contents per non visualizzare l'errore
	//messo wh al posto di who per simulare l'errore (cioè non legge)
	if(@file_get_contents("http://wh.is/whois-ip/ip-address/$ip")===FALSE){//qui simulo l'errore
		return 'ERRORE';//oppure return 'it';
	}else{
		$info = file_get_contents("http://who.is/whois-ip/ip-address/$ip");
  		list($a, $b) = explode('COUNTRY: ', strtoupper($info));
  		return strtolower(substr(trim($b),0,2));
	}
}

$lingua = ipToCountry($ip);
var_dump($lingua);
?>
ho modificato il tuo primo script ma è adattabile anche per il secondo
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ciao, io propongo una soluzione piu semplice :
La variabile "HTTP_ACCEPT_LANGUAGE" ti restituisce la lingua del browser ( o del S.O. non ricordo)
PHP:
if (substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2) == "it") {
    echo "Italiano";
} else {
    echo "Inglese";
}
 

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Grazie borgo dopo lo provo. Secondo te in termini di economicità di tempo e quindi anche di risorse, quali tra i due script è meglio? Io oserei il json_decode

@glm si si lo so sono impaziente e me ne scuso :D

Edit: se il sito non va giù ma è solo lentissimo a dare una risposta lo script da te modificato non ho ben capito come si comporta: aperta comunque una risposta o dopo tipo 2 sec passa oltre?

Edit2: @criric. Avevo pensato anche io ad una soluzione del genere ma molte persone in Italia hanno il browser in inglese perché magari è impostato così quando gli arriva il PC e non sanno cambiarlo. Avevo una soluzione del genere prima ma non andava, poiché quando viene rilevata una lingua non italiana la fanpage a cui gli utenti hanno la possibilità di mettere mi piace cambia. Rilevando la lingua del browser mi sono accorto che avevo molti italiani all'interno della pagina internazionale di facebook. Così invece sono molti di meno.

Inviato dal mio Nexus 4 con Tapatalk
 
Ultima modifica:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.041
149
63
PR
www.borgo-italia.it
ciao criric
del bw, però ha un piccolo difetto se l'utente è italiano e ha il bw settato a inglese il sito si presenta in lingia inglese e non è detto che all'utente piaccia leggere un testo in inglese
sarà ma io sono convinto che i classici bottoncini can le bandiere sia il sistema più comodo, al massimo usare i cokie per far in modo che per quell'utente si apra sampre nella lingua da lui scelta

edit
... sito non va giù .... o dopo tipo 2 sec passa oltre?
no solo se non risponde, non so ma credo che per fare quello che vuoi forse devi usare qualcosa lato client

poi non so dirti se quello con json sia meglio, penso che dipenda dal servizio
 
Ultima modifica:

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
In realtà sarebbe la soluzione ideale borgo, ma il mio è un blog e non prevede utenti registrati. Al massimo dovrei comunque tracciare l'ip utente e a quel punto assegnargli un cookie, ma se traccio l'IP mi conviene settare direttamente la lingua no? Comunque, per caso conoscete una qualche funzione di PHP che mi consenta di impostare un timeout? Nel senso che se la risposta es. It non mi arriva entro 3 secondi la variabile viene riempita con il valore da me scelto. Ora sono da telefono e non posso cercare ma se non ricordo male (nelle api di facebook avevo visto sto comando) doveva esserci qualcosa come CONNECTION_TIMEOUT o una cosa simile, vi risulta?

Inviato dal mio Nexus 4 con Tapatalk
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.041
149
63
PR
www.borgo-italia.it
ciao
puoi provare questo, ma non so dirti se funziona, anche perche testarla non è semplice
PHP:
<?php
function ipToCountry($ip){
	$inizio=time();//leggo il tempo di partenza
    if(@file_get_contents("http://who.is/whois-ip/ip-address/$ip")===FALSE){//qui simulo l'errore
        while(time() < ($inizio+5)){//continuo a leggere il tempo ad ogni ciclo
			return ipToCountry($ip); //richiamo ricorsivamente la funzione
		}
		return 'ERRORE';//oppure return 'it';
    }else{
        $info = file_get_contents("http://who.is/whois-ip/ip-address/$ip");
          list($a, $b) = explode('COUNTRY: ', strtoupper($info));
          return strtolower(substr(trim($b),0,2));
    }
}
?>
tra l'altro non so in termini di prestazioni cosa può succedere

poi che gli utenti sia registrati o no non c'entra nulla con i cookie.
se l'utente non sceglie la lingua setti il cookie a IT, altrimenti lo setti alla lingua scelta
 

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Ho trovato il comando a cui mi riferivo curlopt_connecttimeout.
Ma purtroppo va con il curl, non è che mi conviene utilizzarlo invece del json?
 

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
ciao
puoi provare questo, ma non so dirti se funziona, anche perche testarla non è semplice
PHP:
<?php
function ipToCountry($ip){
	$inizio=time();//leggo il tempo di partenza
    if(@file_get_contents("http://who.is/whois-ip/ip-address/$ip")===FALSE){//qui simulo l'errore
        while(time() < ($inizio+5)){//continuo a leggere il tempo ad ogni ciclo
			return ipToCountry($ip); //richiamo ricorsivamente la funzione
		}
		return 'ERRORE';//oppure return 'it';
    }else{
        $info = file_get_contents("http://who.is/whois-ip/ip-address/$ip");
          list($a, $b) = explode('COUNTRY: ', strtoupper($info));
          return strtolower(substr(trim($b),0,2));
    }
}
?>
tra l'altro non so in termini di prestazioni cosa può succedere

poi che gli utenti sia registrati o no non c'entra nulla con i cookie.
se l'utente non sceglie la lingua setti il cookie a IT, altrimenti lo setti alla lingua scelta

Non c'è un errore di logica nella funzione borgo? Nel momento in cui if(@file_get_contents("http://who.is/whois-ip/ip-address/$ip")===FALSE){ rilevo già che il sito non è raggiungile, quindi mi risulta essere inutile confrontareil tempo. Credo piuttosto che bisognerebbe provare a inserirlo nella seconda condizione dopo l'else no? O ho detto una cazzata?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.041
149
63
PR
www.borgo-italia.it
ciao
non dovrebbe, anche se come detto non so come funziona, ma il principio e questo se il sito che ti da la lingua è lento
1) cerca di leggere e non riesce
2) se non sono passati 5 secondi legge di nuovo e verifica (richiama se stessa)
3)se letto esce e da la lingua se non letto rilegge
e così via per 5 secondi se dopo 5 sec non è riusita ancora a leggere esce definitivamente con errorre (o it)
comunque in effetti c'è un errore, nella lettura del tempo iniziale che deve essere fuori della funzione (altrimenti si aggiorna ogni volta) e passato alla funzione come riferimento o usando global
 

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Ho fatto in questo modo e sembra, ripeto SEMBRA funzionare:

PHP:
<?php
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
  $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
  $ip = $_SERVER['REMOTE_ADDR'];
}

function ipToCountry($ip){
	$t = microtime() - $tempo;
    if(@file_get_contents("http://ip-api.com/json/$ip")===FALSE || $t>1){//qui simulo l'errore 
        return 'ERRORE';//oppure return 'it'; 
    }else{ 
		$object = json_decode(file_get_contents("http://ip-api.com/json/$ip"),true);
		return strtolower($object['countryCode']);
    } 
} 

$lingua = ipToCountry($ip); 
var_dump($lingua); 

?>
<!-- stampa del tempo di generazione della pagina -->	
<br /><center><?php $t = microtime() - $tempo;   echo "This page was generated by server in $t seconds"; ?></center>

Secondo voi è corretta come soluzione?
 

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Dovrebbe funzionare ma c'era un errore:

Il tempo di generazione della pagina ovviamente non è lo stesso della tempo di generazione dell'informazione. Per vedere la differenza ho modificato così:

PHP:
<?php
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
  $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
  $ip = $_SERVER['REMOTE_ADDR'];
}

function ipToCountry($ip){
	$t = microtime() - $tempo;
    if(@file_get_contents("http://ip-api.com/json/$ip")===FALSE /*|| $t>1*/){//qui simulo l'errore 
        return 'ERRORE';//oppure return 'it'; 
    }else{ 
		$object = json_decode(file_get_contents("http://ip-api.com/json/$ip"),true);
		return strtolower($object['countryCode'])."  $t";
    } 
} 

$lingua = ipToCountry($ip); 
var_dump($lingua); 

?>
<!-- stampa del tempo di generazione della pagina -->	
<br /><center><?php $t = microtime() - $tempo;   echo "This page was generated by server in $t seconds"; ?></center>

Che dite secondo voi va bene?
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
Utilizza $_SERVER['HTTP_ACCEPT_LANGUAGE'] se ti serve solo la nazionalità sennò online trovi molte api gratuite

esempio
PHP:
function ipInfo($ip)
{
  $ch = curl_init('http://freegeoip.net/json/'.$ip);
  curl_setopt_array($ch, array(CURLOPT_RETURNTRANSFER => true));
  return json_decode(curl_exec($ch));
}

echo ipInfo($_SERVER['REMOTE_ADDR'])->country_name;
 

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Perdonatemi ma non posso editare, dopo qualche minuto mi impedisce la modifica. Comunque il codice corretto è questo

PHP:
<?php
$tempo=microtime(true);
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
  $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
  $ip = $_SERVER['REMOTE_ADDR'];
}

function ipToCountry($ip){
	$t = microtime();
    if(@file_get_contents("http://ip-api.com/json/$ip")===FALSE || $t>1){
        return 'ERRORE  $t';//oppure return 'it';
    }else{
		$object = json_decode(file_get_contents("http://ip-api.com/json/$ip"),true);
		return strtolower($object['countryCode'])."  $t";
    }
}

$lingua = ipToCountry($ip); 
var_dump($lingua); 

?>
<!-- stampa del tempo di generazione della pagina -->	
<br /><center><?php $t = microtime(true) - $tempo;   echo "This page was generated by server in $t seconds"; ?></center>

Dite che va bene oppure ho commesso qualche errore di logica? La funzione microtime è adeguata?
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Propongo un altra alternativa
L'ho testato online e sembrerebbe funzionare.
Giusto per dare più scelta anche a chi leggerà in futuro, voi fate come volete :fonzie:
 

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Propongo un altra alternativa
L'ho testato online e sembrerebbe funzionare.
Giusto per dare più scelta anche a chi leggerà in futuro, voi fate come volete :fonzie:

E' un'ottima alternativa anche questa soprattutto perché non hai dipendenze esterne. Se non erro è possibile anche non scaricare il db contenente i paesi visto che sono interessato solo all'Italia giusto?
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Si credo ti basti scaricare solo quelli che contengono ip italiani, fai qualche prova e facci sapere
 
Discussioni simili
Autore Titolo Forum Risposte Data
L Funzione per verificare distanza di tempo non funziona: perchè? PHP 4
T Tempo d'attesa per vedere la propria app pubblicata su Google Play Sviluppo app per Android 2
giancadeejay Impostare tempo per vedere un immagine nell'array. Javascript 2
D Ajax per calcolare tempo di permanenza Ajax 14
M Abbigliamento, calzature ed accessori sportivi e per il tempo libero Presenta il tuo Sito 0
T Quanto tempo occorre per essere attivi? Supporto Mr.Webmaster 1
W aiuto box per risposte utenti in tempo reale HTML e CSS 1
A Cercasi programmatore ActionScript per assunzione a tempo indeterminato Offerte e Richieste di Lavoro e/o Collaborazione 0
$ Generare script per funzione tempo Javascript 0
napuleone non si aggiorna textarea in tempo reale Javascript 3
L Quotazioni oro e argento in tempo reale WordPress 2
C Software modifica sitoweb in tempo reale WordPress 12
R salve a tutti sono un insegnante di pianoforte e a tempo perso mi sto dedicando ad access Presentati al Forum 1
S [PHP] Estrarre dati da tabella e fare la media ad intervalli di tempo PHP 10
L Ricerca sviluppatori PHP tempo indeterminato Milano Offerte e Richieste di Lavoro e/o Collaborazione 0
P [PHP] Browser game, aiuto a tempo libero. Offerte e Richieste di Lavoro e/o Collaborazione 0
N [Javascript] For-loop su thead: tempo di esecuzione variabile Javascript 1
S [MySQL] Controllo dati di una tabella in tempo reale MySQL 0
M [PHP] Contatore Tempo Server-side PHP 8
trattorino [PHP] Scaricare solo utenti online o di un determinato tempo PHP 4
bubino8 [PHP] Notifiche tempo reale PHP 0
S [PHP] Selezionare dati in intervallo di tempo PHP 21
M [PHP] Verifica formato data in tempo reale PHP 2
M [PHP] Controllo inserimento in tempo reale PHP 0
M [PHP] Impedire di digitare determinati caratteri nell’input (controllo in tempo reale) PHP 4
S [RSS] Gli RSS si aggiornano in base al tempo o ad un nuovo elemento? XML 2
Tommaso Parini [PHP] Nome del cliente presente da più tempo? PHP 3
M [WordPress] [HTML] Form inserimento campi e visualizzazione in tempo reale WordPress 3
P prestashop - Impossibile raggiungere sito..impiegato troppo tempo a rispondere E-Commerce 0
trattorino php variabili a tempo PHP 6
A pop up come modificare il posizionamento e il tempo HTML e CSS 3
M [PHP] Calcolare se due intervalli di tempo si sovrappongono PHP 7
P Diminuire il tempo di caricamento JOOMLA Joomla 0
M Cancellare record a tempo con formato data mktime PHP 7
Devil-94 Creazione di elementi html in tempo reale. Javascript 4
filippino Tempo trasferimento dominio .COM Domini 5
radioButton tempo disconnessione database sql Database 1
IImanuII Ciclo in php e tempo PHP 6
vendofans [Vendo] 1000 Fans a 6 € !! Offerta a tempo limitato - Fino a 50mila fans! Annunci servizi di Social Media Marketing 2
L php - data in italiano senza il tempo PHP 8
N aggiornare la select di un form in tempo reale PHP 2
P Tempo Transizione menu tendina WordPress 2
G Aiutino su un calcolo javascript in tempo reale Javascript 15
giancadeejay immagine visibile solo dopo tot. tempo Javascript 1
R lettura dati in tempo reale da file di testo PHP 2
I Hide a tempo crea uno strano effetto jQuery 2
C Calcolo Tempo in ore minuti PHP 2
A PHP: come chiudere uno script dopo un certo periodo di tempo? PHP 7
F funzione tempo PHP 3
N Impostare il tempo jQuery 5

Discussioni simili