:::: MENU ::::
Browsing posts in: Development

La distanza di Levenshtein, a cosa serve? (1° parte)

In teoria dell’informazione e informatica , la distanza di Levenshtein è un’unità di misura per calcolare la differenza tra due stringhe. In altre parole, la distanza di Levenshtein tra due parole A e B è il numero minimo di modifiche di un carattere singolo (inserimento, cancellazione, sostituzione) necessario per modificare la parola A nella parola B. Con edit distance ci si riferisce spesso alla distanza di Levenshtein. La funzione prende il nome dal suo creatore Vladimir Levenshtein, scienziato russo specializzato in teoria dell’informazione, che la scoprì nel 1965.

Esempio

Calcolare la distanza di Levenshtein tra “kitten” e “sitting”. Ovviamente la risposta è 3, poiché sono necessarie tre modifiche per trasformare una parola nell’altra e non c’è altro modo per farlo con meno di tre modifiche:

  1. kitten → sitten (sostituzione di “k” con”s”)
  2. Sitten → Sittin (sostituzione di “e” con “i”)
  3. Sittin → sitting (inserimento di “g” alla fine).

Alcune precisazioni

La distanza di Levenshtein ha alcuni limiti superiori e inferiori. Questi includono:

  • La lunghezza è sempre almeno la differenza della lunghezza delle due stringhe.
  • La lunghezza può essere al massimo uguale alla lunghezza della stringa più lunga.
  • È zero se, e solo se, le stringhe sono uguali.
  • Se le stringhe sono le stesse dimensioni, la distanza di Hamming è un limite superiore alla distanza Levenshtein.
  • La distanza di Levenshtein tra due stringhe non può essere maggiore della somma delle loro distanze di levenshtein da una terza stringa (disuguaglianza triangolare).

Un classico utilizzo

Avete presente quando sbagliate a digitare una parola da cercare con Google? Il motore di ricerca vi consiglia una correzione della parola errata. Guardate l’esempio qui sotto, vi siete mai chiesti come fa Google a correggere le parole errate? La risposta è semplice: Levenshtein!

levenstein

La funzione levenhstein() in PHP

In php è presente da tempo una funzione chiamata appunto levenhstein(), e viene definita di seguito:

dove:

  • str1: prima stringa in ingresso da confrontare
  • str2: seconda stringa in ingresso da confrontare
  • cost_ins: definisce il “costo” dell’operazione di inserimento di un carattere
  • cost_rep: definisce il “costo” dell’operazione di sostituzione di un carattere
  • cost_del: definisce il “costo” dell’operazione di cancellazione di un carattere

continua…


mysql_connect() o mysql_pconnect(): quale usare?

Quando tentate di connettervi ad un database MySQL utilizzando PHP, solitamente avete a disposizione due funzioni per effettuare il collegamento. Esse sono:

  1. mysql_connect()
  2. mysql_pconnect()

Vediamo la differenza tra le due funzioni, qui di seguito.

funzione mysql_connect()

Questa funzione crea una nuova connessione al database una volta che lo script inizia l’esecuzione e chiude la connessione al database una volta esecuzione dello script termina. Questo significa che PHP effettuerà una connessione al database MySQL ogni volta che il nostro script viene eseguito.

funzione mysql_pconnect()

Quando si effettua un tentativo di connessione al database utilizzando mysql_pconnect(), questa funzione cercherà un collegamento esistente al database utilizzando al solito username e password. Se viene trovata una connessione esistente, la funzione restituisce l’ID della risorsa, altrimenti aprirà una nuova connessione e restituirà l’ID della nuova risorsa.

Dopo un’ora di connessione verrà restituito solo l’ID della risorsa (se esistente) e non cercherà, a differenza di mysql_connect() di aprire una nuova connessione ogni volta che lo script viene richiamato. Ovviamente la connessione non verrà chiusa una volta terminato lo script. Per questo motivo la connessione è persistente.

Tuttavia mysql_pconnect() richiede una certa ottimizzazione del server e potrebbe essere necessario limitare il numero di connessioni (per via delle risorse limitate) e configurare sia il timeout sia come trattare l’inattività (idle) delle connessioni aperte.

Quando usare una o l’altra funzione?

Si dovrebbe usare mysql_pconnect() quando il sito genera un alto traffico e quindi maggiori richieste di connessioni al DB. Se PHP e MySQL risiedono sullo stesso server o sulla stessa rete locale, il tempo di connessione può essere trascurabile, nel qual caso non vi è alcun vantaggio nell’uso delle connessioni persistenti.

Cose da tenere a mente durante l’utilizzo mysql_pconnect

Quando si interroga una tabella, MySQL effettua un lock su una tabella e normalmente la tabella viene sbloccata quando il collegamento si chiude. Dal momento che le connessioni persistenti non si chiudono al termine dello script, le tabelle potrebbero rimanere in uno stato di lock, e l’unico modo per sbloccarle è quello di attendere il timeout della connessione o “killare” il processo.

Le tabelle temporanee in MySQL vengono solitamente eliminate quando la connessione si chiude, ma dal momento che le connessioni persistenti non si chiudono, le tabelle temporanee non sono così temporanei. Se non si cancellano esplicitamente le tabelle temporanee, tali tabelle rimarranno disponibili ad altri client che riutilizzano la stessa connessione.

