Foros del Web » Programando para Internet » PHP »

Matar el proceso

Estas en el tema de Matar el proceso en el foro de PHP en Foros del Web. Hola, tengo una web en la que ejecuto un proceso en PHP cada 2 min., concretamente éste: Código PHP: <? php $fp  =  fopen ( '/home/virtual/miweb.com/process/php-commit.lock' ...
  #1 (permalink)  
Antiguo 12/12/2013, 05:54
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años, 7 meses
Puntos: 15
Matar el proceso

Hola,

tengo una web en la que ejecuto un proceso en PHP cada 2 min., concretamente éste:

Código PHP:
<? php
$fp 
fopen('/home/virtual/miweb.com/process/php-commit.lock''r');
if (!
flock($fpLOCK_EX LOCK_NB))
{
    exit;
}

require_once(
'process.php');

echo 
"Hecho!";
// ... do stuff

fclose($fp);
?>
Que lo que hace es llamar a process.php

Este procces.php lo que hace es leer feeds de otras webs mediante el "Simplepie" y traerme sus datos para meterlos en la base de datos.

Ocurre que a veces el proceso dura más de 1 min 30 seg., que es lo que habitualmente dura de media. Incluso en ocasiones se alarga hasta los 5 ó 10 min.

Lo peor es cuando se queda bloqueado y no se ejecuta hasta que me doy cuenta y lo vuelvo a lanzar manualmente.

Me han dicho en el hosting que no es del servidor, sino que tengo que "matar el proceso" porque a veces se queda colgado por culpa de que los servidores a los que intento acceder para traerme los datos del feed dan problemas.

Cómo puedo matar el proceso en caso de que éste se demore más de 2 min?
  #2 (permalink)  
Antiguo 12/12/2013, 06:05
Avatar de Dalam  
Fecha de Ingreso: septiembre-2010
Mensajes: 409
Antigüedad: 14 años, 2 meses
Puntos: 56
Respuesta: Matar el proceso

al principio del script process.php ponle la linea
Cita:
set_time_limit(120);
eso produciria un error fatal cuando el script se ejecute mas de 120 segundos, con lo que el script dejaria de ejecutarse.

Tambien puedes usar
Cita:
ini_set ( 'max_execution_time' , 120 );
Pero este ultimo caso, si el script es llamado desde linea de comandos no funcionara.

Lo mejor que puedes hacer es usar las cabeceras correctas para que expire la conexion en las funciones que uses para obtener los datos de la url que obtienes

Última edición por Dalam; 12/12/2013 a las 06:15
  #3 (permalink)  
Antiguo 13/12/2013, 02:14
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años, 7 meses
Puntos: 15
Respuesta: Matar el proceso

Eso último que dices es interesante, cómo se podría hacer?
  #4 (permalink)  
Antiguo 13/12/2013, 08:34
Avatar de Dalam  
Fecha de Ingreso: septiembre-2010
Mensajes: 409
Antigüedad: 14 años, 2 meses
Puntos: 56
Respuesta: Matar el proceso

si usas por ejempllo file_get_contents es el tercer parametro donde se definen las cabeceras que se envian con la peticion.
Usa esta funcion en vez de fopen para recibir los datos del archivo.
Si deseas seguir usando fopen es el cuatoparamtro "contex".
Me imagino que el error te lo dara porque habra alguna redireccion de por medio y entonces no te devuelve datos, tan solo las cabeceras de redireccion.
En este caso lo que deberias seria ver que cabeceras te devuelve la peticion y actuar en consecuencia.
por ejemplo si tienes la cabecera de redireccion, obtener el vinculo al que te redirecciona y hacer la llamada a este.
La mejor opcion para esto es que uses curl si lo tienes en tu hosting, por que te evitarias tener que hacerlo todo a mano y curl posee opciones para seguir las redirecciones de forma nativa.

Última edición por Dalam; 13/12/2013 a las 08:48
  #5 (permalink)  
Antiguo 17/12/2013, 11:54
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años, 7 meses
Puntos: 15
Respuesta: Matar el proceso

Pues nada, que no hay forma. El SimplePie tiene un parámetro set_timeout(x) pero no funciona.

No hay alguna forma desde aquí:

Código PHP:
Ver original
  1. <? php
  2. $fp = fopen('/home/virtual/miweb.com/process/php-commit.lock', 'r');
  3. if (!flock($fp, LOCK_EX | LOCK_NB))
  4. {
  5.     exit;
  6. }
  7.  
  8. require_once('process.php');
  9.  
  10. echo "Hecho!";
  11. // ... do stuff
  12.  
  13. fclose($fp);
  14. ?>

no sé, desde el require o lanzar algún script también cada 2 min para ver si ha finalizado el proceso (guardo en una BD el log con la fecha de inicio y la duración del proceso) y si no ha finalizado tras xxx segundos "matarlo" de alguna manera?
  #6 (permalink)  
Antiguo 17/12/2013, 13:56
Avatar de Dalam  
Fecha de Ingreso: septiembre-2010
Mensajes: 409
Antigüedad: 14 años, 2 meses
Puntos: 56
Respuesta: Matar el proceso

O no lo entiendo yo, o esque no te has esplicado bien.

Si el problema lo tienes al obtener el archivo, primero comprueba que que exista el archivo y luego si existe lo guardas en una variable y luego esa variable se la pasas a simplepie si tiene el formato adecuado.
Para comprobar si el archivo existe, usa la funcion file_exists el ejemplo 4 te muestra como hacerlo con archivos externos y si eres un poco habil con esa misma funcion podrias comprobar las cabeceras como te dije.
Lo de Simplepie olvidate, puesto que cuando vallas a usar esa clase ya sabras si el archivo existe y que lo tienes cargado en una variable.
  #7 (permalink)  
Antiguo 18/12/2013, 09:12
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años, 7 meses
Puntos: 15
Respuesta: Matar el proceso

Según dicen el file_exists SÓLO es para comprobar directorios o ficheros que está en tu propio servidor, no para url externas.

Con el ejemplo 4 te refieres a éste?

Código PHP:
Ver original
  1. $file = 'http://www.domain.com/somefile.jpg';
  2. $file_headers = @get_headers($file);
  3. if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
  4.     $exists = false;
  5. }
  6. else {
  7.     $exists = true;
  8. }

