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

Autor wpisu: matiit, dodany: 16.07.2013 19:38, tagi: php

Debugowanie. Dziwny temat. Rzecz niby bardzo ważna i niesamowicie  pomocna. Ucząc się wielu języków naturalną rzeczą jest rozdział o debugerze. Mówię szczególnie o językach kompilowanych, np. C/C++. Całkowicie inaczej jest jeśli chodzi o naukę języków skryptowych (PHP, Ruby czy Pythona na przykład). Przeważnie pomija się wspominanie o debugowaniu, w końcu interpreter przeważnie rzuca celną informację o błędzie. Wiele tutoriali i książek pokazuje jednak pewną instynktowną formę debugowania kodu. Metodę „ślepych printów, var_dumpów itd. Tak zazwyczaj jest najłatwiej. Chciałem jednak dziś pokazać trochę ambitniejsze podejście do debugowania.

Cel

Na początek: Co tak właściwie chcielibyśmy uzyskać?

  • Zatrzymywanie naszego skryptu gdzie tylko chcemy
  • „Kroczenie” przez nasz skrypt linijka po linijce (wykonując go w tym czasie)
  • Podglądanie jak się zmieniają zmienne
  • Ewaluacja kodu w dowolnym momencie działania skryptu

Dla programisty C++ czy Javy powyższe punkty są pewnie niczym takim – przecież taki programista używa ich w tramwaju kodując ze smartphona. Co innego początkujący pythonowcy czy PHP’owcy. Oni przeważnie czegoś takiego jeszcze nie uświadczyli – a przecież to takie piękne. A więc…

Jak uzyskać taki efekt w PHP?

Xdebug – nie jest to oczywiście jedyna opcja, ale to z tym rozwiązaniem mam najwięcej doświadczenia, więc xdebuga właśnie chciałem przedstawić.

Pokażę instalację na ubuntu (z przyzwyczajenia z kursu Laravel, na który oczywiście serdecznie zapraszam – http://blog.matiit.pl/category/kurs-laravel/).

Na początku musimy wyposażyć nasze PHP w xdebuga:

sudo apt-get install php5-xdebug

Oraz oczywiście włączyć je w konfiguracji php, w ubuntu jest to plik:

/etc/php5/apache2/conf.d/20-xdebug.ini

 

xdebug.remote_enable=1
xdebug.remote_port="9000"
xdebug.profiler_enable=1

Taka konfiguracja w zupełności wystarczy, szczególnie musimy zapamiętać numer ustawionego portu. Przetestujmy teraz czy xdebug jest aktywny.

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

Autor wpisu: matiit, dodany: 13.07.2013 15:21, tagi: php

Wszystkie wpisy z serii:

W dzisiejszej części przedstawię Ci jak skonfigurować połączenie z bazą danych, jak stworzyć i wykonać migracje. O tym jak w Laravel są obsługiwane relacje między tabelami i kilka innych rzeczy będzie następnym razem.

Co mamy do wyboru

Tak na prawdę moglibyśmy użyć dowolnej bazy danych jaka jest obsługiwana przez PHP. Do niektórych jednak Laravel oferuje nam ogromne wsparcie. Możemy wybierać spośród min. PostgreSQL, MySQL, sqlite3 i pewnie jeszcze z jakiejś o jakiej zapomniałem. Dziś skupimy się na sqlite. Sqlite praktycznie nie wymaga żadnej konfiguracji, a mimo to oferuje na prawdę spore możliwości (nie porównujemy jej jako konkurenta MySQL, tym bardziej PostgreSQl, ale jak na tak mały silnik i prostotę użycia – możliwości są spore).

Skonfigurowanie sqlite3

Odpalmy do edycji plik app/config/database.php. Znajdzmy linijkę

'default' => 'mysql',

i zmień ją na

'default' => 'sqlite',

I to tyle konfiguracji, na prawdę.

Teraz zajmiemy się…

Migracjami

Co to są migracje? Już spieszę z odpowiedzią. Migracje są to pliki z opisem zmian w strukturze bazy danych. Nie oszukujmy się, nigdy za pierwszym razem nie stworzymy pełnej, dobrej, ostatecznej struktury naszej bazy danych. Dzięki migracjom – jeśli czegoś zapomnieliśmy – po prostu dopisujemy kolejną migrację. Migracje możemy wykonywać (po kolei wg daty powstania migracji). Możemy cofać ostatnią, cofnąć wszystkie. Możemy tak na prawdę robić dużo rzeczy z nimi :)

