Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: тαптяα en 18 Octubre 2014, 10:42 am



Título: Tareas en PHP
Publicado por: тαптяα en 18 Octubre 2014, 10:42 am
Hola foro PHP, mi primera duda aquí

Algo muy básico ejecutar una función cada segundo en el servidor. Pero con cronjobs la resolución mínima es de 1 minuto, alguien sabe maneras de solucionar esto..

Muchas gracias!  

PD: Mi mensaje 1000, espero que tenga respuesta  ;D


Título: Re: Tareas en PHP
Publicado por: #!drvy en 18 Octubre 2014, 12:22 pm
Si tienes muchas visitas te puedes hacer un script básico tipo el wp-cron.php de wordpress y usar las visitas como trigger. Si no, puedes hacer la típica gamberrada de hacerte un script que visite X archivo cada 1 seg xD

La verdad, me parece una brutalidad que se ejecute cada 1 segundo..

Edit: Y bueno, si puedes setear el max_execution_time, puedes tener corriendo un .php todo el rato y usar sleep().. pero eso es aun mas brutal xD

Saludos


Título: Re: Tareas en PHP
Publicado por: MinusFour en 18 Octubre 2014, 16:43 pm
Esto basicamente requiere un daemon propio. Hay formas de hacer que se ejecute cada segundo con un cronjob:

http://stackoverflow.com/questions/1034243/how-to-get-a-unix-script-to-run-every-15-seconds

Esta es basicamente la idea.


Título: Re: Tareas en PHP
Publicado por: тαптяα en 19 Octubre 2014, 11:04 am
Muchísimas gracias!

La idea del script está bien, pese a que el servidor puede procesar realizar dicha tarea cada segundo, no parece demasiado eficiente, aunque creo que eso soluciona todo.

@MinusFour, estoy viendo esto que me has pasado se basan en scripts, este en concreto parece que hace lo que quiero

Código
  1. #! /bin/sh
  2.  
  3. # Microsecond Cron
  4. # Usage: cron-ms start
  5. # Copyright 2014 by Marc Perkel
  6. # docs at http://wiki.junkemailfilter.com/index.php/How_to_run_a_Linux_script_every_few_seconds_under_cron"
  7. # Free to use with attribution
  8.  
  9. basedir=/etc/cron-ms
  10.  
  11. if [ $# -eq 0 ]
  12. then
  13.   echo
  14.   echo "cron-ms by Marc Perkel"
  15.   echo
  16.   echo "This program is used to run all programs in a directory in parallel every X times per minute."
  17.   echo "Think of this program as cron with microseconds resolution."
  18.   echo
  19.   echo "Usage: cron-ms start"
  20.   echo
  21.   echo "The scheduling is done by creating directories with the number of"
  22.   echo "executions per minute as part of the directory name."
  23.   echo
  24.   echo "Examples:"
  25.   echo "  /etc/cron-ms/7      # Executes everything in that directory  7 times a minute"
  26.   echo "  /etc/cron-ms/30     # Executes everything in that directory 30 times a minute"
  27.   echo "  /etc/cron-ms/600    # Executes everything in that directory 10 times a second"
  28.   echo "  /etc/cron-ms/2400   # Executes everything in that directory 40 times a second"
  29.   echo
  30.   exit
  31. fi
  32.  
  33. # If "start" is passed as a parameter then run all the loops in parallel
  34. # The number of the directory is the number of executions per minute
  35. # Since cron isn't accurate we need to start at top of next minute
  36.  
  37. if [ $1 = start ]
  38. then
  39.   for dir in $basedir/* ; do
  40.      $0 ${dir##*/} 60000000 &
  41.   done
  42.   exit
  43. fi
  44.  
  45. # Loops per minute and the next interval are passed on the command line with each loop
  46.  
  47. loops=$1
  48. next_interval=$2
  49.  
  50. # Sleeps until a specific part of a minute with microsecond resolution. 60000000 is full minute
  51.  
  52. usleep $(( $next_interval - 10#$(date +%S%N) / 1000 ))
  53.  
  54. # Run all the programs in the directory in parallel
  55.  
  56. for program in $basedir/$loops/* ; do
  57.   if [ -x $program ]
  58.   then
  59.      $program &> /dev/null &
  60.   fi
  61. done
  62.  
  63. # Calculate next_interval
  64.  
  65. next_interval=$(($next_interval % 60000000 + (60000000 / $loops) ))
  66.  
  67. # If minute is not up - call self recursively
  68.  
  69. if [ $next_interval -lt $(( 60000000 / $loops * $loops)) ]
  70. then
  71.   . $0 $loops $next_interval &
  72. fi
  73.  
  74. # Otherwise we're done