Test Foro de elhacker.net SMF 2.1

Programación => Desarrollo Web => 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 (bash) [Seleccionar]
#! /bin/sh

# Microsecond Cron
# Usage: cron-ms start
# Copyright 2014 by Marc Perkel
# docs at http://wiki.junkemailfilter.com/index.php/How_to_run_a_Linux_script_every_few_seconds_under_cron"
# Free to use with attribution

basedir=/etc/cron-ms

if [ $# -eq 0 ]
then
  echo
  echo "cron-ms by Marc Perkel"
  echo
  echo "This program is used to run all programs in a directory in parallel every X times per minute."
  echo "Think of this program as cron with microseconds resolution."
  echo
  echo "Usage: cron-ms start"
  echo
  echo "The scheduling is done by creating directories with the number of"
  echo "executions per minute as part of the directory name."
  echo
  echo "Examples:"
  echo "  /etc/cron-ms/7      # Executes everything in that directory  7 times a minute"
  echo "  /etc/cron-ms/30     # Executes everything in that directory 30 times a minute"
  echo "  /etc/cron-ms/600    # Executes everything in that directory 10 times a second"
  echo "  /etc/cron-ms/2400   # Executes everything in that directory 40 times a second"
  echo
  exit
fi

# If "start" is passed as a parameter then run all the loops in parallel
# The number of the directory is the number of executions per minute
# Since cron isn't accurate we need to start at top of next minute

if [ $1 = start ]
then
  for dir in $basedir/* ; do
     $0 ${dir##*/} 60000000 &
  done
  exit
fi

# Loops per minute and the next interval are passed on the command line with each loop

loops=$1
next_interval=$2

# Sleeps until a specific part of a minute with microsecond resolution. 60000000 is full minute

usleep $(( $next_interval - 10#$(date +%S%N) / 1000 ))

# Run all the programs in the directory in parallel

for program in $basedir/$loops/* ; do
  if [ -x $program ]
  then
     $program &> /dev/null &
  fi
done

# Calculate next_interval

next_interval=$(($next_interval % 60000000 + (60000000 / $loops) ))

# If minute is not up - call self recursively

if [ $next_interval -lt $(( 60000000 / $loops * $loops)) ]
then
  . $0 $loops $next_interval &
fi

# Otherwise we're done