为独立的PHP文件正确引导drupal吗?


16

这就是我现在所拥有的:

<?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();
?>

独立运行时,上面出现了很多错误。在我的模块中工作正常。一些错误是:

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).

1
如果执行完整的引导程序,那么独立的php文件有什么意义?
googletorp

2
@googletorp,当我想要Apache访问控制并希望不使用Drupal cron机制时,我会不时使用这些内容通过crontab安排时间。我要补充一点,在大多数情况下,使用适当的hook_menu()条目或drush命令通常是一个更好的主意。
mpdonadio

1
现在在一个站点上工作,需要使用一些外部PHP文件来利用这种类型的功能。我最近发现了这一点,也许对您有所帮助:interworks.com/blogs/jkhalaj/2012/05/01/how-bootstrap-drupal
fndtn357

您可以使用drush src命令引导drupal 以下是一些说明:oliverdavies.co.uk/blog/2013/11/dont-bootstrap-drupal-use-drush
ya.teck 2014年

Answers:


14

到目前为止,管理引导程序最简单的方法是使用drush php-script(别名为scr)。

file.php:

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

Cli:

drush @alias scr file.php

输出:

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

这样,您无需处理任何有关引导程序的问题,drush可以完全为您解决问题,并且由于使用别名,使您能够轻松地在各个站点之间使用它。(即使我没有尝试过,也可能在远程站点上工作)


如果要在远程站点上执行此操作,则脚本必须是远程的(请参阅drupal.stackexchange.com/questions/98098)。如果我有空闲时间(ha!),请尝试为此打补丁。
mpdonadio

这确实是最简单的方法,应该获得更多支持。
Bala Clark

到底@alias应该做什么?我只得到一个Could not find the alias @alias。不幸的是,您提供的链接已断开。您能解决它并扩大您的解释吗?
leymannx

@leymannx嘿,对不起,我之前没有注意到您的问题。我已经更新了文档的链接。但是,我没有扩展别名部分,因为匆忙别名确实超出了此特定问题的范围。
Letharion '16

11

您的独立Drupal 7引导程序不太正确。

尝试这个:

/**
 * 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

希望这可以帮助。


嗯 它在此行静默失败:$ users = views_get_view_result('userlist','uid_list'); 我是否正确,您的drupal_override_server_variables调用应指向我的php文件的位置?
Joren 2012年

是的,你正确的。该引导程序仅加载数据库层,而不加载模块。您必须为视图调用模块初始化挂钩才能使用其功能,或在此处包含负责数据处理的模块文件: require_once DRUPAL_ROOT . '...'; // include required module files to work with here
Zydrunas Tamasauskas 2012年

我已经包括common.inc,views.module和ctools.module,因为这些错误使他们很明显地需要它们。在这3个之后,我不再出错,它只是默默地死了。不知道从这里去哪里。
Joren 2012年

在每个包含物之后进行打印输出,并查看其卡在哪里。然后,您可能知道出了什么问题。作为一种选择,尝试进行完整的引导,看看会发生什么。
Zydrunas Tamasauskas,2012年

2

这就够了:

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

0

最后的错误

警告:include_once(sites / all / modules / views_bulk_operations / actions / archive.action.inc):无法打开流:views_bulk_operations_load_action_includes()中没有这样的文件或目录(/ var / www / clients / clients / client1 / web15 /网站/网站/所有/模块/views_bulk_operations/views_bulk_operations.module)。

是VBO中的错误。views_bulk_operations_load_action_includes()使用include_once时不使用DRUPAL_ROOT。我会提交一个错误并在VBO中修复它。

另一个错误(两者相互关联)可能与访问模块.info文件时未使用DRUPAL_ROOT的_system_rebuild_module_data()有关。我会将断点放在$ modules变量的system_rebuild_module_data()中,看看是否可以将其指向。再次向drupal core提交错误,因为我在问题队列中没有看到此问题。

祝好运!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.