9
votes

Quelle est la bonne façon de convertir IP en Integer en PHP?

Donc, j'ai besoin de stocker des adresses IP dans la base de données, mais les stockez comme des piqûres n'est pas très efficace et pas très pratique à mon objectif.

Alors ... comment puis-je convertir la propriété intellectuelle en entier dans PHP avec moins de traitement que possible, car il sera fait des millions de fois par jour.

Et bien sûr, comment puis-je convertir de l'intet à IP?

Je sais que cela peut être googlé et il y a des solutions simples - mais je demande le mode le plus rapide , pas seulement pour "faire x et vous obtenez Y", car c'est une tâche assez facile.


7 commentaires

Pourquoi n'essayez-vous pas certaines solutions et les repasser?


Les chances que vous ne trouverez pas quelque chose de plus rapidement que l'intégré ip2long () fonction. (Aussi: pourquoi importerait-il?)


Felix Kling, eh bien, un benchmarking correct n'est pas si facile à configurer. Surtout avec une telle tâche.


Un flotteur suffira-t-il? Alternativley, êtes-vous heureux de stocker chaque partie de l'adresse IP dans une colonne séparée? Sinon, il n'y a aucun moyen d'avoir un int avec des «sections» différentes


Croyez-vous que ip2long est une méthode rapide, bien qu'il s'agisse de l'un des meilleurs hits de Google? La prochaine fois, essayez d'abord Google.


Mario, eh bien ... Peut-être que ce serait mieux à faire en binaire ou dans une autre façon, je ne sais pas ... et j'ai besoin de cela pour une statistique pour un site très populaire.


Je suppose que vous ne prévoyez pas de soutenir IPv6 ?


4 Réponses :


24
votes

Utilisez ip2long () et LONG2IP () . Ils sont les plus rapides que vous pouvez trouver en PHP, car ils ne sont que construits sur les fonctions C correspondantes.


11 commentaires

C'est l'une des solutions Google Easy, êtes-vous sûr que c'est le plus rapide? ;) (je rigole)


Oui. Si vous voulez l'avoir encore plus rapide, vous pouvez sauver l'IPS comme prévu;)


Veillez à ce que php_int_max n'est pas configuré sur votre système pour faire casser cette fonction! ;)


@lurler vient d'exécuter vos propres repères, pas dure avec un code simple sur le net (essayez une recherche Google). Aussi, c est toujours plus rapide que php car il n'a pas besoin d'être interprété


@Lurler: Vous ne pouvez pas croire que vous demandez cela. Vous n'avez pas de sens quelle est la fonction réellement. Lisez le code source avant de commencer, même de référence.


@Lurler: Avant de pouvoir trouver un code de référence, vous devez d'abord avoir du code. Écrivez le code, utilisez la fonction, voir si vous avez des problèmes de performance. Si vous n'en avez pas, vous allez bien. Si vous faites, courez une référence, trouvez le goulot d'étranglement. L'optimisation prématurée est la racine de tout mal.


@Felix Kling, lorsque vous allez payer quelques centaines de centaines d'une centaine d'options pour le traitement de la puissance d'hébergement, vous comprendrez :) Donc, j'ai demandé à cela dans l'espoir que PPL pourrait fournir une bonne réponse, mais il semble qu'ils pensent que je suis noob et que je suis en train de penser que je suis noob et que je commençais à être trolling et moins 'Ing :(


@Lurler: Si un ou deux cycles de CPU par appel de la fonction vous coûtent "cent bux", que vous n'êtes probablement pas au mauvais hébergement. Comme je l'ai mentionné: ip2long () est construit directement sur la fonction C avec le même nom, qui est lui-même compilé dans un code binaire cool optimisé pour votre plate-forme. Si vous trouvez une manière, comment une fonction peut devenir plus rapide que cela, dites-moi;) et BTW: le dB que vous avez mentionné sera muuuch plus lent que toute fonction arithmétique . Ne perdez pas votre temps en pensant à une micro optimisation.


@Lurler: Votre question est entièrement basée sur des conjectures sur la performance. Si c'était une préoccupation grave de la vôtre, vous l'auriez aspiré. (Ne pas dire ce que vous avez essayé est aussi jolie.)


@KingCrunch, je pense que vous avez raison après ... Merci pour votre esprit :))))


Cette réponse est devenue assez ancienne; Quand il a été fait, IPv6 n'était pas largement utilisé. Maintenant, c'est et son utilisation augmente. Les adresses IPv6 ne peuvent pas être converties en entiers de taille typique car elles contiennent trop d'informations. Calling ip2long sur une adresse IPv6 le fera de retourner false . Gardez cela à l'esprit lorsque vous concevez votre code: IP2Long fonctionne toujours bien sur les adresses IPv4 mais échoue sur IPv6.



1
votes

Utilisez ip2long - cette fonction est Si vite, cela n'a tout simplement pas d'importance si vous l'appelez un million de fois par jour. Il s'agit d'une fonction de bibliothèque, elle est donc bien testée et fiable.

Et, compte tenu de votre temps de travail, c'est certainement la solution la plus rapide dans l'univers entier.


1 commentaires

Que signifie "rapide" dans ce contexte? Est-ce qu'il exécute dans 1 milliseconde? 1 microseconde? 1 nanoseconde?



1
votes

Vous pouvez utiliser un int

$ IP = ip2long ($ IP); code> p>

pour enregistrer dans mysql: p> xxx pré >

Vous pouvez récupérer l'IP ultérieurement: P>

SELECT INET_NTOA(ip) FROM 'user' WHERE 1


0 commentaires

0
votes

D'autres personnes vous ont correctement signalé sur la fonction ip2long () . Cependant, la question et les réponses ont maintenant environ 10 ans. À l'époque, IPv6 n'a pas été largement utilisé, mais de nos jours, c'est et son utilisation augmente.

Si vous avez passé une adresse IPv6, ip2long retournera false , qui, selon la logique de votre code, peut obtenir la touche à 0, ce qui correspond à l'adresse IP. 0.0.0.0.

En théorie, vous pouvez convertir les adresses IPv6 aux entiers de 128 bits. Malheureusement, sur des systèmes de 64 bits, les entiers de 128 bits sont un peu difficiles à travailler. La question suivante peut être utile:

PHP Convertir IPv6 en numéro

Quant à les stocker dans une base de données, la question suivante l'adresse pour MySQL:

stocker les adresses IPv6 dans MySQL

Sur la base de ce que je vois dans ces réponses et d'autres personnes à des questions similaires, je ne suis pas sûr que s'il y a un consensus autour d'une meilleure méthode pour ceux-ci, la façon dont IP2Long / Long2IP pour les adresses IPv4.


0 commentaires