Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM    Subskrybuj kanał ATOM dla tagu php Kanał ATOM (tag: php)

Autor wpisu: batman, dodany: 11.11.2010 16:00, tagi: php

Od dłuższego czasu obserwuję starania Microsoftu, mające na celu przekonanie do siebie programistów PHP. Co pewien czas pojawia się kolejne usprawnienie wprowadzające obsługę jakiejś usługi z poziomu PHP. Wystarczy wspomnieć o Windows Azure, czy API do Bing Maps. Z projektów niezwiązanych bezpośrednio z PHP można wymienić ASP.NET MVC, Web Platform Installer, czy WebMatrix. Każdy z nich na swój sposób jest ukłonem w stronę ogromnego rynku PHP. Ostatni z nich – Web Matrix, został wydany w wersji beta 3 i nie byłoby w tym nic nadzwyczajnego, gdyby nie fakt, że oferuje on obsługę PHP 5.3.3 oraz PEAR.

A co to takiego ten WebMatrix?

WebMatrix jest projektem, którego zadaniem jest maksymalne uproszczenie tworzenia aplikacji. Oferuje on serwer, bazę danych oraz szablony najpopularniejszych funkcjonalności dostępnych na stronach internetowych. Oczywiście mamy również możliwość zainstalowania aplikacji bazującej na gotowym rozwiązaniu (Wordpress, Drupal, SugarCRM, Joomla! itp).

Z poziomu WebMatrix mamy możliwość zarządzania bazami danych, z których korzysta nasz projekt oraz wygenerować raport, w którym znajdziemy informacje na temat uszkodzonych linków, brakujących znaczników meta oraz innych istotnych dla SEO informacji. Możemy również otworzyć projekt w Visual Studio i w nim kontynuować pracę.

Po co mi Web Platform Installer?

Web Platform Installer jest narzędziem pomagającym w instalacji niezbędnych narzędzi, m.in. WebMatrixa. Dzięki niemu w kilka chwil skonfigurujemy IIS, zainstalujemy darmową wersję Visual Studio (Visual Web Developer 2010 Express) oraz liczne dodatki, np. ASP.NET MVC. Jest to spora oszczędność czasu, ponieważ nie musimy szukać w sieci linków do pobrania i mamy pewność, że zainstalowane oprogramowanie pochodzi z zaufanego źródła. Jeśli WebMatrix nie przydanie nam do gustu, zawsze można zrezygnować z jego instalacji i dostępne aplikacje (Wordpress, Joomla!, itd) instalować bezpośrednio z poziomu Web Platform Installera.

To musi być “zuo” albo czarna magia

Jeśli zastanawiacie się gdzie jest haczyk, możecie przestać. Nie ma żadnego haczyka. Microsoft zdał sobie sprawę, że bez społeczności daleko nie zajedzie i dlatego coraz więcej projektów jest darmowych (lub posiada darmowe wersje). Ukłon w stronę środowiska PHP jest najlepszym posunięciem, jakie Microsoft może zrobić, ponieważ środowisko to, mino, że bardzo rozdrobnione, jest największe. Nie można wykluczyć, że MS stosuje taktykę dilera – na początek dostajemy coś za darmo, a za każdą kolejną dawkę trzeba płacić. Jednak skoro Visual Studio od tylu lat jest wydawany w wersji Express i do tej pory nie pojawiły się żadne przesłanki, że to się zmieni, można założyć, iż nie mamy do czynienia z dilerem ;)

Garść linków

Autor wpisu: batman, dodany: 10.11.2010 09:21, tagi: php

Framework PHP, który stworzyłem dla platformy PFA (PHP for Android) doczekał się swojej strony. Pod adresem blog.pfaframework.com znajduje się blog, w którym będę zamieszczał informacje o nowych wersjach, tutoriale, przykłady, FAQ, itp.

Projekt ten będzie o tyle ciekawy, że oprócz prowadzenia projektu, będę mógł podszkolić angielski, w którym robię wszystko, poza pisaniem. Informacje o PFAf będę zamieszczał również na blogu Hello World! (w języku polskim). Trzymajcie kciuki za powodzenie projektu ;)

