Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: matipl, dodany: 22.07.2013 21:02, tagi: internet, php

OVH - logoTym razem dość krótko. OVH – firma oferująca shared hosting, serwery VPS i dedykowane – właśnie oświadczyło za pomocą swojego systemu, że doszło do włamania do ich wewnętrznej sieci firmowej. W zeszłym tygodniu podobne włamanie miało miejsce do Developer Center firmy Apple (jakaś plaga?).

Niestety dzisiejsza sprawa dotyczy  wszystkich klientów firmy OVH z Europy. To co najważniejsze – wykradziono loginy (NIC) oraz hashe haseł, które przy odpowiednich możliwościach własnych da się złamać. Reszta danych dla większości powinny być bez znaczenia (adresy do faktur, telefon, faks).

Kto z Was ma konto (dostęp do panelu w OVH) niech jak najszybciej zmieni hasło, aby później się nie zdziwił że serwer z aplikacją PHP jest niedostępny.

Informacja od OVH: http://prace.ovh.pl/?do=details&id=16227

Autor wpisu: Athlan, dodany: 18.07.2013 01:41, tagi: php, php.pl, symfony

Context

When you scale a PHP application you have to consider several aspects of runtime environment such us:

  • Bytecode caching (e.x. APC or Zend Optimizer Plus or eAccelerator), more;
  • Reading project files from RAM instead of HDD;
  • Caching and minify static content etc.
  • One additional aspect is storing sessions.

By default, PHP stores sessions in files. There are also several approaches to speed up saving sessions, such us memcached, mapping save_path folder as ramdisc, etc.

In scaling approaches there is important that many worker nodes (with deployed application) runs the same code, round-robin selected or load-ballanced, but have the same space to store sessions, because there is no guarantee in distributes architecture, that next user’s request will be handled by the same node. This implies, that session memory have to be shared between nodes, unfortunately storing these data in local RAM doesn’t meet this requirement.

Redis as PHP Session Handler

One of additional approach to storing sessions in fast-memory is Redis – key-value store. This could be configured as centralized or distributed database.

There is available a Redis session_handler for PHP. To use it:

  1. install Redis first as a service [more]
  2. copy/compile redis.so PHP extension [more information]
  3. register an extension in php.ini configuration file
  4. reconfigure session.save_handler in your php.ini configuration file, or set it directly on runtime by writing for e.x.:
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://localhost:6379');
Redis Session Handler in Symfony 2

I am using Symfony 2 framework. Unfortunately, 4th step don’t affects the application. You have to register own SessionHandler in config.yml file:

framework:
    session:
        handler_id: session_handler_redis

This configuration uses new SessionHandler registered ad session_handler_redis Symfony Service (more).

We have to write own SessionHandler in Symfony. I have found the Redis SessionHandler proposed by Andrej Hudec on GitHub (original code here). I have decided to use and improve existing implementation.

Declare new SessionHandler class somewhere in your project:

<?php
 
namespace Fokus\Webapp\CommonBundle\SessionHandler;
 
use \Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler;
 
/**
 * NativeRedisSessionStorage.
 *
 * Driver for the redis session save hadlers provided by the redis PHP extension.
 *
 * @see https://github.com/nicolasff/phpredis
 *
 * @author Andrej Hudec <pulzarraider@gmail.com>
 * @author Piotr Pelczar <me@athlan.pl>
 */
class NativeRedisSessionHandler extends NativeSessionHandler
{
    /**
     * Constructor.
     *
     * @param string $savePath Path of redis server.
     */
    public function __construct($savePath = "")
    {
        if (!extension_loaded('redis')) {
            throw new \RuntimeException('PHP does not have "redis" session module registered');
        }
 
        if ("" === $savePath) {
            $savePath = ini_get('session.save_path');
        }
 
        if ("" === $savePath) {
            $savePath = "tcp://localhost:6379"; // guess path
        }
 
        ini_set('session.save_handler', 'redis');
        ini_set('session.save_path', $savePath);
    }
}

Now, add the entry that declares the class as a Symfony Service in services.yml file:

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

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: Łukasz Socha, dodany: 14.07.2013 13:00, tagi: css

Osoby pracujące jako web developer zapewne nieraz spotkały się z koniecznością stworzenia „klikalnej” mapy Polski. Większość map tworzonych jest z wykorzystaniem Flasha. Nie wszyscy zapewne wiedzą, że taką mapę można również stworzyć za pomocą HTML/CSS z dodatkiem JS.

Przygotowanie projektu mapy

Na początek musimy przygotować pliki graficzne z mapą. Wykorzystałem mapę Polski ze strony Wikipedii. Mapa będzie w odcieniach szarości, natomiast po najechaniu myszką województwo zmieni kolor.

mapa_przyklad

