diff options
author | Yaco <franco@reevo.org> | 2020-06-04 11:01:00 -0300 |
---|---|---|
committer | Yaco <franco@reevo.org> | 2020-06-04 11:01:00 -0300 |
commit | fc7369835258467bf97eb64f184b93691f9a9fd5 (patch) | |
tree | daabd60089d2dd76d9f5fb416b005fbe159c799d /www/crm/wp-cron.php |
first commit
Diffstat (limited to 'www/crm/wp-cron.php')
-rw-r--r-- | www/crm/wp-cron.php | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/www/crm/wp-cron.php b/www/crm/wp-cron.php new file mode 100644 index 00000000..ca478e4c --- /dev/null +++ b/www/crm/wp-cron.php @@ -0,0 +1,147 @@ +<?php +/** + * A pseudo-CRON daemon for scheduling WordPress tasks + * + * WP Cron is triggered when the site receives a visit. In the scenario + * where a site may not receive enough visits to execute scheduled tasks + * in a timely manner, this file can be called directly or via a server + * CRON daemon for X number of times. + * + * Defining DISABLE_WP_CRON as true and calling this file directly are + * mutually exclusive and the latter does not rely on the former to work. + * + * The HTTP request to this file will not slow down the visitor who happens to + * visit when the cron job is needed to run. + * + * @package WordPress + */ + +ignore_user_abort( true ); + +/* Don't make the request block till we finish, if possible. */ +if ( function_exists( 'fastcgi_finish_request' ) && version_compare( phpversion(), '7.0.16', '>=' ) ) { + fastcgi_finish_request(); +} + +if ( ! empty( $_POST ) || defined( 'DOING_AJAX' ) || defined( 'DOING_CRON' ) ) { + die(); +} + +/** + * Tell WordPress we are doing the CRON task. + * + * @var bool + */ +define( 'DOING_CRON', true ); + +if ( ! defined( 'ABSPATH' ) ) { + /** Set up WordPress environment */ + require_once( dirname( __FILE__ ) . '/wp-load.php' ); +} + +/** + * Retrieves the cron lock. + * + * Returns the uncached `doing_cron` transient. + * + * @ignore + * @since 3.3.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @return string|false Value of the `doing_cron` transient, 0|false otherwise. + */ +function _get_cron_lock() { + global $wpdb; + + $value = 0; + if ( wp_using_ext_object_cache() ) { + /* + * Skip local cache and force re-fetch of doing_cron transient + * in case another process updated the cache. + */ + $value = wp_cache_get( 'doing_cron', 'transient', true ); + } else { + $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", '_transient_doing_cron' ) ); + if ( is_object( $row ) ) { + $value = $row->option_value; + } + } + + return $value; +} + +$crons = wp_get_ready_cron_jobs(); +if ( empty( $crons ) ) { + die(); +} + +$gmt_time = microtime( true ); + +// The cron lock: a unix timestamp from when the cron was spawned. +$doing_cron_transient = get_transient( 'doing_cron' ); + +// Use global $doing_wp_cron lock otherwise use the GET lock. If no lock, trying grabbing a new lock. +if ( empty( $doing_wp_cron ) ) { + if ( empty( $_GET['doing_wp_cron'] ) ) { + // Called from external script/job. Try setting a lock. + if ( $doing_cron_transient && ( $doing_cron_transient + WP_CRON_LOCK_TIMEOUT > $gmt_time ) ) { + return; + } + $doing_cron_transient = $doing_wp_cron = sprintf( '%.22F', microtime( true ) ); + set_transient( 'doing_cron', $doing_wp_cron ); + } else { + $doing_wp_cron = $_GET['doing_wp_cron']; + } +} + +/* + * The cron lock (a unix timestamp set when the cron was spawned), + * must match $doing_wp_cron (the "key"). + */ +if ( $doing_cron_transient != $doing_wp_cron ) { + return; +} + +foreach ( $crons as $timestamp => $cronhooks ) { + if ( $timestamp > $gmt_time ) { + break; + } + + foreach ( $cronhooks as $hook => $keys ) { + + foreach ( $keys as $k => $v ) { + + $schedule = $v['schedule']; + + if ( $schedule != false ) { + $new_args = array( $timestamp, $schedule, $hook, $v['args'] ); + call_user_func_array( 'wp_reschedule_event', $new_args ); + } + + wp_unschedule_event( $timestamp, $hook, $v['args'] ); + + /** + * Fires scheduled events. + * + * @ignore + * @since 2.1.0 + * + * @param string $hook Name of the hook that was scheduled to be fired. + * @param array $args The arguments to be passed to the hook. + */ + do_action_ref_array( $hook, $v['args'] ); + + // If the hook ran too long and another cron process stole the lock, quit. + if ( _get_cron_lock() != $doing_wp_cron ) { + return; + } + } + } +} + +if ( _get_cron_lock() == $doing_wp_cron ) { + delete_transient( 'doing_cron' ); +} + +die(); |