En primer lugar, si, literalmente, sólo se está haciendo decenas cada minuto , entonces no me preocupe terriblemente sobre el rendimiento en este caso. Estos partidos son bastante rápido, y no creo que vas a tener un problema de rendimiento por iteración a través de la matriz de patrones y llamando preg_match separado de esta manera:
$matches = false;
foreach ($pattern_array as $pattern)
{
if (preg_match($pattern, $page))
{
$matches = true;
}
}
Puede en efecto combinar todos los patrones en uno usando el operador or
como algunas personas están sugiriendo, pero no se limite a unirlas con un |
. Esto se romperá gravemente si alguno de sus patrones contiene el operador or.
recomendaría al menos agrupar sus patrones de uso de paréntesis como:
foreach ($patterns as $pattern)
{
$grouped_patterns[] = "(" . $pattern . ")";
}
$master_pattern = implode($grouped_patterns, "|");
Pero ... no estoy realmente seguro de si esto termina siendo más rápido. Algo tiene que recorrerlos, ya sea el preg_match o PHP. Si tuviera que adivinar, supongo que las coincidencias individuales serían tan rápidas y fáciles de leer y mantener.
Por último, si el rendimiento es lo que está buscando aquí, creo que lo más importante es retirar las coincidencias que no son de expresiones regulares en una simple comprobación de "cadena contiene". Me imagino que algunos de sus cheques deben ser simples comprobaciones de cadena, como mirar para ver si "Este sitio está cerrado" está en la página.
Así que hacer esto:
foreach ($strings_to_match as $string_to_match)
{
if (strpos($page, $string_to_match) !== false))
{
// etc.
break;
}
}
foreach ($pattern_array as $pattern)
{
if (preg_match($pattern, $page))
{
// etc.
break;
}
}
y evitar el mayor número posible preg_match()
es probablemente va a ser su mejor ganancia. strpos()
es un lote más rápido que preg_match()
.
Por el bien del Googler, considere usar break (http://www.php.net/manual/es/control-structures.break.php) para salir del bucle foreach una vez que haya encontrado una coincidencia. –
Creo que esto debería ser: foreach ($ pattern_array as $ pattern), al menos en mi versión de PHP – hellomynameisjoel
Muy bien chicos ... editado para abordar sus comentarios. – danieltalsky