Tôi chạy cron và hủy bỏ việc thực thi. Bây giờ tôi nhận được tin nhắn này:
Cố gắng chạy lại cron khi nó đang chạy.
Trong Drupal 7, tôi có thể xóa biến cron_semaphore .
Cách nào để đạt được điều tương tự trong Drupal 8?
Tôi chạy cron và hủy bỏ việc thực thi. Bây giờ tôi nhận được tin nhắn này:
Cố gắng chạy lại cron khi nó đang chạy.
Trong Drupal 7, tôi có thể xóa biến cron_semaphore .
Cách nào để đạt được điều tương tự trong Drupal 8?
Câu trả lời:
Bây giờ trong semaphore
bảng có tên khóa "cron". Điều này có thể được gỡ bỏ thông qua một drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
lệnh.
Hoặc, nếu bạn có thể thực thi PHP trong môi trường khởi động Drupal, bạn có thể chạy dòng:
\Drupal::lock()->release('cron');
Nhờ câu trả lời của Shawns ..
drush php-eval "\Drupal::lock()->release('cron');"
Dường như để giúp đỡ!
Đến trang này khi cài đặt D7 của tôi bị kẹt. Tôi đã phát hành nó bằng cách sử dụng
php-eval "drupal_cron_cleanup ()"
lock_release('cron')
để giải phóng khóa cron.
Drupal 7 không sử dụng biến cron_semaphore nữa mà là khóa. Xem drupal_cron_run()
và đặc biệt là các dòng sau, một phần của chức năng đó.
// Try to acquire cron lock.
if (!lock_acquire('cron', 240.0)) {
// Omissis
}
// Release cron lock.
lock_release('cron');
Chuyển các dòng đó sang Drupal 8 khá đơn giản, vì Drupal 8 có dịch vụ nhận và phát hành khóa.
Mã tương đương là trong Cron::run()
.
// Try to acquire cron lock.
if (!$this->lock->acquire('cron', 900.0)) {
// Omissis
}
// Release cron lock.
$this->lock->release('cron');
Nếu bạn cần mở khóa nó trong một máy chủ nơi bạn không thể sử dụng Drush, như điều đó xảy ra với tôi, để đạt được điều tương tự từ một tập lệnh bên ngoài mà bootstraps Drupal sẽ yêu cầu mã tương tự như sau.
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();
Tôi đã điều chỉnh mã của Authorize.php . Tôi đã thay đổi quyền người dùng cần thiết để chạy tập lệnh mà tôi đã đặt trong thư mục chứa tệp Authorize.php, trong tệp cron_cleanup.php.
Nếu bạn có thể chạy Drush, nó sẽ dễ dàng hơn. (Xem câu trả lời của @ dman .)
Nếu bạn không thể làm cho nó hoạt động trong Drupal 8 với các bước được đề xuất từ phía trên - có lẽ bạn đang sử dụng một cái gì đó như Redis và khóa cron được lưu trữ ở đó. Trong trường hợp này, bạn có thể tiến hành với:
drush php-eval '\Drupal::service("lock")->release("all")'
drush php:eval '\Drupal::lock()->release("cron");'