जवाबों:
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 फ़ाइल में प्राधिकृत फ़ाइल।
यदि आप ड्रश चला सकते हैं, तो यह आसान हो जाता है। (देखें @ dman का जवाब ।)
मेरे D7 इंस्टॉलेशन के अटकने पर इस पेज पर आए। मैंने उपयोग करके इसे जारी किया
php-eval "drupal_cron_cleanup ()"
lock_release('cron')
क्रोन लॉक को रिलीज करने के लिए है।
यदि आप इसे ऊपर से सुझाए गए चरणों के साथ ड्रुपल 8 में काम करने के लिए नहीं प्राप्त कर सकते हैं - शायद आप रेडिस की तरह कुछ का उपयोग कर रहे हैं और क्रोन लॉक वहां संग्रहीत है। इस मामले में आप के साथ प्रगति कर सकते हैं:
drush php-eval '\Drupal::service("lock")->release("all")'
drush php:eval '\Drupal::lock()->release("cron");'