Esta consulta es de hace 4 años. Tenga eso en cuenta.
shawe
shawe
España

Joe empezó en el plugin de backups a añadir soporte para...

Joe empezó en el plugin de backups a añadir soporte para automatizar backups con cron, y ahora que quería continuar con lo que él preparó, me encuentro algunos problemas al requerir archivos de la base de FacturaScripts, no se si puede haber más problemas de este tipo, aunque asumo que sí. Pongo un poco en contexto y voy explicando:

Joe preparó esto conjuntamente al modal en la vista para que el usuario escoja si quiere o no usar el cron. Por si da por probar el plugin a cualquiera que quiera opinar sobre lo que explico, tengo cambios pendientes de subir a sugerencia de Carlos, para que sólo el usuario admin tenga acceso a las funcionalidades "delicadas" por así decirlo (subir/bajar/hacer/eliminar backups), y que además las advertencias que salen actualmente ya no salgan, e indico en el README del plugin que constantes se pueden declarar en config.php o modificarlas en el propio functions.php para "capar" funcionalidades como partners, al igual que se solicitó con ciertas características de la base para limitar funcionalidades.

Con lo que Joe preparó, pretende que mediante un botón de "Programar backups" el usuario escoja fácilmente si deben hacerse los backups automáticos o no, hasta aquí ningún problema, pero para comprobar la elección del usuario se requiere acceso desde cron a fs_var para poder comprobar dicha elección, y aquí es donde empieza el "problema" que creo que es de fácil arreglo, pero que si tengo que hacer un pull-request, quisiera aplicarlo a todas las partes implicadas con este problema que creo que he visto, de la forma que se considere más oportuna.

Posiblemente esté haciendo algo mal yo, pero me encuentro que al hacer un require_once de fs_var.php desde el cron.php, de forma obvia debo cargar config.php, base/config2.php, base/fs_cache y base/fs_model.php como dependencias de clases o variables que necesito para acceder a ese dato, y a partir de aquí me encuentro el problema real. Los archivos de la base se intentan cargar con rutas relativas y es aquí donde me encuentro los problemas y veo 2/3 soluciones.

1.- Utilizar http://php.net/manual/es/function.set-include-path.php que según veo no se utiliza en la base de facturascripts y lo más similar que tenemos es FS_PATH que también se está utilizando de forma relativa en lugar de absoluta y no se está utilizando en todas partes, sólo en algunas.
2.- Seguir el consejo de http://php.net/manual/es/function.require-once.php y aprovechar que tenemos __DIR__ para generar rutas absolutas de forma dinámica.
3.- Una combinación de ambas, para que FS_PATH use __DIR__ como ruta base absoluta para evitar que este problema se pueda extender aunque todavía no haya sucedido en otros lugares y además forzar en todos los lugares posibles a usar el set_include_path, para que sin tener que cambiar todos los requires, el cambio llegue a todos los posibles lugares donde se utilizan rutas relativas.

He estado intentando localizar si hay algún tipo de consenso como en PSR, pero no he encontrado nada al respecto y por eso lo planteo de esta forma.
28-04-2017 20:22:42   29-04-2017 00:23:02   53   [NeoRazorX]
Para este caso puntual, me ha bastado con reemplazar en base/fs_model.php:

require_once 'base/fs_cache.php';
require_once 'base/fs_db2.php';
require_once 'base/fs_functions.php';
require_once 'base/fs_default_items.php';


con:

require_once __DIR__.'/fs_cache.php';
require_once __DIR__.'/fs_db2.php';
require_once __DIR__.'/fs_functions.php';
require_once __DIR__.'/fs_default_items.php';


Pero como creo que esto puede continuar afectando en distintas partes, por eso expongo lo que considero que es un problema puntual y que puede repetirse en el futuro al intentar acceder a archivos de forma directa.

Y aunque se pueda utilizar set_include_path para forzar una ruta base, esa ruta tampoco llegará a todas partes si no se hace include/require de la forma que se espera por la propia estructura, con lo que creo que al final es más correcto que todos los include/require utilicen __DIR__ como parte de la ruta y que en todas las rutas que hayamos podido utilizar hagamos lo mismo, utilizar rutas absolutas.
El cron de cada plugin con la carga el cron.php del núcleo.
https://github.com/NeoRazorX/facturascripts_2015/blob/master/cron.php

Que también carga config, fs_vars, etc... no hace falta cargarlo de nuevo en cada plugin.
Yo pensaba lo mismo, pero mira que sucede cuando ejecuto cron directamente sin los requires:

$ php cron.php 
PHP Fatal error: Uncaught Error: Class 'fs_var' not found in /home/shawe/Publico/FacturaScripts/plugins/backup_restore/cron.php:51
Stack trace:
#0 /home/shawe/Publico/FacturaScripts/plugins/backup_restore/cron.php(186): cron_backup->__construct(NULL)
#1 {main}
thrown in /home/shawe/Publico/FacturaScripts/plugins/backup_restore/cron.php on line 51

Fatal error: Uncaught Error: Class 'fs_var' not found in /home/shawe/Publico/FacturaScripts/plugins/backup_restore/cron.php:51
Stack trace:
#0 /home/shawe/Publico/FacturaScripts/plugins/backup_restore/cron.php(186): cron_backup->__construct(NULL)
#1 {main}
thrown in /home/shawe/Publico/FacturaScripts/plugins/backup_restore/cron.php on line 51


Si no hubiera sido porque añadiendo esto:

require_once __DIR__ . '/../../config.php';
require_once __DIR__ . '/../../base/config2.php';
require_once __DIR__ . '/../../base/fs_cache.php';
require_once __DIR__ . '/../../base/fs_model.php';
require_once __DIR__ . '/../../model/fs_var.php';


Y cambiando lo que dije anteriormente dejo de fallar, no hubiera hecho este reporte.

Estoy utilizando todo de código sin modificar de sus respectivos repositorios originales.
¿Cómo estás ejecutando el cron?
Hay que ejecutar el cron.php de la carpeta de FacturaScripts, no el del plugin.


Copyright (c) 2013-2020 FacturaScripts