Support » Fixing WordPress » wp-cron.php problem

Viewing 15 replies - 1 through 15 (of 34 total)
  • The steps on that page turn it off in one place and call it in another, so I don’t see how that would help you if the function is getting bad data. The line of code is using the data saved for the scheduled events. Apparently, there is wrong data in the scheduled event. Do you have any plugins that set reminders or do things later?

    wordfence,jetpack
    i am using plugins

    The file sequence contains all of the line of code that gives the error.

    
    f ( $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 != true ) {
    				$new_args = array( $timestamp, $schedule, $hook, $v['args'] );
    				call_user_func_array( 'wp_reschedule_event', $new_args );
    			}
    
    			wp_unschedule_event( $timestamp, $hook, $v['args'] );
    

    foreach ( $cronhooks as $hook => $keys )

    this 111 line

    foreach ( $cronhooks as $hook => $keys )

    this 111 line

    foreach only works with arrays any other data issues a warning.
    Some of these features were introduced in the wordpress version 5.1, I’m sorry I can’t figure out what’s wrong.

    @batuhanguldemir that means that something is supplying invalid data to the $cronhooks loop – I suspect it’s one of your plugins.

    You can try to debug this and figure out what it is by adding this before line 111:
    error_log(print_r($cronhooks, TRUE));

    This will log all cron hooks to the error log – you can then see which one is printed before the error occurs.

    ı have 7 plugins (akismet,cloudflare,jetpack,limit-login-attempts-reloaded,sucuri-scanner,w3-total-cache,wordfence)

    i’ll try to disable them all

    @batuhanguldemir Is W3 Total Cache updated? It could be the source.

    @designsmoke
    I’m not very expert on this , my plugin settings are as here.
    https://bloggingwizard.com/w3-total-cache-cloudflare/

    @designsmoke error log details

    [16-May-2019 20:41:04 UTC] PHP Warning: Invalid argument supplied for foreach() in /home/xxxxxxx/public_html/wp-cron.php on line 111
    [16-May-2019 20:41:04 UTC] Array
    (
    [recovery_mode_clean_expired_keys] => Array
    (
    [40cd750bba9870f18aada2478b24840a] => Array
    (
    [schedule] => daily
    [args] => Array
    (
    )

    [interval] => 86400
    )

    )

    [jetpack_clean_nonces] => Array
    (
    [40cd750bba9870f18aada2478b24840a] => Array
    (
    [schedule] => hourly
    [args] => Array
    (
    )

    [interval] => 3600
    )

    )

    )

    [16-May-2019 20:41:04 UTC] Array
    (
    [jetpack_sync_cron] => Array
    (
    [40cd750bba9870f18aada2478b24840a] => Array
    (
    [schedule] => jetpack_sync_interval
    [args] => Array
    (
    )

    [interval] => 300
    )

    )

    [jetpack_sync_full_cron] => Array
    (
    [40cd750bba9870f18aada2478b24840a] => Array
    (
    [schedule] => jetpack_sync_interval
    [args] => Array
    (
    )

    [interval] => 300
    )

    )

    )

    [16-May-2019 20:41:07 UTC] Array
    (
    [wp_privacy_delete_old_export_files] => Array
    (
    [40cd750bba9870f18aada2478b24840a] => Array
    (
    [schedule] => hourly
    [args] => Array
    (
    )

    [interval] => 3600
    )

    )

    [wp_version_check] => Array
    (
    [40cd750bba9870f18aada2478b24840a] => Array
    (
    [schedule] => twicedaily
    [args] => Array
    (
    )

    [interval] => 43200
    )

    )

    [wp_update_plugins] => Array
    (
    [40cd750bba9870f18aada2478b24840a] => Array
    (
    [schedule] => twicedaily
    [args] => Array
    (
    )

    [interval] => 43200
    )

    )

    [wp_update_themes] => Array
    (
    [40cd750bba9870f18aada2478b24840a] => Array
    (
    [schedule] => twicedaily
    [args] => Array
    (
    )

    [interval] => 43200
    )

    )

    )

    @batuhanguldemir Do you have the cron task that happened before the warning?

    @designsmoke
    as far as I know.
    only jetpack and wordfence remote access available

    @designsmoke
    all cron page code here

    <?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 <code>doing_cron</code> transient.
     *
     * @ignore
     * @since 3.3.0
     *
     * @global wpdb $wpdb WordPress database abstraction object.
     *
     * @return string|false Value of the <code>doing_cron</code> 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;
    	}
    error_log(print_r($cronhooks, TRUE));
    	foreach ( $cronhooks as $hook => $keys ) {
    
    		foreach ( $keys as $k => $v ) {
    
    			$schedule = $v['schedule'];
    
    			if ( $schedule != true ) {
    				$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();
    if(!is_array($cronhooks)){
    if(is_null($cronhooks)){
    $cronhooks = (int) $cronhooks;
    }
    error_log(print_r($cronhooks, TRUE)."\n");
    }

    Prove this for your errors 🙂

    I searched a lot. Since I couldn’t find the answer, I got the following codes. Do you think there is a problem?

    	foreach ( $cronhooks as $hook => $keys ) {
    
    		foreach ( $keys as $k => $v ) {
    
    			$schedule = $v['schedule'];
    
    			if ( $schedule != true ) {
    				$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;
    			}
    		}
    	}

    yes surely there is a problem but the log you posted is right, use my code because foreach puts a warning only if $cronhooks is not an array

Viewing 15 replies - 1 through 15 (of 34 total)
  • The topic ‘wp-cron.php problem’ is closed to new replies.