Menú Principal

Tareas en PHP

Iniciado por тαптяα, 18 Octubre 2014, 10:42 AM

0 Miembros y 1 Visitante están viendo este tema.

тαптяα

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

#!drvy

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

MinusFour

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.

тαптяα

#3
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