Jakaś tabela

Wymyślmy sobie jakiś przypadek tabeli, może dwóch, jednak jednej, będzie przejrzyściej. Jaki obiekt chcemy rzeczywisty chcemy opisać? Samochód! Stwórzmy tabelę przechowującą samochody. Na razie niezbyt skomplikowaną oraz jak ktoś bardziej oczytany to stwierdzi, że tabela jest też nie znormalizowana, no ale cóż – się poprawi (albo nie).

Wybierzmy jakieś pola dla tej tabeli – zróbmy to maksymalnie prosto.

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

Autor wpisu: Łukasz Socha, dodany: 11.07.2013 18:03, tagi: php

Kopiowanie obiektów może się wydawać dla większości wręcz trywialne. Jednak, dla początkujących w programowaniu obiektowym może to nie być takie oczywiste.

O co chodzi?

Żeby lepiej zrozumieć problem przeanalizujmy przykład:

<?php

class Osoba {

    private $imie;

    function __construct($imie) {
        $this->imie = $imie;
    }
    public function setImie($imie) {
        $this->imie = $imie;
    }


    public function getImie() {
        return $this->imie;
    }

}

$osoba=new Osoba('Ania');
$osoba2 = $osoba;
echo $osoba->getImie()."\n"; // wyswietli "Ania"
echo $osoba2->getImie()."\n"; // wyswieli "Ania"
$osoba->setImie('Tomek');
echo $osoba->getImie()."\n"; // wyswietli "Tomek"
echo $osoba2->getImie()."\n"; // wyswieli "Tomek"

?>

Do 24 linii wszystko wydaje się oczywiste. Jednak, w ostatniej linii dostajemy „niespodziewany” wynik – zmiana imienia w obiekcie $osoba powoduje także zmianę w $osoba2. Dlaczego tak się dzieje? W linii 22 tak naprawdę nie robimy kopii obiektu jak to się dzieje w typach prostych (liczby, stringi itp.), tylko tworzymy nową referencję (odnośnik na odpowiedni adres pamięci, więcej informacji na Wikipedii) do obiektu stworzonego za pomocą zmiennej $osoba. Jeżeli chcemy skopiować obiekt musimy użyć metody __clone().

<?php

class Osoba {

    private $imie;

    function __construct($imie) {
        $this->imie = $imie;
    }
    public function setImie($imie) {
        $this->imie = $imie;
    }


    public function getImie() {
        return $this->imie;
    }

}

$osoba=new Osoba('Ania');
$osoba2 = clone $osoba;
echo $osoba->getImie()."\n"; // wyswietli "Ania"
echo $osoba2->getImie()."\n"; // wyswieli "Ania"
$osoba->setImie('Tomek');
echo $osoba->getImie()."\n"; // wyswietli "Tomek"
echo $osoba2->getImie()."\n"; // wyswieli "Ania"

?>

Autor wpisu: matipl, dodany: 05.07.2013 13:13, tagi: php

php-logoJak zapewne wiecie nie lubię mówić oczywistych-oczywistości. Ale kolejny raz spotykam „admina”, który uznaje wyłącznie oprogramowanie z pakietów.

W ogólności to dobre podejście, uznaje się że oprogramowanie dystrybuowane przez system pakietów w Linuksie jest sprawdzone, stabilne i bezpieczne.

Niestety system wydawniczy pakietów nie zawsze nadąża za rzeczywistością, lub nie przystaje do naszych specyficznych warunków.

