Evitar que PHP Fatal error pare la ejecución de un script

  • Autor Autor xaiborweb
  • Fecha de inicio Fecha de inicio
xaiborweb

xaiborweb

Programador
No recomendado
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
hola programe un script para traducir texto automáticamente utilizando esta librería
https://github.com/Stichoza/google-translate-php

el problema es que en algunos artículos estoy recibiendo este error y me para de una vez la ejecucion del script.
PHP Fatal error: Uncaught ErrorException: Client error: `POST http://translate.google.com/translate_a/single?client=t&hl=en&dt=t&sl=en&tl=es&ie=UTF-8&oe=UTF-8&multires=1&otf=0&pc=1&trs=1&ssel=0&tsel=0&kc=1&tk=387179.252693` resulted in a `413 Request Entity Too Large` response:
creo que este error es cuando el texto a traducir es demasiado largo.

entonces estoy buscando una solución para si encuentro algun error fatal que simplemente se sale al siguiente y no me pare la ejecución del script, cualquier ayuda se agradece enormemente 😉
 
No creo que sea posible ya que son 'Fatal Errors' si uno ocurre el script no puede continuar.
Como mucho lo que puedes hacer es capturar el error y enviar un log o algo a tu email. Añadiendo esto al inicio de tu archivo PHP
PHP:
function catch_fatal_error(){
  $error =  error_get_last();
 
  //COMPROBAR QUE EL ERROR SEA FATAL
  if($error['type']==E_ERROR) {  
  //LO QUE QUIERAS HACER CUANDO HAYA UN FATAL ERROR
  }

}
register_shutdown_function('catch_fatal_error');
 
Última edición:
Debes hacer que tu script traduzca por partes, por ejemplo de 1 a 500 palabras y así sucesivamente hasta completar el total de palabras de otro modo te va a salir el error y otra cosa también que debes de mirar el tiempo máximo de ejecución del php.ini si tu script pasa de 30 segundos debes de buscar una manera util de programar ya que esto para un usuario es muy tedioso.

Se dice que un script que tarde mas de 30seguns en hacer algo está mal programado.
 
Debes hacer que tu script traduzca por partes, por ejemplo de 1 a 500 palabras y así sucesivamente hasta completar el total de palabras de otro modo te va a salir el error y otra cosa también que debes de mirar el tiempo máximo de ejecución del php.ini si tu script pasa de 30 segundos debes de buscar una manera util de programar ya que esto para un usuario es muy tedioso.

Se dice que un script que tarde mas de 30seguns en hacer algo está mal programado.

pero cuando estoy scrapenado una pagina con mas de 400 mils post y estoy traduciéndolos a mi db xd
para lo del tiempo solo le asigno set_time_limit(0); y listo

pero con respecto al error fatal no siempre aparece por el mismo también por 404 etc. entonces el scritp se para muy seguidop y es muy tedioso volverlo a poner desde donde se paro y me genera un monton de trabajo adicional para volver a dejarlo desde donde se paro, ademas de que se para muy seguido.
 
Haz una tabla en tu BD así:

Insertar CODE, HTML o PHP:
*scrapeo
  id
  url
  completado

Antes de empezar a scrapear primero inserta tus 400,000 urls en la tabla, todas con completado=0.

Luego haz que tu script comience a scrapear basado en las URL con completado=0 de tu tabla.

Cuando tu script termine de traducir una URL entonces actualiza su registro a completado=1.

De esta manera si tu script se detiene en cualquier momento sabrás en que registró se quedó (completado=1), solo tendrás que ejecutarlo nuevamente y continuará donde debe continuar.

Espero haberme explicado.

PD. Incluso puedes ponerle un LIMIT a la consulta o un tiempo de ejecución al PHP de 30 minutos, para que no arroje errores, es decir que se detenga cada 30 minutos, y lo ejecutas nuevamente y automáticamente mediante un cron job.

Hice exactamente lo mismo cuando subí 700,000 pequeños archivos a Amazon S3.

PD2. Traduce párrafo por párrafo (<p>) para evitar errores.
 
Última edición:
ponle try-catchs a los bloques y así evitas que se rompa a cada rato.
 
