Risolvere problemi di Timeout PHP su Litespeed

Il Timeout PHP su LiteSpeed

Durante l’esecuzione di alcuni script necessari per il proprio sito web può capitare che ce ne siano alcuni che necessitano di più tempo per essere eseguiti o che richiedano la rimozione di qualsiasi timeout. Tra questi script possiamo trovare BackupBuddy, ImportBuddy, WP All Import o qualsiasi altro modulo che si basa su un processo cron incorporato in WordPress.  Ogni volta che un’applicazione PHP ricostruisce gli indici MySQL, il processo può essere lasciato in esecuzione prolungata.

In genere, non è consigliabile consentire l’esecuzione di uno script PHP in modo continuativo in quanto va a saturare le risorse messe a disposizione. Quindi ci sono un certo numero di funzioni (nel server Web LiteSpeed e integrate in PHP stesso) che possono impedire a un processo PHP di essere eseguito senza timeout. Potrebbe essere necessario impostare più di una delle seguenti configurazioni per garantire il corretto funzionamento dell’applicazione.

Disattivare il Broken Connection Aborting

Quando un utente chiude una connessione (chiudendo una finestra, ad esempio), LSWS interromperà l’elaborazione dello script PHP killando il processo PHP. Questo per evitare di sprecare risorse di sistema e prevenire alcuni tipi di attacchi DoS.

In alcuni casi, tuttavia, è preferibile non interrompere lo script PHP, indipendentemente dal fatto che la connessione sia stata chiusa. Ad esempio, i cronjobs integrati di WordPress avviano un lavoro in background inviando una richiesta a wp-cron.php, quindi chiudendo immediatamente la connessione senza attendere la risposta. Per completare il processo cron, tuttavia, il server Web deve mantenere il motore PHP in esecuzione senza interruzioni.

Tramite Variabile di Environment

L’interruzione di una connessione persistente può essere disattivata utilizzando la variabile di ambiente noabort a livello di richiesta. Questo può essere fatto in una regola nell’htaccess o usando le direttive SetEnv / SetEnvIf. noabort è una variabile d’ambiente specifica di LiteSpeed, pertanto è necessario inserire tutte le seguenti regole

<IfModule Litespeed>...</IfModule>

Il flag [E = noabort: 1] può essere aggiunto a qualsiasi regola di riscrittura del file .htaccess

Esempi di riscrittura

Per tutte le richieste:

RewriteEngine On

RewriteRule .* - [E=noabort:1]

Per wp-cron.php, backupbuddy.php,e importbuddy.php:

RewriteEngine On

RewriteRule (wp-cron|backupbuddy|importbuddy).php - [E=noabort:1]

La regola

RewriteEngine On

RewriteRule .* - [E=noabort:1]

deve essere posizionata in cima al file .htaccess

Sovrascrivere il Timeout di connessione di LiteSpeed

Se uno script impiega molto tempo a caricare e non restituisce nulla come risultato è probabilmente andato in timeout e il server chiuderà la connessione client.  Questo viene fatto per impedire agli script PHP scritti male di aumentare il carico lato server.

Per permettere allo script di proseguire senza alcun timeout è necessario intervenire sull’htaccess per bloccarlo.

In aggiunta, se è presente la variabile [noabort]  lo script continuerà ad essere in esecuzione anche se la connessione verrà interrotta.

Il timeout della connessione può essere prevenuto la variabile d’ambiente noconntimeout di LiteSpeed.

Esempi di riscrittura

Per tutte le richieste

RewriteEngine On

RewriteRule .* - [E=noconntimeout:1]

Per wp-cron.php,backupbuddy.php,importbuddy.php

RewriteRule (wp-cron|backupbuddy|importbuddy).php - [E=noconntimeout:1]

Regola combinata con  la variabile “noabort”:

RewriteRule (wp-cron|backupbuddy|importbuddy).php - [E=noabort:1, E=noconntimeout:1]

E’ possibile combinare in modo generico la regola noabort e noconnectimeout

RewriteEngine On
RewriteRule .* - [E=noabort:1, E=noconntimeout:1]