La méthode Ruby Thread # [] =
vous permet de conserver une valeur unique pour chaque thread. (C'est comme ThreadLocal
en Java)
Si vous l'utilisez, le serveur d'application (presque tous les serveurs AP tels que Passenger) associé à 1 thread et 1 requête
Il peut être utilisé comme une variable locale de thread qui ne peut être fermée et utilisée que lors d'une seule requête.
Vous pouvez définir la variable locale du thread foo
en affectant Thread.current [: foo]
au thread actuel comme suit:
def self.foo
Thread.current[:foo] ||= 0
end
Il existe également un joyau appelé RecordWithOperator qui fournit au framework Ruby on Rails la possibilité d'enregistrer des opérateurs d'enregistrement (créateurs, mises à jour, suppresseurs).
Il est implémenté en utilisant ce Thread # [] =
.
https://github.com/nay/record_with_operator/blob/4389d077b0303b956cc211ef439a46a216ae2cc0/lib/record_with_operator/operator.rb#L4
Si vous utilisez un serveur d'applications tel que Passenger ou Puma qui réutilise les threads une fois créés Puisque la variable locale de thread est associée au thread qui est censé être réutilisé, elle doit être explicitement détruite côté application. Veuillez noter que les variables définies dans la requête précédente (thread) peuvent être référencées dans une autre requête.
Redmine avait également auparavant du code pour gérer l'utilisateur actuel en utilisant Thread # [] =
Il y a eu un cas de bogue de sécurité dans lequel le nom d'un autre utilisateur était affiché dans le message d'erreur.
http://www.redmine.org/issues/16685
Cela peut être évité en supprimant explicitement la valeur Thread.current du côté de l'application.
Si vous utilisez un gem appelé RequestStore, vous pouvez utiliser la couche Rack :: Middleware pour chaque requête.
Il va maintenant effacer la valeur de Thread.current
.
Un exemple d'utilisation est le suivant:
def self.foo
RequestStore.store[:foo] ||= 0
end
Recommended Posts