File "ActionScheduler_Abstract_QueueRunner.php"

Full path: /home/kosmetik/public_html/wp-content/plugins/woocommerce/packages/action-scheduler/classes/abstracts/ActionScheduler_Abstract_QueueRunner.php
File size: 5.27 B
MIME-type: text/x-php
Charset: utf-8

Download   Open   Edit   Advanced Editor   Back

<?php

abstract class ActionScheduler_Abstract_QueueRunner extends ActionScheduler_Abstract_QueueRunner_Deprecated
{
    protected $cleaner;
    protected $monitor;
    protected $store;
    private $created_time;
    public function __construct(ActionScheduler_Store $store = null, ActionScheduler_FatalErrorMonitor $monitor = null, ActionScheduler_QueueCleaner $cleaner = null)
    {
        $this->created_time = microtime(true);
        $this->store = $store ? $store : ActionScheduler_Store::instance();
        $this->monitor = $monitor ? $monitor : new ActionScheduler_FatalErrorMonitor($this->store);
        $this->cleaner = $cleaner ? $cleaner : new ActionScheduler_QueueCleaner($this->store);
    }
    public function process_action($action_id, $context = '')
    {
        try {
            $valid_action = false;
            do_action('action_scheduler_before_execute', $action_id, $context);
            if (ActionScheduler_Store::STATUS_PENDING !== $this->store->get_status($action_id)) {
                do_action('action_scheduler_execution_ignored', $action_id, $context);
                return;
            }
            $valid_action = true;
            do_action('action_scheduler_begin_execute', $action_id, $context);
            $action = $this->store->fetch_action($action_id);
            $this->store->log_execution($action_id);
            $action->execute();
            do_action('action_scheduler_after_execute', $action_id, $action, $context);
            $this->store->mark_complete($action_id);
        } catch (Exception $e) {
            if ($valid_action) {
                $this->store->mark_failure($action_id);
                do_action('action_scheduler_failed_execution', $action_id, $e, $context);
            } else {
                do_action('action_scheduler_failed_validation', $action_id, $e, $context);
            }
        }
        if (isset($action) && is_a($action, 'ActionScheduler_Action') && $action->get_schedule()->is_recurring()) {
            $this->schedule_next_instance($action, $action_id);
        }
    }
    protected function schedule_next_instance(ActionScheduler_Action $action, $action_id)
    {
        try {
            ActionScheduler::factory()->repeat($action);
        } catch (Exception $e) {
            do_action('action_scheduler_failed_to_schedule_next_instance', $action_id, $e, $action);
        }
    }
    protected function run_cleanup()
    {
        $this->cleaner->clean(10 * $this->get_time_limit());
    }
    public function get_allowed_concurrent_batches()
    {
        return apply_filters('action_scheduler_queue_runner_concurrent_batches', 1);
    }
    public function has_maximum_concurrent_batches()
    {
        return $this->store->get_claim_count() >= $this->get_allowed_concurrent_batches();
    }
    protected function get_time_limit()
    {
        $time_limit = 30;
        if (has_filter('action_scheduler_maximum_execution_time')) {
            _deprecated_function('action_scheduler_maximum_execution_time', '2.1.1', 'action_scheduler_queue_runner_time_limit');
            $time_limit = apply_filters('action_scheduler_maximum_execution_time', $time_limit);
        }
        return absint(apply_filters('action_scheduler_queue_runner_time_limit', $time_limit));
    }
    protected function get_execution_time()
    {
        $execution_time = microtime(true) - $this->created_time;
        if (function_exists('getrusage') && apply_filters('action_scheduler_use_cpu_execution_time', defined('PANTHEON_ENVIRONMENT'))) {
            $resource_usages = getrusage();
            if (isset($resource_usages['ru_stime.tv_usec'], $resource_usages['ru_stime.tv_usec'])) {
                $execution_time = $resource_usages['ru_stime.tv_sec'] + $resource_usages['ru_stime.tv_usec'] / 1000000;
            }
        }
        return $execution_time;
    }
    protected function time_likely_to_be_exceeded($processed_actions)
    {
        $execution_time = $this->get_execution_time();
        $max_execution_time = $this->get_time_limit();
        $time_per_action = $execution_time / $processed_actions;
        $estimated_time = $execution_time + $time_per_action * 3;
        $likely_to_be_exceeded = $estimated_time > $max_execution_time;
        return apply_filters('action_scheduler_maximum_execution_time_likely_to_be_exceeded', $likely_to_be_exceeded, $this, $processed_actions, $execution_time, $max_execution_time);
    }
    protected function get_memory_limit()
    {
        if (function_exists('ini_get')) {
            $memory_limit = ini_get('memory_limit');
        } else {
            $memory_limit = '128M';
        }
        if (!$memory_limit || -1 === $memory_limit || '-1' === $memory_limit) {
            $memory_limit = '32G';
        }
        return ActionScheduler_Compatibility::convert_hr_to_bytes($memory_limit);
    }
    protected function memory_exceeded()
    {
        $memory_limit = $this->get_memory_limit() * 0.9;
        $current_memory = memory_get_usage(true);
        $memory_exceeded = $current_memory >= $memory_limit;
        return apply_filters('action_scheduler_memory_exceeded', $memory_exceeded, $this);
    }
    protected function batch_limits_exceeded($processed_actions)
    {
        return $this->memory_exceeded() || $this->time_likely_to_be_exceeded($processed_actions);
    }
    public abstract function run($context = '');
}