Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: preg_match lub coś podobnego.
Forum PHP.pl > Forum > PHP
UNK
Witam, mam pewien problem natury szybkości działania tongue.gif

Chodzi bowiem o to, iż posiadam na dysku pewien plik o wielkości ~234k i ilości ważnych dla mnie linii/wszystkich 9566/9572.
W linuksie jest komenda cat (wyświetlająca zawartość pliku ) oraz grep ( wyświetlająca linie z wybranym wzorcem ) całość zajmuje maksymalnie 0.02 s ( wykonane przez exec() ) gdy załadowanie pliku do zmiennej tablicowej zajmuje skryptowi ~1.5 s + skrypt porównujący ciąg znaków 0.5-1.0 s więc całość wydłuża się do maksymalnie 2.5-3 s w zależności od obciążenia w danym momencie.

Zawartość pliku to nic innego jak zapis 6 znaków a następnie nazwy firmy, przykładowo:
000000 Xerox
00026A Cocess Telecom Co.
000FCA A-jin Techline CO

Dla niewtajemniczonych pierwsze 6 znaków jest to początek adresu MAC karty sieciowej ( bez odstępów typu - lub : ), i nazwa firmy która ją wyprodukowała.

Oczywiście nasuwa się od razu myśl dlaczego nie zostanę przy wykonaniu polecania przez exec(); chciałbym aby skrypt działał w pełni w PHP, ale też żeby działał szybko tongue.gif
Dlatego pytanie, czy może aby jest coś podobnego w PHP czego jeszcze nie znam, ale nie znam takiej zasady działania funkcji, umożliwiająca szybkie pobranie danych z pliku i porównanie z czymś zawartym w bazie danych.

Z góry dziękuję i przepraszam, jeśli powtórzyłem temat, ale nie znalazłem nic podobnego do tego winksmiley.jpg


I dla ciekawskich, może nie najlepsze rozwiązanie skryptu, ale nie chciało mi się nad tym długo myśleć winksmiley.jpg

  1. <?php
  2. $fn = '/usr/share/nmap/nmap-mac-prefixes';
  3. $f = fopen( $fn, "r" );
  4. $zp = fread( $f, filesize( $fn ) );
  5. $line = split( "\n", $zp );
  6.  
  7. foreach ( $line as $ki => $val )
  8. {
  9. if ( preg_match( '/'.substr( $_GET['mac'], 0, 8 ).'/si', substr( $val, 0, 2 ).":".substr( $val, 2, 2 ).":".substr( $val, 4, 2 ) ) )
  10. {
  11. $opism = substr( $val, 6, 255 );
  12. break;
  13. }
  14. }
  15. ?>


I to samo z wykorzystaniem systemu Linux :-)
  1. <?php
  2. $opism = exec( 'cat /usr/share/nmap/nmap-mac-prefixes |grep '.substr( $_GET['mac'], 0, 2 ).substr( $_GET['mac'], 3, 2 ).substr( $_GET['mac'], 6, 2 ) );
  3. ?>
nevt
wcale się nie dziwię, że to tyle trwa...

po pierwsze dlaczego nie ładujesz pliku od razu do tablicy poleceniem file() questionmark.gif?
po drugie po co używasz preg_match() questionmark.gif? tam wystarczy zwykłe porównanie stringów (to ci chyba zżera najwięcej czasu)...
po trzecie po co dodajesz dwukropki do adresów z pliku zamiast usunąć dwukropki z adresu MAC (duuuużo szybsze)....
jak skorygujesz, na pewno nie bedzie mielić przez kilka sekund...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.