web-dev-qa-db-fra.com

Utilisation de JDatabase autonome, c'est-à-dire. sans amorçage d'application Joomla

Peut-on instancier un objet jdatabase sans l’application Joomla? Le cas d'utilisation évident est lorsque vous souhaitez ouvrir un point de terminaison direct dans un code autonome de votre site pour une api ou un cron, etc. b) en réécrivant les requêtes que partagent votre application Joomla et votre point de terminaison api.

Je vois qu'il existe cette approche consistant à extraire et à secouer le code:

http://www.solutionsamir.com/20110720155/Programming/PHP/Stand-Alone-Joomla-Database-Abstraction-Class.html

mais j'espère que quelqu'un a tenté ce que je tente avant de commencer à fouiller dans la bibliothèque.

2
jamesgarrett

Sans que le fichier bootstrap soit disponible), j'ai chargé le framework sans l'application pour vérifier les performances de cette manière dans un dossier appelé app.

$time_start = microtime(1);

define('_JEXEC', 1);

$base = str_replace("/app", "", __DIR__);

define('JPATH_BASE', $base);

require_once JPATH_BASE . '/includes/defines.php';
require_once JPATH_BASE . '/includes/framework.php';

$db = JFactory::getDBO();
$query = $db->getQuery(true)
    ->select('*')
    ->from($db->qn('#__users'));
$db->setQuery($query);

$users = $db->loadObjectList();

echo "<pre>" . print_r($users,1) . "</pre>";
echo microtime(1) - $time_start;
die();

Et puis mis

$time_start = microtime(1);

en haut du fichier index.php de Joomla, puis en exécutant le script suivant dans le fichier d'entrée d'un composant factice avec un élément de menu acheminant vers une vue du composant:

defined('_JEXEC') or die;

global $time_start;

$db = JFactory::getDBO();
$query = $db->getQuery(true)
    ->select('*')
    ->from($db->qn('#__users'));
$db->setQuery($query);

$users = $db->loadObjectList();

echo "<pre>" . print_r($users,1) . "</pre>";
echo microtime(1) - $time_start;
die();

Résultats de performance

sans application Joomla

  • 0.034259080886841
  • 0.03374195098877
  • 0.034512996673584
  • 0.034684181213379

avec application Joomla> routeur> menu + composant

  • 0.24458599090576
  • 0.29617881774902
  • 0.29315781593323
  • 0.3031439781189

Je pense que cela représente probablement un gain de performance suffisant pour que je cesse de chercher une approche plus rapide et que disposer de l'ensemble de la plate-forme sera probablement utile de toute façon. Mais si quelqu'un a une autre façon de réduire les possibilités de servir des points de terminaison d'api personnalisés en utilisant des bits du cms, je serais intéressé à entendre.

1
jamesgarrett

Oui, c'est possible Vous devrez inclure le bootstrap.php qui exécutera l’autochargeur, vous permettant d’appeler le package framework Database namespaced.

Voici un exemple:

define('_JEXEC', 1);
define('JPATH_BASE', __DIR__);

require JPATH_BASE . '/includes/defines.php';
require JPATH_BASE . '/libraries/bootstrap.php';

// Make the database driver
$dbFactory = new Joomla\Database\DatabaseFactory;

$db = $dbFactory->getDriver(
    'mysqli', [
        'Host'     => 'localhost',
        'user'     => 'MY DATABASE USERNAME',
        'password' => 'MY DATABASE PASSWORD',
        'database' => 'MY DATABASE NAME',
        'prefix'   => 'xxx_'
    ]
);

$query = $db->getQuery(true)
    ->select('*')
    ->from($db->qn('#__users'));
$db->setQuery($query);

$users = $db->loadObjectList();

Cet exemple suppose que le fichier autonome PHP se trouve à la racine de votre site Joomla, il vous faudra donc peut-être modifier la ligne 2, en fonction de l'emplacement de votre fichier.

J'espère que cela t'aides

1
Lodder