Autor wpisu: Daniel Burchardtt, dodany: 09.11.2010 21:19, tagi: php

Pracując nad dzisiejszym projektem doszedłem do momentu w którym potrzebowałem wyświetlić datę w formacie

wtorek 9.11.2010

PHP oferuje szereg funkcji do operowania na datach jednak wybór padł na najprostszą i najpopularniejszą funkcję date().

Date

Funkcja date() zwraca datę zgodną z podanym formatem oraz znacznikiem czasu (domyślnie time()). Przyjmuje ona dwa parametry:

  • format – Format wyświetlania daty
  • timestamp – Opcjonalny parametr. Unix-owy znacznik czasu. Brak parametru oznacza domyślną wartość time()

Listę dostępnych opcji formatowania można znaleźć można w dokumentacji php.

Do naszych potrzeb użyjemy formatu D j.m.Y

<?php
echo date('D j.m.Y');
?>

Wynikiem działania powyższego skryptu jest

Tue 9.11.2010

Problemem pozostało w jaki sposób zmusić php do wyświetlania polskich nazw dni i miesięcy? Według dokumentacji wystarczy zastosowanie funkcji setlocale().

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: Zyx, dodany: 08.11.2010 10:43, tagi: php

Kilka dni temu na zagranicznym forum DevNetwork poświęconym programowaniu w PHP pojawił się temat zatytułowany phpDoc jako duplikacja kodu z pytaniem "czy także uważacie, że komentarze phpDoc to bezsens, a jeśli nie, do czego się właściwie przydają?" Może to niektórych zdziwić, ale powstała mała burza, i to nie przeciwko autorowi, ale właśnie w jego poparciu. Dlatego postanowiłem przyjrzeć się nieco bliżej kwestii dokumentacji tym bardziej, że jakiś czas temu sam zostałem - co tu dużo mówić - zjechany za nieużywanie phpDoc-ów.

Autor wpisu: batman, dodany: 08.11.2010 08:00, tagi: php

Po zapoznaniu się z teorią chmur, nadeszła pora na zajęcia praktyczne. Na pierwszy ogień idą mechanizmy przechowywania danych, a dokładniej bloby.

Co to jest blob?

Blob (binary large object), jest dowolnym zestawem bitów (danych binarnych). W postaci bloba można przechowywać w Windows Azure dowolne pliki, takie jak zdjęcia, muzyka, wideo, archiwa zip, dokumenty tekstowe, itp.

Odrobina teorii

Mimo, iż napisałem, że przejdziemy do zajęć praktycznych, będę musiał jeszcze przez chwilę ponudzić.

Dane przechowywane w postaci bloba, umieszczane są w kontenerach. Kontener można porównać do katalogu na dysku, w którym znajdują się pliki (bloby). W przeciwieństwie do katalogów, kontenerów nie można zagnieżdżać. Rozwiązaniem tego problemu jest umożliwienie stosowania ukośnika (/) w nazwie bloba, co symuluje drzewo katalogów.

Do każdego kontenera oraz bloba można dołączyć metadane o maksymalnym rozmiarze 8kB w postaci klucz,wartość.

W przypadku Windows Azure bloby dzielą się na dwa rodzaje: block blobs oraz page blobs. Pierwszy rodzaj blobów podczas uploadowania do chmury dzielony jest na mniejsze elementy (bloki). Dzięki temu można równolegle uploadować wiele bloków na raz, co znacznie przyspieszy cały proces. Drugi rodzaj blobów umożliwia skorzystanie z czegoś, co nazywa się XDrive. Jest to wirtualny dysk, który umożliwia pracę z blobem tak, jakbyśmy pracowali z najzwyklejszym systemem plików.

Ostatnim tematem o jakim należy wiedzieć, jest bezpieczeństwo danych przechowywanych jako bloby. Jak już wspomniałem, bloby przechowywane są w kontenerach. Mogą one być prywatne lub publiczne. Bloby dziedziczą uprawnienia po kontenerach, w których się znajdują. Na szczęście mamy możliwość skorzystania z Shared Access Signatures. Dzięki SAS mamy wpływ na znacznie więcej parametrów, niż publiczny-prywatny. Przy jego pomocy możną określić, czy dostęp do danego bloba (lub kontenera) jest na zasadzie tylko odczyt, czy np odczyt-zapis.

