ฉันวิ่ง cron และยกเลิกการประหารชีวิต ตอนนี้ฉันได้รับข้อความนี้:
กำลังพยายามเรียกใช้ cron อีกครั้งในขณะที่กำลังทำงานอยู่
ใน Drupal 7 ฉันสามารถลบ ตัวแปรcron_semaphore
วิธีในการบรรลุเป้าหมายเดียวกันใน Drupal 8 คืออะไร
ฉันวิ่ง cron และยกเลิกการประหารชีวิต ตอนนี้ฉันได้รับข้อความนี้:
กำลังพยายามเรียกใช้ cron อีกครั้งในขณะที่กำลังทำงานอยู่
ใน Drupal 7 ฉันสามารถลบ ตัวแปรcron_semaphore
วิธีในการบรรลุเป้าหมายเดียวกันใน Drupal 8 คืออะไร
คำตอบ:
ตอนนี้อยู่ในsemaphore
ตารางด้วยชื่อคีย์ "cron" สามารถลบออกได้ด้วยdrush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
คำสั่ง
หรือถ้าคุณสามารถรัน PHP ในสภาพแวดล้อม bootstrapped Drupal คุณสามารถเรียกใช้บรรทัด:
\Drupal::lock()->release('cron');
สำหรับ Drupal 8 run:
drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
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 ได้เกิดขึ้นกับฉันเพื่อให้ได้สคริปต์เดียวกันจากภายนอกซึ่ง bootstraps 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 ฉันเปลี่ยนสิทธิ์ผู้ใช้ที่จำเป็นในการเรียกใช้สคริปต์ซึ่งฉันวางไว้ในไดเรกทอรีที่มีไฟล์ authorize.php ในไฟล์ cron_cleanup.php
หากคุณสามารถเรียกใช้ Drush ได้ง่ายขึ้น (ดูคำตอบของ @ dman )
ไปที่หน้านี้เมื่อการติดตั้ง D7 ของฉันติดอยู่ ฉันปล่อยมันโดยใช้
php-eval "drupal_cron_cleanup ()"
lock_release('cron')
เพื่อปลดล็อค cron
หากคุณไม่สามารถทำให้มันทำงานใน Drupal 8 ด้วยขั้นตอนที่แนะนำจากด้านบน - บางทีคุณอาจกำลังใช้บางอย่างเช่น Redis และ cron lock ถูกเก็บไว้ที่นั่น ในกรณีนี้คุณสามารถดำเนินการกับ:
drush php-eval '\Drupal::service("lock")->release("all")'
drush php:eval '\Drupal::lock()->release("cron");'