Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> preg_match lub coś podobnego.
UNK
post
Post #1





Grupa: Zarejestrowani
Postów: 93
Pomógł: 5
Dołączył: 30.04.2006
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


Witam, mam pewien problem natury szybkości działania (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)


I dla ciekawskich, może nie najlepsze rozwiązanie skryptu, ale nie chciało mi się nad tym długo myśleć (IMG:http://forum.php.pl/style_emoticons/default/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. ?>
Go to the top of the page
+Quote Post
nevt
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


wcale się nie dziwię, że to tyle trwa...

po pierwsze dlaczego nie ładujesz pliku od razu do tablicy poleceniem file() (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ?
po drugie po co używasz preg_match() (IMG:http://forum.php.pl/style_emoticons/default/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...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 13:58