Answers:
Drupal 7不再使用cron_semaphore变量,而是使用锁。请参见drupal_cron_run()
,特别是以下几行,该功能的一部分。
// Try to acquire cron lock.
if (!lock_acquire('cron', 240.0)) {
// Omissis
}
// Release cron lock.
lock_release('cron');
将这些行移植到Drupal 8上很简单,因为Drupal 8具有获取和释放锁的服务。
等效代码在中Cron::run()
。
// Try to acquire cron lock.
if (!$this->lock->acquire('cron', 900.0)) {
// Omissis
}
// Release cron lock.
$this->lock->release('cron');
如果您需要在无法使用Drush的主机上解锁它(就像我所遇到的那样),要通过引导Drupal的外部脚本实现相同功能,则需要类似以下代码的代码。
use Drupal\Core\DrupalKernel;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Drupal\Core\Site\Settings;
chdir('..');
$autoloader = require_once 'autoload.php';
function cron_unlock_access_allowed(Request $request) {
$account = \Drupal::service('authentication')->authenticate($request);
if ($account) {
\Drupal::currentUser()->setAccount($account);
}
return \Drupal::currentUser()->hasPermission('administer site configuration');
}
try {
$request = Request::createFromGlobals();
$kernel = DrupalKernel::createFromRequest($request, $autoloader, 'prod');
$kernel->prepareLegacyRequest($request);
}
catch (HttpExceptionInterface $e) {
$response = new Response('', $e->getStatusCode());
$response->prepare($request)->send();
exit;
}
\Drupal::moduleHandler()->addModule('system', 'core/modules/system');
\Drupal::moduleHandler()->addModule('user', 'core/modules/user');
\Drupal::moduleHandler()->load('system');
\Drupal::moduleHandler()->load('user');
if (cron_unlock_access_allowed($request)) {
\Drupal::lock()->release('cron');
$status_code = 200;
}
else {
$status_code = 403;
}
$response = new Response('', $status_code);
$response->prepare($request)->send();
我修改了authorize.php的代码。我更改了运行脚本所需的用户权限,该脚本放置在cron_cleanup.php文件中的包含authorize.php文件的目录中。
如果您可以运行Drush,它将变得更加容易。(请参阅@dman的答案。)
当我的D7安装卡住时,转到此页面。我通过使用释放了它
php-eval“ drupal_cron_cleanup()”
lock_release('cron')
释放cron锁。
drush php:eval '\Drupal::lock()->release("cron");'