Tym bardziej dotyczy to PHP oraz nginx. PHP ze względu na swój plan wydawniczy oraz specyfikę samego projektu. W wydaniach dystrybucyjnych najczęściej wszelkie dodatkowe moduły (np. PDO) są instalowane jako zewn. moduły, co wpływa na wydajność całego silnika. Dlatego najlepiej używane przez nas moduły od razu skompilować w core, a dodatki które są standardowo włączane – wyłączyć. Natomiast nginx to mimo wszystko młody projekt, który dość prężnie się rozwija, ale zdarzają się również spore wpadki. W maju 2013 roku okazało się, że wersje nginx 1.1.4-1.2.8, 1.3.9-1.4.0 posiadają sporą lukę bezpieczeństwa.

Zatem do dzieła. Pierwsza kompilacja środowiska może Wam trochę zająć, ale już kolejne aktualizacje (wczoraj ukazała się wersja PHP 5.4.17) zajmują około 5-10 minut.

Najpierw musimy pamiętać, aby nasz system operacyjny posiadał odpowiednie biblioteki, które są potrzebne do kompilacji poszczególnych aplikacji. W naszym przykładzie jest to Debian 6.0. Instalacja wymaganych zależności:

apt-get install make gcc g++ libxml2-dev zlib1g-dev bzip2 libbz2-dev libcurl4-gnutls-dev libjpeg62-dev libpng12-dev libfreetype6-dev libmcrypt-dev libmysqlclient-dev lemon libtidy-dev libxslt1-dev libpcre++-dev libssl-dev automake autoconf

Następnie ściągamy źródła PHP – http://php.net/downloads.php. Poniższe parametry konfiguracyjne powinny działać dla PHP 5.3/5.4/5.5 bez problemu.

Po rozpakowaniu źródeł w ichniejszym katalogu tworzymy sobie skrypt compile_php o zawartości:

make distclean
./configure \
--enable-fpm \
--enable-cli \
--enable-inline-optimization \
--disable-rpath \
--disable-ipv6 \
--enable-mbstring \
--enable-mbregex \
--with-mysql \
--with-pdo-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-gettext \
--with-curl \
--with-zlib \
--with-zlib-dir=/usr \
--with-gd \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--with-freetype-dir \
--enable-gd-native-ttf \
--enable-exif \
--enable-shmop \
--with-xsl=shared \
--enable-soap=shared \
--enable-sockets \
--enable-pcntl=shared \
--with-mcrypt \
--with-bz2 \
--with-tidy \
--with-pcre-dir \
--with-pear
make -j2
make install

Pierwsza linijka wyczyści nam projekt z poprzednich kompilacji. Następne to konfiguracja i kompilacja php (z obsługą php-fpm, php-cli, PDO, MySQL, GD, JPEG/PNG, mbstring, Exif, PEAR oraz kilka innych modułów).

Polecam zakomentować 2 ostatnie linijki, aby móc sprawdzić czy configure przebiegł poprawnie. Po make install nasza instancja PHP znajdzie się w /usr/local/php.

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

Autor wpisu: Tomasz Kowalczyk, dodany: 03.07.2013 11:46, tagi: php, doctrine

Pracuję od jakiegoś czasu nad projektami, w których istotną część stanowią (autorskie) konsolowe narzędzia do zarządzania wewnętrznymi procesami aplikacji. Aktualizacja danych, wysyłka maili, itp. – każdej operacji odpowiada polecenie i odpowiedni zestaw argumentów, dzięki czemu zamiast pisania kodu w pocie … #LINK#

Autor wpisu: matipl, dodany: 25.06.2013 17:45, tagi: php

php-logoJeśli ktoś uważał, że język PHP nie rozwija się, wegetuje… Był w błędzie. Tylko 15 miesięcy zajęło developerom wydanie stabilnego następcy wersji PHP 5.4.

A zmian, nowości oraz ewolucji nie brakuje w wersji PHP 5.5.

Opcode cache wbudowane!