solo usa @ adelante de la funcion que usas de lectura y no aparece mas... o try / catch
 
Haz una tabla en tu BD así:

Insertar CODE, HTML o PHP:
*scrapeo
  id
  url
  completado

Antes de empezar a scrapear primero inserta tus 400,000 urls en la tabla, todas con completado=0.

Luego haz que tu script comience a scrapear basado en las URL con completado=0 de tu tabla.

Cuando tu script termine de traducir una URL entonces actualiza su registro a completado=1.

De esta manera si tu script se detiene en cualquier momento sabrás en que registró se quedó (completado=1), solo tendrás que ejecutarlo nuevamente y continuará donde debe continuar.

Espero haberme explicado.

PD. Incluso puedes ponerle un LIMIT a la consulta o un tiempo de ejecución al PHP de 30 minutos, para que no arroje errores, es decir que se detenga cada 30 minutos, y lo ejecutas nuevamente y automáticamente mediante un cron job.

Hice exactamente lo mismo cuando subí 700,000 pequeños archivos a Amazon S3.

PD2. Traduce párrafo por párrafo (<p>) para evitar errores.


Me parece una buena idea lo que propone, agregaria un campo numeroDeIntentos, para que luego de un intento fallido aumente en uno este numero y le de prioridad a los que tienen 0 intentos, ya que asi lograrias traducir todos los que no te dan problema, y despues te quedaria una minoria problematicos. Saludos!!
 
Me parece una buena idea lo que propone, agregaria un campo numeroDeIntentos, para que luego de un intento fallido aumente en uno este numero y le de prioridad a los que tienen 0 intentos, ya que asi lograrias traducir todos los que no te dan problema, y despues te quedaria una minoria problematicos. Saludos!!

Con esa adición quedaría perfecto!
 
Bueno lo que creo conveniente es que al momento de scrapear contar el numero de palabras de la publicación y si es superior a 500 palabras entonces dividirla en dos partes(250/250) 413 Request Entity Too Large y hacer la petición, en cuanto a error 404 es probable por que haces demasiadas peticiones a don google y el te limita... Como dice don cicklow puedes agregar el try / catch o en su caso llevar una tabla adicional como la comenta el amigo epicmedia en donde si se scrapeo correctamente entonces colocar OK o 1 de lo contrario NO o 0 como gustes, de esta manera llevar un control... jaja 400 mil post les vas acabar la web a ellos xD

Seria también que el proceso de traducción fuera menos rápido por que google no le gusta mucho eso xD

Disclaimer

This package is developed for educational purposes only. Do not depend on this package as it may break anytime as it is based on crawling the Google Translate website. Consider buying Official Google Translate API for other types of usage.

Also, Google might ban your server IP or requre to solve CAPTCHA if you send unusual traffic (large amount of data/requests).

Ademas de google hay más traductores 😉
 
Última edición:
Bueno lo que creo conveniente es que al momento de scrapear contar el numero de palabras de la publicación y si es superior a 500 palabras entonces dividirla en dos partes(250/250) 413 Request Entity Too Large y hacer la petición, en cuanto a error 404 es probable por que haces demasiadas peticiones a don google y el te limita... Como dice don cicklow puedes agregar el try / catch o en su caso llevar una tabla adicional como la comenta el amigo epicmedia en donde si se scrapeo correctamente entonces colocar OK o 1 de lo contrario NO o 0 como gustes, de esta manera llevar un control... jaja 400 mil post les vas acabar la web a ellos xD

Seria también que el proceso de traducción fuera menos rápido por que google no le gusta mucho eso xD

Disclaimer

This package is developed for educational purposes only. Do not depend on this package as it may break anytime as it is based on crawling the Google Translate website. Consider buying Official Google Translate API for other types of usage.

Also, Google might ban your server IP or requre to solve CAPTCHA if you send unusual traffic (large amount of data/requests).

Ademas de google hay más traductores 😉

si pero comprar la api para tantas traducción me quedo pobre por que cobran cada 20mil palabras xd, adema tengo barios proxyes :devilish:
 
Atrás
Arriba