Czas na praktykę

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: Daniel Burchardtt, dodany: 08.11.2010 00:50, tagi: php

cURL biblioteka umożliwiająca wysyłanie zapytań http w tym pobieranie z serwerów stron i plików, a także wysyłanie treści formularzy oraz porozumiewanie się za pomocą najbardziej popularnych protokołów sieciowych, takich jak HTTP, FTP, TFTP, TELNET, DICT, FILE i LDAP.

W czasie tworzenia niektórych aplikacji w języku PHP występuje potrzeba szybkiego wysłania różnego rodzaju żądań przy użyciu protokołu http. W poniższym artykule postaram się przedstawić podstawy obsługi funkcji curl_multi_* dzięki którym jesteśmy w stanie zrealizować założony cel.

<?php

$pages = array('http://www.onet.pl','http://www.wp.pl', 'http://www.google.pl');
$ch = array();
$results = array();

$mh = curl_multi_init();

for($i=0;$i<count($pages);$i++) {

$ch[$i] = curl_init();
curl_setopt($ch[$i], CURLOPT_URL, $pages[$i]);
curl_setopt($ch[$i], CURLOPT_HEADER, 0);

curl_multi_add_handle($mh,$ch[$i]);

}

do {
 $result = curl_multi_exec($mh, $active);
 } while ($result == CURLM_CALL_MULTI_PERFORM);

 do {
 if (curl_multi_select($mh) != -1) {
 do {
 $result = curl_multi_exec($mh, $active);
 } while ($result == CURLM_CALL_MULTI_PERFORM);
 }
 } while ($active && $result == CURLM_OK);

for($i=0;$i<count($pages);$i++) {

$results[$i]['info'] = curl_getinfo($ch[$i]);
$results[$i]['content'] = curl_multi_getcontent($ch[$i]);

curl_multi_remove_handle($mh, $ch[$i]);

}

curl_multi_close($mh);

?>

Na samym początku skryptu deklarujemy zmienne których będziemy używali w trakcie jego działania.

$pages = array('http://www.onet.pl','http://www.wp.pl', 'http://www.google.pl');
$ch = array();
$results = array();

Inicjacja multi cURL i przypisanie do zmiennej o nazwie mh.

$mh = curl_multi_init();

Następnie w pętli inicjujemy poszczególne uchwyty przy pomocy funkcji curl_init() i dodajemy do głównego żądania za pomocą funkcji curl_multi_add_handle. Odnośnie parametrów dodanych za pomocą funkcji curl_setopt zapraszam do zapoznania się z dokumentacją funkcji cURL.


for($i=0;$i<count($pages);$i++) {

$ch[$i] = curl_init();
curl_setopt($ch[$i], CURLOPT_URL, $pages[$i]);
curl_setopt($ch[$i], CURLOPT_HEADER, 0);

curl_multi_add_handle($mh,$ch[$i]);

}

Dochodzimy do sedna sprawy która może stać się problematyczna. W jaki sposób wykonywać poszczególne żądania tak aby nie blokowały się wzajemnie, służy nam do tego dość zawiły kod.

do {
 $result = curl_multi_exec($mh, $active);
 } while ($result == CURLM_CALL_MULTI_PERFORM);

 do {
 if (curl_multi_select($mh) != -1) {
 do {
 $result = curl_multi_exec($mh, $active);
 } while ($result == CURLM_CALL_MULTI_PERFORM);
 }
 } while ($active && $result == CURLM_OK);

Po wykonaniu powyższego fragmentu przystępujemy do pobrania informacji o wykonanych żądaniach używając do tego funkcji curl_getinfo i curl_multi_getcontent oraz usunięciu uchwytów curl_multi_remove_handle.

for($i=0;$i<count($pages);$i++) {

$results[$i]['info'] = curl_getinfo($ch[$i]);
$results[$i]['content'] = curl_multi_getcontent($ch[$i]);

curl_multi_remove_handle($mh, $ch[$i]);

}

