web-dev-qa-db-fra.com

WordPress et multithreading

Je travaille sur un plugin. J'ai créé une API qui lit et écrit dans une table personnalisée de la base de données. Cette API peut être appelée potentiellement à partir de N clients simultanément (et cela se produit réellement). J'ai remarqué que dans ce cas des problèmes se posent. Pour donner un exemple spécifique:

if (is_null($wpdb->get_var("SELECT column FROM my_table_name WHERE condition"))) {
    // branch 1
}
else {
    // branch 2
}

Dans la branche 1, je présume innocemment que la variable obtenue à partir de la base de données est NULL, mais peut-être que ce n'est plus vrai parce qu'elle a été modifiée par un autre thread. J'ai besoin de la garantie que, du moins jusqu'à la fin de la branche 1, cette condition n'a pas changé.

Quelle est la méthode WordPress pour résoudre ce problème? Sémaphores, verrouillage de fichiers, MySQL LOCK TABLE? Ou il y a de meilleures solutions? J'ai cherché longtemps sur le Web, mais je n'ai rien trouvé de définitif. Comment WordPress lui-même fait-il (ou les plugins principaux) dans un cas comme celui-ci?

5
User

Votre plugin est-il destiné à être utilisé par d'autres personnes ou ne sera-t-il utilisé que sur des serveurs que vous contrôlez? Dans ce dernier cas, il y aurait peut-être plusieurs façons de réaliser ce que vous voulez. Par exemple, l’extension Sync . Avec cela, je pense que vous pourriez utiliser un mutex ou un sémaphore pour définir un indicateur, que vous pourriez ensuite utiliser dans vos fonctions de lecture/écriture.

Si vous disposez déjà de memcache, cela pourrait être un moyen léger de faire la même chose, sans avoir à installer une nouvelle extension.

À défaut, vous pourrez peut-être utiliser un verrou de table de base de données, mais cela semble vraiment difficile, et je craindrais pour l'impact sur les performances de la base de données.

1
Dougal Campbell