Skip to main content

Session validation failed en Laminas

Desarrollando el módulo de Authentication en Laminas me encontré con el siguiente problema.

Error:

Laminas\ServiceManager\Exception\ServiceNotCreatedException

Message:

Service with name «Laminas\Authentication\AuthenticationService» could not be created. Reason: Session validation failded

Solución

La solución que he realizando es la siguiente:

Compruebo que en el fichero de config/autoload/global.php esta la siguiente configuración:

...
'session_manager' => [
     // Session validators (used for security).
     'validators' => [
         RemoteAddr::class,
         HttpUserAgent::class,
     ]
],
...

En mi caso me dirijo a la función onBootstrap (Module.php) de módulo que estoy implementando para forzar el inicio de sessión.

use Laminas\Session\SessionManager;

public function onBootstrap(MvcEvent $event) {
   ...
   $application = $event->getApplication();
   $serviceManager = $application->getServiceManager();

   $sessionManager = $serviceManager->get(SessionManager::class);
   $this->forgetInvalidSession($sessionManager);
   ...
}

protected function forgetInvalidSession($sessionManager) {
   try {
        $sessionManager->start();
         return;
   } catch (\Exception $e) {}
   /**
   * Session validation failed: toast it and carry on.
   */
   // @codeCoverageIgnoreStart
   session_unset();
   // @codeCoverageIgnoreEnd
}

Con la función forgetInvalidSession conseguiremos iniciar la sessión y sino es válida, la eliminaremos con session_unset();

Espero que os sea útil.

La solución la pude encontrar en el aquí.

Mostrar consultas realizadas por mi WordPress

Si lo que estamos buscando es optimizar nuestro wordpress, esta función te puede venir bien para saber cuantas consultas realiza a la base de datos.

Lo primero que tenemos que hacer es habilitar SAVEQUERIES en nuestro fichero «wp-config.php«

define('SAVEQUERIES', true);

Esto le dice a WordPress que guarde todas las consultas.

Para obtener la consultas realizadas hay que utilizar $wpdb->query, añadimos este código a nuestra página (por ejemplo en el footer)

global $wpdb;
echo '<pre>';
print_r($wpdb->queries);
echo '</pre>';

Obtendremos:

[0] => Array
        (
            [0] => SELECT option_name, option_value FROM dg_options WHERE autoload = 'yes'
            [1] => 0.00107002258301
            [2] => require('wp-blog-header.php'), require_once('wp-load.php'), require_once('wp-config.php'), require_once('wp-settings.php'), wp_not_installed, is_blog_installed, wp_load_alloptions
            [3] => 1588409077.08
            [4] => Array
                (
                )

        )

Pruebas realizadas en la versión de WordPress 5.4.1

Cuantas consulta a la base de datos realiza mi WordPress

WordPress nos facilita una función (get_num_queries()) para obtener el número de consultas a la base de datos:

get_num_queries()

Ejemplo:

Añado este código al fichero footer.php justo antes de cerrar el body (</body).

<?php echo '<!-- ' . get_num_queries() . ' consultas a la base de datos -->'; ?>

Para ver la cantidad tienes que ver el código fuente puesto que esta comentado en el html.

Resetear key de un array en PHP

En el siguiente ejemplo vamos a resetear las keys de un array en php.

$array[4] = 'PHP';
$array[6] = 'CSS';
$array[10] = 'Javascript';
$array[10] = 'Angular';

$arrayK = array_values($array);

$arrayK[0] = 'Apple';
$arrayK[1] = 'Orange';
$arrayK[2] = 'Peach';

Para resetear las key de un array vamos a utilizar la función array_values() de php, dicha función recibe por parámetro un array, retorna el array con las key reseteadas.

array_values ( array $array ) : array

Consultar los posts de wordpress desde un fichero externo

En este ejemplo vamos a realizar una consulta a la base de datos de wordpress utilizando $wpdb desde un fichero externo php (fuera de la estructura de wordpress)

WordPress $wpdb nos proporciona un objeto global para realizar las consultas a la base de datos, dicho objeto es una instancia de /wp-includes/wp-db.php.

Empécemos con el ejemplo:

Creamos un fichero php, yo le llamare exportacion.php y pegamos el siguiente código:

<?php
require './wp-load.php';
global $wpdb;

$prefix = $wpdb->prefix;
$table = $prefix . "posts";

$posts = $wpdb->get_results("SELECT * FROM $table");

print_r($posts);

Detallo, mi ejemplo esta creado en la raiz de ficheros:

require './wp-load.php';

Con este require añadimos toda la infraestructura de wordpress.

global $wpdb;

Invocamos a la variable global $wpdb (es el objeto que se va a encargar de realizar la consulta)

$prefix = $wpdb->prefix;

El atributo prefix nos devuelve el prefijo de las tablas (wp_), esto es necesario si has cambiado el prefijo de las tablas (yo lo suelo hacer).

$table = $prefix . "posts";

Prepara una variable con el nombre de la tabla que voy a realizar la consulta.

$posts = $wpdb->get_results("SELECT * FROM $table");

$wpdb->get_results realiza la consulta a la base de datos y me añade los registro a la variable $posts.

Ya podríamos recorrer la variable $posts y obtener los post.