¿Drupal de arranque adecuado para un archivo PHP independiente?

16

Esto es lo que tengo ahora:

<?php
    define('DRUPAL_ROOT', '/var/www/clients/client1/web15/web');
    include_once(DRUPAL_ROOT . '/includes/bootstrap.inc');
    drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
//  drupal_flush_all_caches();  

    $users = views_get_view_result('userlist', 'uid_list');
    $i = 0;
    foreach ($users as $user) {
        $filename = 'sites/default/files/generated_pdfs/individual_pdf_report_' . $user->uid . '.pdf';
        generate_employee_pdf($user->uid, $filename);
        error_log('Generated ' . $filepath);
        $i++;
    }
    // create object
    $zip = new ZipArchive();
    // open archive
    if ($zip->open("sites/default/files/generated_zips/individual-reports.zip", ZIPARCHIVE::CREATE) !== TRUE) {
        die ("Could not open archive");
    }
    // initialize an iterator
    // pass it the directory to be processed
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("sites/default/files/generated_pdfs/"));
    // iterate over the directory
    // add each file found to the archive
    foreach ($iterator as $key=>$value) {
        $zip->addFile(realpath($key), $value->getFilename()) or die ("ERROR: Could not add file: $key");
    }
    // close and save archive
    $zip->close();
?>

Recibo un montón de errores de lo anterior cuando se ejecuta de forma independiente. Funciona bien en mi módulo. Algunos de los errores son:

Warning: Invalid argument supplied for foreach() in drupal_depth_first_search() (line 56 of /var/www/clients/client1/web15/web/includes/graph.inc).
Warning: Invalid argument supplied for foreach() in _module_build_dependencies() (line 229 of /var/www/clients/client1/web15/web/includes/module.inc).
Warning: include_once(sites/all/modules/views_bulk_operations/actions/archive.action.inc): failed to open stream: No such file or directory in views_bulk_operations_load_action_includes() (line 56 of /var/www/clients/client1/web15/web/sites/all/modules/views_bulk_operations/views_bulk_operations.module).
Joren
fuente
1
¿Cuál es el punto de un archivo php independiente si haces un arranque completo?
googletorp
2
@googletorp, los uso de vez en cuando para programar cosas a través de un crontab cuando quiero el control de acceso de Apache y quiero estar fuera del mecanismo cron de Drupal. Sin embargo, agregaría que usar una entrada hook_menu () adecuada o un comando drush suele ser una mejor idea en la mayoría de las circunstancias.
mpdonadio
1
Trabajando en un sitio ahora mismo con varios archivos PHP externos que necesitan utilizar este tipo de funcionalidad. He encontrado esto recientemente, tal vez va a ayudar: interworks.com/blogs/jkhalaj/2012/05/01/how-bootstrap-drupal
fndtn357
Puede arrancar drupal con el comando drush src Aquí hay algunas explicaciones: oliverdavies.co.uk/blog/2013/11/dont-bootstrap-drupal-use-drush
ya.teck

Respuestas:

14

Con mucho, la forma más fácil de administrar el bootstrap es usar drush php-script , alias scr.

file.php:

<?php
echo l('Link', 'path');

Cli:

drush @alias scr file.php

Salida:

<a href="/path">Link</a>

De esta manera, no debe lidiar con nada con respecto al bootstrap, drush lo resolverá por completo para usted y le brinda la capacidad de usarlo fácilmente en todos los sitios gracias a los alias. (Incluso podría funcionar en sitios remotos, aunque no lo he intentado)

Letharion
fuente
Si desea hacer esto en un sitio remoto, la secuencia de comandos debe ser remota (consulte drupal.stackexchange.com/questions/98098 ). Si alguna vez tengo tiempo libre (¡ja!) Probaré un parche para esto.
mpdonadio
Esta es realmente la forma más simple de hacerlo y debería obtener más votos a favor.
Bala Clark
¿Qué se @aliassupone que debe hacer exactamente ? Solo recibo un Could not find the alias @alias. Lamentablemente, el enlace que proporcionó está roto. ¿Podría arreglarlo y ampliar su explicación?
leymannx
@leymannx Hola, lo siento, no noté tu pregunta antes. He actualizado el enlace a la documentación. Sin embargo, no he ampliado la parte del alias, ya que los alias borrosos están realmente fuera del alcance de esta pregunta en particular.
Letharion
11

su arranque Drupal 7 independiente no es del todo correcto.

Prueba esto:

/**
 * Do not let execute this file from http request
 */
if (isset($_SERVER['REMOTE_ADDR'])) {
  print "...";
  exit(1);
}

/**
 * Initialize Drupal
 */
define('DRUPAL_ROOT', '/var/www/clients/client1/web15/web');
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
require_once DRUPAL_ROOT . '...'; // include required module files to work with here

drupal_override_server_variables(array('url' => 'http://www.example.com/batch.php')); // trick drupal to do bootstrap
drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);

set_time_limit(4600); // adjust for your needs
ini_set('memory_limit', '3524M'); // adjust for your needs

Espero que esto ayude.

Zydrunas Tamasauskas
fuente
Hmm Falla silenciosamente en esta línea: $ users = views_get_view_result ('userlist', 'uid_list'); ¿Estoy correcto de que su llamada drupal_override_server_variables debe apuntar a la ubicación de mi archivo php?
Joren
Si, tienes razón. Este bootstrap carga solo la capa de base de datos, pero no los módulos. Debe invocar el enlace de inicio del módulo para que las vistas utilicen su funcionalidad o incluir el archivo del módulo responsable del procesamiento de datos aquí: require_once DRUPAL_ROOT . '...'; // include required module files to work with here
Zydrunas Tamasauskas
He incluido common.inc, views.module y ctools.module ya que los errores hicieron obvio que eran necesarios. Después de estos 3, dejé de recibir errores y simplemente murió en silencio. No estoy seguro de a dónde ir desde aquí.
Joren
Haga impresiones después de cada inclusión y vea dónde se pegó. Entonces puedes saber lo que está mal. Como opción, intente hacer un arranque completo y ver qué sucede.
Zydrunas Tamasauskas
2

esto es suficiente:

define('DRUPAL_ROOT', '/path/to/drupal/root/');
 require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
Matoeil
fuente
0

El ultimo error

Advertencia: include_once (sites / all / modules / views_bulk_operations / actions / archive.action.inc): error al abrir la secuencia: No existe dicho archivo o directorio en views_bulk_operations_load_action_includes () (línea 56 de / var / www / clients / client1 / web15 / web / sites / all / modules / views_bulk_operations / views_bulk_operations.module).

es un error en VBO. views_bulk_operations_load_action_includes () no usa DRUPAL_ROOT cuando usa include_once. Archivaría un error y lo arreglaría en VBO.

El otro error (los 2 están relacionados entre sí) podría estar relacionado con _system_rebuild_module_data () que no usa DRUPAL_ROOT al acceder al archivo .info de módulos. Pondría puntos de ruptura en system_rebuild_module_data () para la variable $ modules y veré si puedes señalarlo. Una vez más, presente un error con drupal core, ya que no veo este problema en la cola de problemas.

¡Buena suerte!

mikeytown2
fuente