Jako plik bazowy wykorzystamy mapę Polski w odcieniach szarości. Kolejnymi plikami są poszczególne województwa, które pojawią się po najechaniu myszką. Ważne jest, by wszystkie grafiki miały jednakowe wymiary (obszar poza danym województwem musi być przezroczysty).

Gotowe? No to kodujemy… :-)

Na początek stwórzmy szkielet dokumentu:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
        <title>Mapa</title> 
        <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" /> 
        <meta name="Description" content="" /> 
        <meta http-equiv="Content-Language" content="pl" /> 
        <meta name="Keywords" content="" /> 
        <script type="text/javascript" src="jquery-1.10.2.min.js"></script> 

        <style type="text/css"> 
        </style> 
        <script type="text/javascript">
        </script> 
    </head> 
    <body> 
        <div id="area"> 
        </div> 
    </body> 
</html>

#area będzie kontenerem zawierającym całą mapę. Wrzućmy do niego obrazek z tłem mapy:

<img id="map_poland" usemap="#poland" src="mapa.png" />

Teraz dodajmy listę województw:

<ul> 
    <li id="lubelskie"><img src="lubelskie.png" usemap="#poland" /></li> 
    <li id="podkarpackie"><img src="podkarpackie.png" usemap="#poland" /></li> 
    <li id="podlaskie"><img src="podlaskie.png" usemap="#poland" /></li> 
</ul> 

Musimy jeszcze „zmapować” obrazek z mapą, żeby obszary do klikania miały mniej więcej kontury takie jak województwa. Służą do tego znaczniki map i area.

<map id="poland" name="poland" > 
    <area shape="poly" alt="lubelskie" title="lubelskie" coords="571,255,554,275,539,269,541,280,532,280,523,289,488,291,488,305,492,325,476,328,490,335,495,348,490,352,492,357,491,389,500,417,505,417,508,406,522,417,518,429,542,436,546,450,537,449,535,454,536,458,555,459,550,463,575,464,585,451,591,455,598,451,612,468,619,451,639,446,640,431,638,410,630,398,633,388,607,350,614,346,595,306,610,307,618,269" href="#lubelskie" /> 
    <area shape="poly" alt="podkarpackie" title="podkarpackie" coords="608,465,555,546,563,562,561,579,575,595,570,593,554,593,512,576,506,565,477,554,467,562,464,525,455,519,461,513,452,509,455,464,452,461,471,449,483,443,486,433,494,428,495,414,498,416,510,413,514,413,516,423,534,433,542,432,544,447,534,455,545,456,551,462,571,462,583,451,588,451,599,448,602,456,607,462" href="#podkarpackie" /> 
    <area shape="poly" alt="podlaskie" title="podlaskie" coords="537,40,543,32,552,36,555,46,569,51,569,51,577,53,592,76,582,77,614,159,620,187,621,218,594,227,576,256,567,255,552,245,535,247,526,215,523,201,513,208,518,193,500,204,501,183,488,180,478,173,476,148,467,134,484,139,494,132,513,121,536,103,540,87,530,79,530,62,519,57,539,49" href="#podlaskie" /> 
</map>

Kolejne obszary tworzone są znacznikiem area. Atrybut shape określa kształt zaznaczenia, mamy do wyboru: rect (prostokąt), circle (koło) oraz poly (wielokąt). Atrybut coords zawiera współrzędne obszaru (para liczb – oś X i Y). Trzeba pamiętać, że współrzędne liczone są od lewego, górnego wierzchołka obrazka. Do mapowania wykorzystałem Online Image Map Editor.

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: vonski, dodany: 10.07.2013 22:26, tagi: javascript

Programując w Javascript czasem zachodzi potrzeba sprawdzenia, czy zmienna na której operujemy jest stricte tablicą (a nie „po prostu” obiektem). Pierwszy na myśl nasuwa się oczywiście operator typeof, jednak na niewiele on się nam zda w tej sytuacji. Popatrz na poniższy przykład:

var a = [];
var b = {};

console.log( typeof a ); // object
console.log( typeof b ); // object

Są jednak dwa wyjścia z tej sytuacji. ECMAScript 5 wprowadza nową metodę Array.isArray. Dlatego test możesz przeprowadzić np. w ten sposób:

var a = [];
var b = {};

console.log( Array.isArray(a) ); // true
console.log( Array.isArray(b) ); // false

Minusem tego rozwiązania jest fakt, że nie zadziała ono w starszych, aczkolwiek nadal używanych przeglądarkach (np. IE8). Jest jednak drugie rozwiązanie, mianowicie metoda… toString():

var a = [];
var b = {};

console.log( Object.prototype.toString.call(a) ); // [object Array]
console.log( Object.prototype.toString.call(b) ); // [object Object]

Drugiego sposobu możesz już bez obaw używać w starszych wersjach IE.

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