2010-09-26 8 views
6

Tengo algunos scripts que usan una tonelada de CPU ¿es posible limitar la cantidad de CPU que un proceso puede usar? Estoy corriendo en CentOs 5.5 por cierto.¿Puedo acelerar el uso máximo de CPU de un script php?

+0

¿Quiere decir en el código php mismo? Es posible que pueda limitar el motor de scripts php a través del sistema operativo, pero eso no estaría relacionado con la programación – YWE

Respuesta

-2

PHP se considera un lenguaje de scripting y no tiene un acceso tan bajo al hardware.

En su lugar, lo que puede hacer es utilizar las funciones como "set_time_limit()"

http://php.net/manual/en/function.set-time-limit.php

y memory_limit en su php.ini

http://php.net/manual/en/ini.core.php

Esos son los métodos recomendados, pero lo más cercano que obtendrá a lo que desea es probablemente una combinación de "sueño()"

http://php.net/manual/en/function.sleep.php

y obtener la carga actual de la CPU con "exec ('uptime');". Tenga en cuenta que puede o no tener acceso a esos comandos del sistema.

+3

El promedio de carga está disponible en/proc/loadavg en Linux. No requiere acceso de bajo nivel al hardware, es una función del sistema operativo. – Josh

+1

Con este enfoque, solo aceptará una secuencia de comandos, no pausará o limitará el consumo de la CPU. – Sych

10

Ayudé a un codificador PHP compañero a crear scripts PHP que abordan un problema similar. Estos son scripts PHP de larga ejecución que generan mucha carga. Ya que están corriendo por mucho tiempo, el objetivo era "detenerlos" si la carga es demasiado alta. El script tiene una función similar a:

function get_server_load() 
{ 
    $fh = fopen('/proc/loadavg', 'r') 
    $data = fread($fh, 6); 
    fclose($fh); 
    $load_avg = explode(" ", $data); 
    return floatval(trim($load_avg[0])); 
} 

El script llama get_server_load() durante cada bucle, y si la carga es mayor que un determinado max, duerme durante 30 segundos y cheques de nuevo:

set_time_limit(120); 
while(get_server_load() > $max_load) 
    sleep($load_sleep_time); 

Esto permite que el script le devuelva tiempo de CPU al servidor durante períodos de alta carga.

+0

Este es un enfoque agradable, pero tenga en cuenta que está volviendo int, no flotante, por lo que no puede obtener un promedio de carga de 0.9, por ejemplo. –

+0

¡Un gran punto! Fijo – Josh