Il server Apache non funziona bene con le connessioni persistenti. Quando riceve una richiesta da un nuovo cliente, invece di utilizzare una connessione persistente aperta, tende a generare un nuovo figlio, il quale si occuperà di aprire una nuova connessione al database. Questo causa un eccesso di processi dormienti, uno spreco inutile di risorse, causando degli errori quando si raggiungere limite massimo di connessioni aperte, e ciò annulla qualsiasi vantaggio sulle connessioni persistenti.

A voi la scelta!


Verificare l’esistenza di un URL con PHP

In questo articolo vedremo come controllare l’esistenza di un determinato URL utilizzando PHP. In parole povedere dobbiamo verificare se sul server esistono o meno i contenuti che stiamo richiedendo attraverso l’URL. Possiamo agevolmente verificare l’esistenza di URL in due modi:

  • il primo è la funzione get_header();
  • il secondo metodo è l’uso della libreria CURL.

Fondamentalmente bisogna verificare l’header HTTP dell’URL e sulla base di questo determinare se esiste oppure no. Il codice 200 rappresenta un URL funzionante mentre il codice 404 rappresenta la pagina non trovata, quindi un URL non funzionante o inesistente.

Metodo 1: Funzione get_headers()

Usando la funzione get_headers siamo in grado di ottenere le informazioni dell’Header HTTP dell’URL.

Nota: Se si imposta il secondo parametro della funzione get_headers() a true allora si otterrà il risultato in un array associativo.

Metodo 2: libreria cURL

Nota: Abbiamo usato CURLOPT_NOBODY per controllare solo per l’instestazione, il resto del contenuto non ci interessa.

Condividete le vostre opinioni / commenti / suggerimenti qui sotto.


Output buffering con PHP e ob_flush()

L’output buffering è un’interessante caratteristica di PHP. Quando si esegue uno script PHP e si genera un contenuto di output (codice HTML con la funzione echo ad esempio), tale contenuto HTML viene trasferito dal server al browser. Ma cosa succede se si prova a generare dei contenuti di output mentre si esegue uno script?

Normalmente quando il server è impegnato in qualche operazione, l’output viene momentaneamente sospeso in attesa di terminare lo script. Il motore PHP memorizza gli eventuali contenuti di output in un buffer interno piuttosto che passarli subito al browser. Non appena termina l’esecuzione dello script PHP, il contenuto viene passato al browser e il buffer svuotato. A questo punto entra in gioco l’Output Buffering.

Abbiamo solo bisogno di chiamare una funzione PHP per avviare il buffering PHP. Date un’occhiata a questo blocco di codice:

Come inviare l’output buffer al browser?

Una volta che il buffer di output è stato avviato, nulla sarà visualizzato in output dal browser, a meno che non si utilizzi una specifica funzione oppure  termini l’esecuzione dello script.

Per inviare il contenuto del buffer al browser e quindi visualizzarlo, allora avete bisogno di usare questa funzione:


La funzione ob_flush() passerà il contenuto del buffer al browser, e lo script PHP continuerà a visualizzare il contenuto del buffer. Cosa bisogna fare se si desidera trasmettere il contenuto dell’output buffer al browser e fermare il riempimento del buffer?Avrete bisogno di questa funzione:

Come eliminare l’output buffer?

Se invece si desidera eliminare tutto il contenuto dal buffer allora avrete bisogno della seguente funzione:

Come ob_flush(), ob_clean() non interrompe il riempimento del buffer. Per eliminare il buffer e fermare il riempimento del buffer è necessario utilizzare la funzione:

Come controllare i contenuti all’interno dell’Output Buffer?

Abbiamo visto le funzioni per l’eliminazione e l’outputing del contenuto del buffer. Se invece si desidera solamente controllare il contenuto memorizzato nel buffer è possibile utilizzare questa funzione e una semplice variabile PHP:

Un piccolo esempio

Per vedere in azione meglio, vi consiglio di creare due file PHP e confrontare l’esecuzione dei due file. Date un’occhiata al blocco di codice qui sotto. Come potete vedere ho usato la funzione phpinfo() e subito dopo sleep(10), per “addormentare” lo script di 10 secondi. In questo caso non ho usato ob_start(). Quello che accade è che viene mostrato il contenuto di phpinfo, lo script si addormenta per 10 secondi e poi termina la sua esecuzione.


In quest’altro blocco di codice potete vedere la magia dell’output buffer. Ho usato ob_start() prima di chiamare sleep(10) e phpinfo(). In questo caso lo script attenderà 10 secondi prima di mostrare il contenuto di phpinfo, anche se sleep(10) è stato chiamato dopo phpinfo().

Vantaggi

Uno dei principali vantaggi dell’output buffering è il caching. E’ possibile memorizzare nella cache il contenuto (in realtà pagina intera rendering) con l’aiuto dell’output buffering. Proprio per spiegare come funziona. È possibile avviare il buffering e si può tamponare il contenuto intero e alla fine dello script prima eco l’uscita si avrà il contenuto della pagina intera, che è possibile memorizzare nella cache in qualsiasi modo si desidera.


Pagine:1234

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close