mercoledì 18 dicembre 2024

PHP - Massima dimensione di POST e UPLOAD

Lo sviluppo per il web in PHP prevede l'invio ed il processo di informazioni tra client e server. In alcuni casi, è necessario inviare dei file al server (per il salvataggio, il processo, etc); il web server che utilizza PHP va quindi impostato per garantire che i file rispettino le dimensioni massime consentite.

La modifica va applicata su php.ini e riguarda i seguenti due elementi di configurazione:

  • post_max_size
  • upload_max_filesize

Il primo (post_max_size) definisce il peso massimo della chiamata POST, comprensiva del contenuto della form, degli header inviati e di tutti i file caricati.

Il secondo elemento (upload_max_filesize) definisce il peso massimo dei singoli file caricati.

In PHP è possibile controllare quanto vale ogni singolo elemento di configurazione; per farlo, bisogna inserire il seguente comando nello scritpt:

ini_get('post_max_size')

e:

ini_get('upload_max_filesize')

Questo produrrà una stringa con la dimensione massima "con unità", ad esempio "5M".

Per gestire eventuali errori, è possibile utilizzare una funzione che converta il valore di "post_max_size" e di "upload_max_filesize" in bytes e poi confrontare il dato con il peso del POST in arrivo.

In pratica:

function convertToBytes($from)
{
    $units = ['B', 'K', 'M', 'G', 'T', 'P'];
    $number = substr($from, 0, -1);
    $suffix = strtoupper(substr($from,-1));

    // B or no suffix
    if(is_numeric(substr($suffix, 0, 1)))
    {
        return preg_replace('/[^\d]/', '', $from);
    }

    $exponent = array_flip($units)[$suffix] != null ? array_flip($units)[$suffix] : null;

    if ($exponent === null)
    {
        return null;
    }

    return $number * (1024 ** $exponent);
} // convert_to_bytes

if (isset($_SERVER['CONTENT_LENGTH']) && (int) $_SERVER['CONTENT_LENGTH'] > convertToBytes(ini_get('post_max_size')))
{
    echo "errore!";
}

Windows 11 - Ripristinare il context menu "classico"

Il nuovo context menu di Windows 11 ha una grafica più moderna ed è più snello, ma non presenta tutte le voci presenti in quello "classico".

Il più delle volte, cercare una funzione implica cliccare su "più opzioni" e poi utilizzare quello vecchio o cercare visivamente dove è finita la funzionalità da utilizzare.
E' decisamente una rottura.

Per fortuna è possibile ripristinare come default il menu contestuale classico modificando il registro di sistema.

Per farlo, basta aprire un prompt da amministratore e lanciare questo comando:

REG.EXE add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve

Una volta fatto, bisogna aprire il task manager e riavviare il processo explorer.exe per ricaricare la nuova configurazione.

Nota:
nel caso di un PC a dominio, bisogna lanciare il comando da un terminale "non amministrativo", perché sennò il menu classico apparirà solo ad administrator!

giovedì 12 dicembre 2024

POWERSHELL - Utilizzo delle ArrayList

 Gli array in powershell hanno un grosso "problema", se devono essere utilizzati per delle elaborazioni: una volta definiti, hanno una dimensione fissa.

$array = @('1', '2')

E' possibile aggiungere elementi, ma il sistema in realtà crea un "nuovo array" e ci carica dentro tutti gli elementi del primo e quelli nuovi che si intende aggiungere.
Questo è decisamente dispendioso in termini di tempo e di risorse.

Se invece si vuole lavorare con una struttura più "dinamica", bisogna utilizzare i System.Collections.ArrayList.

L'ArrayList viene definito in questo modo:

$array = new-object System.Collections.ArrayList
E' possibile accedere ai suoi elementi utilizzando la solita convenzione per gli array (indicando l'index tra parentesi quadre):
for ($i = 0; $i -lt $array.Count; $i++)
{
    $el = $array[$i]
    [...]
}
E' possibile inoltre aggiungere degli elementi senza rigenerare l'array:
$array.Add("dato") | Out-Null
Nota: in questo caso, i richiami ad "Add" (o "Remove") restituiscono in output il numero di righe processate, quindi è necessario passare l'output a "null" (come nell'esempio qui sopra).

E' possibile inoltre trasformare l'array in una stringa singola usando un separatore:
$msg = $array -join " "
E' possibile contare gli elementi al suo interno:
$count = $array.Count
Da notare che l'associazione di un'ArrayList ad un'altra variabile avviene "per riferimento" e non "per valore", per cui un eventuale richiamo a .Clear() elimina i dati da entrambi! (che poi... è lo stesso elemento).

POWERSHELL - Richiamare il garbage collector

Per alcuni script che chiedono parecchie risorse (ad esempio, quando ci sono numerose iterazioni con tanti dati caricati in memoria e poi processati), i dati contenuti in variabili "temporanee" diventano obsoleti ma continuano a rimanere in RAM.

E' possibile richiamare il garbage collector direttamente dal codice per fare un po' di pulizia.

Questo è il comando da richiamare:

[System.GC]::Collect()