Question

Le scénario

Je construis une application Web où les rapports peuvent être générés à la volée (basé sur des informations récupérées à partir d'une base de données SQL). Ces rapports contiendront des graphiques, qui peuvent également être générés à la volée. Étant donné que ces graphiques contiennent des informations sensibles, à l'aide d'une API de carte 3ème partie (c.-à-d.: Google Graphes) est hors de question.

Le problème

J'utilise l'extension GD de PHP pour générer ces graphiques. C'est assez lent. La mise en cache est la voie à suivre, mais le problème est qu'il y a un grand nombre de tableaux possibles; Bien que je pense que la majorité des graphiques demandés seront des celles qui ont été générées auparavant.

Solution partielle

Les graphiques sont générés avec des données et d'autres informations (taille, type de graphique, etc.). Parce que ceux-ci peuvent identifier de manière unique un graphique, je donne à chaque graphique un hash unique en fonction de ces informations et de l'enregistrer. Maintenant, je peux calculer le hash pour un tableau nouvellement demandé et voir si je l'ai déjà rendu.

Le problème avec ceci est l'événement d'une collision. Pour contourner cela, je pense à sauver le hash et à une forme sérialisée des données dans une table SQL. Ensuite, si j'ai un cache frappé, je vais toujours comparer les données elles-mêmes.

Je suis sur-ingénierie de cela? (C'est un hachage de 160 bits - SHA1)
Y a-t-il un meilleur moyen de gérer cela?

Était-ce utile?

La solution

J'utilise l'extension GD de PHP pour générer ces graphiques. C'est assez lent.

Je soupçonne que ce n'est pas GD qui est le bit lent. Le candidat le plus probable est le traitement de la collecte des données (à partir d'une base de données?). Dans ce cas, vous pouvez obtenir des avantages significatifs d'optimiser le schéma de base de données / et / ou à l'aide de données pré-consolidées.

Bien que vous puissiez également envisager de mettre en cache la sortie de la requête, mais à moins que vous n'utilisez les mêmes données ailleurs, il est probablement plus simple de mettre en cache les images graphique.

Le problème avec ceci est l'événement d'une collision.

Optimisation prématurée - ça ne va pas arriver. Mais si vous devez vraiment, diviser les méta-données que vous utilisez pour générer le graphique et le stocker dans un fichier séparé (à nouveau indexé via le même hachage) - puis comparez-le au moment de l'exécution. Si vous parvenez à obtenir une collision, nous aurons un fouet et vous achèterons une boisson.

Je recommanderais de jeter un coup d'œil à JPGRAPH - qui est un excellent bit de logiciel et contient la mise en cache intégrée.

c.

Autres conseils

Très probablement si votre longueur de données hachée est inférieure à 160 bits, vous êtes en sécurité.Sinon, comme vous le dites, des collisions peuvent survenir et la comparaison des données sont nécessaires.

Jetez un coup d'œil à Chartdirecteur Nous l'utilisons au travail et il ne compte pas surLa bibliothèque GD devrait être plus rapide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top