Mar 19 2009

Chwała tablicom! Czyli o tym jak można przyspieszyć rzeczy :)

Tag: PHP, Programowanieradmen @ 08:50

Miałem za zadanie zrobić import jakiś danych o uzytkownikach z pliku tekstowego. Użytkowników w bazie już miałem (jakieś 50k rekordów), import miał za zadanie uzupełnić ich dane.

Parsowanie pliku było dość banalne. Poboierałem z niego dane (login i reszta danych), później pobierałem z bazy id usera (po loginie) i robiłem resztę rzeczy. Wszystko było super, aż do momentu odpalenia. Plik z danymi był spory, ale po pół godziny pracy import nadal się nie zakończył!

Zastanawiałem się jak to przyspieszyć. Przypomniała mi się rzecz, o której tyle razy przypominał Dooshek - użycie tablic. Na czym polega cały myk? Otóż na początku pobierałem wszystkie loginy i id userów i zapisywałem do tablicy w formacie [login] => [uid]. Podczas importu danych z pliku sprawdzałem id usera z tablicy przez co pół godzinny import wykonał się nagle w 30sek. :)

Warto o tym szczególe pamiętać. Ja już któryś raz z rzędu o tym zapomniałem, a szkoda. Straciłem trochę czasu na optymalizację mojego importu.

Przy zawrotnej liczbie rekordów pewnie nie będzie warto robić takiej tablicy (ponieważ zje zasoby :) ), ale przy jakiejś mniejszej liczbie myślę, że warto.


Mar 11 2009

phpQuery - zdzieranie strony po selektorach CSS

Tag: PHP, Programowanieradmen @ 12:52

Jakiś czas temu odkryłem bardzo ciekawą bibliotekę -
phpQuery. Czym ona jest ? Przedewszystkim jest to biblioteka pozwalająca na wyciąganie elementów HTMLa (po stronie PHP), za pomocą selektorów CSS.

Czy to się przydaje? Owszem, nawet bardzo. Przykładowych zastosowań jest wiele. My to wykorzystaliśmy przykładowo do “poprawiania” podczas zapisu embedowanych filmów z YT.  Problem polegał na tym, że w dokumencie xHTML 1.1 Transitional nie można używać elementów <embed/>. Firefox i Opera sobie z tym radziły, IE natomiast sypał się i krzyczał, że nie może załadować strony.

Jak trzeba było to rozwiązać ? Musieliśmy pobrać z elementu <embed> atrybuty type i src, a później przepisać je do elementu <object> i <param name=”movie”>. Normalnie to byłoby pewnie masa roboty. Jakiś preg_match, preg_replace i inne cuda. Jak my to rozwiązaliśmy? Całkiem łatwo:

Wydaje się proste, prawda? Zalet jest wiele, wypunktuję najważniejsze:

  • pobieranie elementów strony za pomocą selektorów CSS
  • manipulowanie tymi elementami (dodawanie klas, stylow)
  • pobieranie atrybutów wybranych elementów.
  • iteracja na wielu elementach
  • możliwość tworzenia nowych elementów, zastępowania starych oraz wyplucie tego wszystkiego jako HTML
  • można nawet stworzyć za jego pomocą całego HTMLa (coś na zasadzie new Element(’div’))

Jakie dalsze plusy?

  • łatwa obsługa - naprawdę w bardzo łatwy sposób można pobrać dowolny element, oraz modyfikować je. Wystarczy odrobinkę znać składnię jQuery, ale jest to bardzo intuicyjne
  • w szybki sposób można “naprawiać” stronę (chociażby problemy z embedowanymi filmami YT)
  • szybko możemy modyfikować dane, bez używania skomplikowanych regexpów/etc
  • możemy parsować nie tylko HTMLa, praktycznie każdy XML przejdzie

Możliwości tej biblioteki są naprawdę spore. Pamiętajmy jednak, że nie zawsze dobrze jest wystawiać armatę przeciw komarowi. Ze względu na swój rozmiar może się okazać, że lepiej będzie użyć jakiś natywnych klas, które szybciej sobie poradzą z naszym problemem.