Ejecuta scripts PHP sin tiempo de espera usando Litespeed

Última modificación: mayo 10, 2022
Tiempo estimado de lectura: 3 min

Algunas secuencias de comandos PHP deben ejecutarse durante largos períodos de tiempo sin interrupción. Los ejemplos incluyen plugins de WordPress como BackupBuddy, ImportBuddy o cualquier otro plugin que dependa de un trabajo cron integrado de WordPress. Cada vez que una aplicación PHP reconstruye índices MySQL, el proceso puede ejecutarse durante mucho tiempo.

En general, no es deseable permitir que un script PHP se ejecute para siempre. Por lo tanto, hay una serie de funciones (en el servidor web LiteSpeed e integradas en PHP) que pueden evitar que un proceso de PHP se ejecute el tiempo suficiente para finalizar. Es posible que debas configurar más de una de las siguientes configuraciones para asegurarte de que tu aplicación funcione correctamente.

Anular el tiempo de espera de conexión de LiteSpeed

Si un script no devuelve nada durante mucho tiempo, esto puede desencadenar un tiempo de espera de conexión y el servidor cerrará la conexión del cliente. Esto se hace para evitar que scripts PHP mal escritos ocupen el servidor. Sin embargo, para obtener la funcionalidad deseada de tus aplicaciones web, es posible que debas evitar que se agote el tiempo de espera de la conexión. (Si se configuró la variable de entorno noabort anterior, el script continuará ejecutándose aunque la conexión se haya interrumpido. Sin embargo, su aplicación puede requerir que la conexión permanezca abierta para una funcionalidad correcta).
El tiempo de espera de la conexión se puede evitar aumentando la configuración del tiempo de espera de la conexión global (a través de la consola WebAdmin) o utilizando la variable de entorno noconntimeout de LiteSpeed.
De manera similar a la variable de entorno noabort, puede agregar la variable de entorno noconntimeout a través de una regla de reescritura o usando las directivas SetEnv/SetEnvIf. (Se prefiere el indicador de reescritura para controlar una sola cuenta. Se prefieren las directivas SetEnv/SetEnvIf para las reglas que se aplicarán a todas las cuentas). noconntimeout es una variable de entorno específica de LiteSpeed, por lo que todos los siguientes ejemplos deben colocarse dentro:

<IfModule Litespeed> 
... 
</IfModule>

Ejemplo de directiva para wp-cron.php, backupbuddy.php e importbuddy.php solo combinado con noabort

SetEnvIf Request_URI "(wp-cron|backupbuddy|importbuddy)\.php" noabort noconntimeout

Ejemplo de regla de reescritura para todas las solicitudes

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

Ejemplo de regla de reescritura solo para wp-cron.php, backupbuddy.php e importbuddy.php

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

Ejemplo de regla de reescritura combinado con noabort

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

Desactivar anulación de conexión rota

Cuando un usuario cierra una conexión (cerrando una ventana, por ejemplo), LSWS cancelará el procesamiento de ese script PHP al eliminar el proceso PHP. Esto se hace para evitar desperdiciar recursos del sistema y prevenir ciertos tipos de ataques DoS.
Sin embargo, en algunos casos, es preferible no cancelar el script PHP, independientemente de si la conexión se ha cerrado. Por ejemplo, los trabajos cron integrados de WordPress inician un trabajo en segundo plano enviando una solicitud a wp-cron.php y luego cerrando inmediatamente la conexión sin esperar una respuesta. Sin embargo, para que se complete el trabajo cron, el servidor web debe mantener el motor PHP funcionando sin interrupción.
En este caso, debes desactivar la interrupción de la conexión rota. Esto se puede hacer a nivel de servidor en la Consola WebAdmin de LSWS o usando la variable de entorno noabort de LiteSpeed.
La cancelación de una conexión interrumpida se puede desactivar mediante el uso de la variable de entorno noabort de nivel de solicitud. Esto se puede hacer en una regla de reescritura o usando las directivas SetEnv/SetEnvIf. noabort es una variable de entorno específica de LiteSpeed, por lo que todas las siguientes reglas deben colocarse en

<IfModule Litespeed> 
... 
</IfModule>

El indicador [E=noabort:1] se puede añadir a cualquier regla de reescritura. La regla de reescritura puede estar en un archivo .htaccess de Apache o en un archivo de configuración de nivel de host virtual. El indicador de reescritura generalmente debe usarse solo para una sola cuenta.
Las reglas de reescritura y SetEnv no deben usarse juntos. Recomendamos elegir la directiva SetEnv sobre las reglas de reescritura por dos razones:

  • Las reglas de reescritura son sensibles a una posición entre las otras reglas. SetEnv puede ir a cualquier parte del archivo de configuración.
  • Las reglas de reescritura no se pueden heredar fácilmente. Para impactar todas las cuentas con una configuración, se debe usar la directiva SetEnvIf.

Ejemplo de directiva para todas las solicitudes

SetEnv noabort 1

Ejemplo de directiva solo para wp-cron.php, backupbuddy.php e importbuddy.php

SetEnvIf Request_URI "(wp-cron|backupbuddy|importbuddy)\.php" noabort

Ejemplo de regla de reescritura para todas las solicitudes

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

Ejemplo de regla de reescritura solo para wp-cron.php, backupbuddy.php e importbuddy.php

RewriteEngine On RewriteRule (wp-cron|backupbuddy|importbuddy)\.php - [E=noabort:1]
Tags:
¿Te resultó útil este artículo? Vota y ayúdanos a mejorar.
0 de 0 encontró útil este artículo.
Visto por: 51