Na koniec zamykamy główne żadanie

curl_multi_close($mh);

W tym artykule to już wszystko. Zapraszam do komentowania i zadawania pytań.

Autor wpisu: Śpiechu, dodany: 06.11.2010 19:44, tagi: php

Ostatnio gdzie nie zajrzę, pojawia się tajemnicze hasło testy jednostkowe, unit tests lub co gorsza Test-driven development. Od kilku dni bawię się testami automatycznymi i śmiało mogę powiedzieć, że mają sens, a co więcej, wprowadzają dużo więcej zabawy do programowania.

Na czym to ustrojstwo polega? W chwili pisania kodu, w osobnym pliku równocześnie piszemy do niego testy. Pisząc w TDD zaleca się najpierw napisanie testu, a dopiero potem kod, który spełnia dany test! Fajne, co? Testy pilnują żeby podczas rozbudowy/refaktoryzacji kodu całość działała.

Im trudniej spełnić test, tym lepiej. Kluczowe jest przewidzenie reakcji kodu na wartości graniczne oraz momenty, kiedy coś się popsuje. Jeżeli kiedykolwiek musimy użyć var_dump(), to od razu powinna nam się zapalić lampka w głowie, że można napisać test.

Jak w ogóle się za to zabrać? Potrzebujemy aplikacji testującej o nazwie PHPUnit. Na stronie jest również fajna dokumentacja (co prawda po angielsku, ale napisana bardzo prostym językiem). W Ubuntu można łatwo sobie doinstalować program poprzez Synaptic (trochę starszą wersję, ale to nic).

Druga sprawa, której potrzebujemy to kod do testowania. Na szybko napisałem sobie prostą klasę szyfrującą ciasteczka za pomocą wybranego algorytmu, trybu i hasła. Nie wiem czy użytkownikom spodobałoby się trzymanie u siebie czegoś, do czego nie mają dostępu, ale cóż… potrzebowałem materiału do testów. Jest tego kilkadziesiąt linijek, dlatego wkleiłem do Pastebin.

Jak kogoś interesuje, to używa się tego dosyć prosto: tworzymy obiekt, wybieramy jeden z algorytmów modułu mcrypt (który wcześniej musimy mieć zainstalowany!), tryb i hasło, a następnie za pomocą metody setEncryptedCookie() ustawiamy cookie. Mając ustawiony obiekt, getEncryptedCookie() wyciągnie nam cookie i rozszyfruje treść.

$cookieEncrypter = new SpiechuCookieEncrypter();
$cookieEncrypter->setAlgorithm('twofish')
        ->setMode('cbc')
        ->setPassword('jakies haslo')
        ->setEncryptedCookie('testowe_ciacho', 'testowa wartosc ciacha');
 
echo $cookieEncrypter->getEncryptedCookie('testowe_ciacho');

Jeżeli do kodowania używacie NetBeansa, to pod prawym przyciskiem nad nazwą pliku jest wygodna opcja, która stworzy nam „szkieletor” testów (Tools->Create PHPUnit tests).

Zasada jest taka, że klasa testująca musi rozszerzać klasę PHPUnit_Framework_TestCase. Ponadto przyjęło się, że nazwa kończy się słowem *Test, za to wszystkie metody testujące muszą zaczynać się od test*.

Testy operują na asercjach, czyli specjalnych metodach, których warunek musi zostać spełniony aby test powiódł się. I tak, dla przykładu assertEqual($wartosc1,$warosc2) zgłosi nam błąd, jeżeli obydwie wartości nie są takie same. Jest tego w hu hu, dlatego zainteresowanych skieruję do źródła.

Oprócz metod testCośTam mamy jeszcze dwie metody specjalnego przeznaczenia: setUp() i tearDown(). Pierwsza jest odpalana przed każdym testem, druga po teście. Polegają na przygotowaniu środowiska do testów i „posprzątanie” po teście. W moim przypadku setUp tworzy obiekt testowany i umieszcza w polu obiektu testującego, a tearDown jest puste, bo nie miałem np. otwartych plików, połączeń do bazy czy innych rzeczy, które trzeba by zamknąć.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.