Según veo comprueba las cabeceras y si no tiene te devuelve "HTTP/1.1 404 Not Found". También supongo que se podrá comprobar si es 200 (cabecera correcta).

Es así como debería comprobar que existe (o no) la url?

Entiendo que fopen no convendría usar porque supone descargar todo el archivo y eso con 1000 url tarda muchísimo.
  #8 (permalink)  
Antiguo 18/12/2013, 15:14
Avatar de Dalam  
Fecha de Ingreso: septiembre-2010
Mensajes: 409
Antigüedad: 14 años, 2 meses
Puntos: 56
Respuesta: Matar el proceso

es esa la funcion que te digo.
Pero el error no lo genera la funcion, si no que es lo que te devuelve el servidor al que le hiciste la peticion.
No solo devuelve el 404 si no que tambien puedes chequear cual es la que te devuelve

Como breve descripcion te dire los tipos
Cita:
Cabeceras
1xx respuestas informativas
2xx respuestas de peticiones correctas
3xx respuestas de redirecciones
4xx respuestas de errores del cliente
5xx respuestas de errores del servidor
El error que te dara tu script, a lo mejor es porque recibe una cabecera 301 o 302 que son de movido permanentemente o movido temporalmente, con lo que tu script obtendra codigo, pero no habra la redireccion y intentara procesar los datos, aunque no los tenga.
Si chequeas el tipo de cabecera y te encuentras con una de las anteriores en el array $file_headers tendras una cabecera del tipo Location que tiene el vinculo al archivo.
Tan solo tendras que obtener ese vinculo y comprobar que cabeceras te devuelve este ultimo.
Si te devuelve la cabecera 200 seguro que es el archivo que esperabas.
Compruebas que el contenido sea un xml y si es asi lo procesas.

Si tienes alguna duda preguntalo, que no lo llevas mal por este camino y creo que solucionaras tu error.

Etiquetas: matar, proceso
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:20.