第123行cache.php中的PHP致命错误$wp_Object_CACHE是非对象

时间:2017-10-16 作者:Andreas Rex

我这样使用瞬态(简单示例):

function my_url_cache( $url ) 
{
   $transient_id = hash( "crc32", $url );
   $content = get_transient( \'my_url_cache_\' . $transient_id );
   set_transient( \'my_url_cache_\' . $transient_id, $content, 60 * 60 * 24 );
   set_transient( \'my_url_cache_backup_\' . $transient_id, $content, 0 ); 
}
与我公司的插件一起,当他们想要刷新缓存时,会出现以下错误:

对/wordpress/wp includes/cache中的非对象调用成员函数get()。php在线123

Without my plugin they have no problems

/wordpress/wp-includes/cache.php on line 123:

/**
 * Retrieves the cache contents from the cache by key and group.
 *
 * @since 2.0.0
 *
 * @see WP_Object_Cache::get()
 * @global WP_Object_Cache $wp_object_cache Object cache global instance.
 *
 * @param int|string  $key    The key under which the cache contents are stored.
 * @param string      $group  Optional. Where the cache contents are grouped. Default empty.
 * @param bool        $force  Optional. Whether to force an update of the local cache from the persistent
 *                            cache. Default false.
 * @param bool        $found  Optional. Whether the key was found in the cache. Disambiguates a return of false,
 *                            a storable value. Passed by reference. Default null.
 * @return bool|mixed False on failure to retrieve contents or the cache
 *                    contents on success
 */
    function wp_cache_get( $key, $group = \'\', $force = false, &$found = null ) {
        global $wp_object_cache;

        return $wp_object_cache->get( $key, $group, $force, $found ); // Line 123
    }
On my Testserver I cannot reproduce this error.

它们不使用不同的缓存系统。

$wp\\u object\\u缓存似乎不是对象。我不知道是我的插件还是他们的插件,还是两者兼而有之。

Do I have to use a special hook in Wordpress, 在使用get\\uu和set\\u瞬态函数之前?我仅在此挂钩内使用缓存函数:

add_shortcode( \'feedimport\', array( $this, "shortcode_feedimport" ) );

UPDATE:

另一个插件使用wp\\u schedule\\u事件:

private static function cron_schedule_event_setup() {
    wp_clear_scheduled_hook(self::cron_hook);
    wp_schedule_event(time(), self::$options[\'schedule_event\'], self::cron_hook);
}
并将其数据存储在数据库表中。它们不使用get\\uSet\\u瞬态函数:(

我真的不知道我的插件会如何影响他们的插件。插件的完整代码:link

Update 2 - Solved:

public function __destruct() {
    $this->save_log();
}
这段代码启动了一个使用wordpress缓存系统的函数。

更改为:

add_action(\'shutdown\', array($this, "save_log"));
解决了问题。我从来没有在析构函数中再次使用Wordpress函数。

1 个回复
SO网友:Lucas Bustamante

实际上,使用时必须小心__destruct.

这是一个特殊函数,当对象即将销毁时激发。PHP调用时exit (作为wp_send_json() ,我们不控制PHP销毁对象的顺序。

所以__destruct 当它依赖于其他类时是非常危险的。我发现这会导致致命错误,尤其是在PHP 5.6上,这会导致如下错误:

/**
 * Job destructor
 */
public function __destruct()
{
    $this->logger->commit();
}

Fatal error: Uncaught Error: Call to a member function commit() on null

溶液,而不是:

$job = new Job;
wp_send_json($job->start());
执行:

wp_send_json((new Job)->start());
与以下内容相同:

$job = new Job;

$results = $job->start();

// Trigger __destruct while we are on a known state
unset($job);

wp_send_json($results);
当PHP进程将被exit 或adie.

wp_send_json() 是最显著的例子,因为我们经常使用它exit 在回显JSON字符串之后。但这可能适用于其他功能,如wp_die(), exit, die, 等

总之,只要确保__destruct 如果PHP进程将被中断,则会被销毁,否则可能会导致问题。

概念验证:https://3v4l.org/GBBIV

__destruct running on multiple PHP versions

结束

相关推荐

Batcache消息不再位于页面源中

我已放置advanced-cache.php 和object-cache.php 在里面wp-contents 并已更新wp-config.php 具有define(\'WP_CACHE\', true);, 但我没有看到页面源中的消息告诉我页面是从缓存提供的。我有WordPress 3.8.1,APC Object Cache Backend 2.0.6, 和Batcache 1.2. 从前,我会在页面源代码中看到消息,但现在不再看到了。这涉及到几个WordPress安装。我确实看到插件显示在WordP