Po tylu latach używania różnych alternatyw (w moim wypadku APC – czy warto korzystać?) doczekaliśmy się w końcu wbudowanego Opcode cache. Dokładniej to Zend Optimizer+ został wbudowany w jądro PHP 5.5.0. Można powiedzieć, że dzięki temu zabiegowi PHP bardzo przyspieszyło – sporo osób nie wiedziało o Opcode cache, lub nie radziło sobie z jego instalacją. Prawdopodobnie dla zwykłego programisty wrażenie jakie odniesienie po instalacji PHP 5.5 będzie niesamowite przyspieszenie działania PHP. A reszta może zapomnieć o dodatkowej instalacji APC, lub pilnowania aktualności wersji tej paczki PECL. Przykładowa konfiguracja Opcode w php.ini:

opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

Constant dereferencing

To jest jedna z tych rzeczy, na którą czekałem. Bardzo wiele razy trzeba było tworzyć zmienną, by móc odwołać się do n-tego elementu lub znaku. Nigdy więcej :)

echo "Hello"[3]; // wynik: 'l'
echo [1,2,3,4][2]; // wynik: '3'

List w foreach

Do tej pory sposób korzystania z list() był delikatnie mówiąc – brzydki. Było to bardzo nielogiczna operacja moim zdaniem i z niej nie korzystałem. Od nowej wersji natomiast możemy skorzystać z tej funkcji bezpośrednio w wywołaniu foreach. Przykład z wiki RFC:

$users = [
    ['Foo', 'Bar'],
    ['Baz', 'Qux'],
];

foreach ($users as list($firstName, $lastName)) {
    echo 'First name: ' . $firstName . ', last name: ' . $lastName . PHP_EOL;
}

Słowo kluczowe finally

W końcu finally można dodać do bloku try…catch i mamy gwarancję, że dany fragment zostanie zawsze wykonany. Do tej pory wyglądało to tak, że używaliśmy pięknej obiektówki, a później nagle trach fragment znikąd, w którym czyściliśmy niektóre operacje lub robiliśmy przekierowanie – nigdy więcej.

try {
  $person = new Person();
  if(!$person) {
     throw new Exception();
  }

} catch (Exception $e) {
  // Handle exception
} finally {
  Redirect::url('/');
}

Password Hashing API

W końcu nie musimy samemu tworzyć funkcji hashujących dla haseł, ani martwić się czy użyty algorytm jest odpowiednio dobry. Od teraz mamy do dyspozycji wbudowaną funkcję hashującą password_hash oraz funkcję sprawdzającą poprawność hasha password_verify. Domyślny algorytm to bcrypt, który generuje hash 60 znakowy. Przykład:

$hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}

Generatory

Generatory mają nam ułatwić tworzenie przeróżnych iteratorów. Tworzy się je jak normalne funkcje, ale nie używa się słowa return. Zamiast return w generatorze używamy field w następujący sposób:

function daysOfTheYear() {
    $year = date('Y');
    $current = new DateTimeImmutable($year . '-01-01');

    do {
        yield $current;
        $current = $current->modify('+1 day');
    } while ($current->format('Y') === $year);
}

foreach(daysOfTheYear() as $dt) {
    // ...
}

Widzicie jakie to proste? Można powiedzieć, że w yield odkładają nam się kolejne wartości dopóki funkcja nie przestanie działać. Taki generator zwraca nam najzwyklejszą tablicę.

Dodatkowo zaktualizowano GD do wersji 2.1, empty() może przyjmować dowolne wartości (również bool) oraz wprowadzono wiele usprawnień.

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

Autor wpisu: cichy, dodany: 22.06.2013 10:13, tagi: php

Dziś na stronie php.net zauważyłem możliwość przetestowania nowej skórki serwisu, jestem bardzo zadowolony z tego jak będzie już niedługo wyglądał :)

Dla tych którzy by chcieli sami przetestować dobra wiadomość wystarczy do starego linku doczepić argument beta=1 czyli np: http://www.php.net/manual/en/function.count.php?beta=1

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