Drupal 7 verwendet nicht mehr die Variable cron_semaphore , sondern eine Sperre. Siehe drupal_cron_run()
insbesondere die folgenden Zeilen, die Teil dieser Funktion sind.
// Try to acquire cron lock.
if (!lock_acquire('cron', 240.0)) {
// Omissis
}
// Release cron lock.
lock_release('cron');
Das Portieren dieser Leitungen auf Drupal 8 ist recht einfach, da Drupal 8 einen Dienst zum Erhalten und Freigeben einer Sperre bietet.
Der entsprechende Code ist in Cron::run()
.
// Try to acquire cron lock.
if (!$this->lock->acquire('cron', 900.0)) {
// Omissis
}
// Release cron lock.
$this->lock->release('cron');
Wenn Sie es auf einem Host entsperren müssen, auf dem Sie Drush nicht verwenden können, wie es mir passiert, um dasselbe von einem externen Skript aus zu erreichen, für das Bootstraps Drupal Code ähnlich dem folgenden erfordern würde.
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();
Ich habe den Code von authorize.php angepasst . Ich habe die zum Ausführen des Skripts erforderliche Benutzerberechtigung geändert, die ich in das Verzeichnis mit der Datei authorize.php in der Datei cron_cleanup.php gestellt habe.
Wenn Sie Drush ausführen können, wird es einfacher. (Siehe @ dmans Antwort .)
drush php:eval '\Drupal::lock()->release("cron");'