Web + Mobile Blog / Berlin http://sebastianviereck.de PHP Freelancer Tue, 20 Nov 2018 09:12:17 +0000 de hourly 1 http://wordpress.org/?v=3.5.1 Symfony Service ID dynamisch konfigurieren mittels Parameter http://sebastianviereck.de/symfony-service-id-dynamisch-konfigurieren-mittels-parameter/?utm_source=rss&utm_medium=rss&utm_campaign=symfony-service-id-dynamisch-konfigurieren-mittels-parameter http://sebastianviereck.de/symfony-service-id-dynamisch-konfigurieren-mittels-parameter/#comments Tue, 20 Nov 2018 09:12:17 +0000 Sebastian Viereck http://sebastianviereck.de/?p=3892-de Weiterlesen ]]> Wenn man gern in seiner Depnedency Injection Kofiguration (services.yml) die Service Injektionen dynamisch konfigurierbar machen will über die parameters.yml,

parameters:
    my_class: 'App\MyClass'

kann man dies mittels der Symfony Expression Language Komponente tun:

composer require symfony/expression-language

Dann kann man in der services.yml definieren:

services:
    App\Command\MyCommand:
      arguments:
        - '@=service(parameter("my_class"))'
]]>
http://sebastianviereck.de/symfony-service-id-dynamisch-konfigurieren-mittels-parameter/feed/ 0
Windows Composer Update Fatal error: Allowed memory size of 1610612736 bytes exhausted http://sebastianviereck.de/windows-composer-update-fatal-error-allowed-memory-size-1610612736-bytes-exhausted/?utm_source=rss&utm_medium=rss&utm_campaign=windows-composer-update-fatal-error-allowed-memory-size-1610612736-bytes-exhausted http://sebastianviereck.de/windows-composer-update-fatal-error-allowed-memory-size-1610612736-bytes-exhausted/#comments Tue, 13 Nov 2018 13:30:27 +0000 Sebastian Viereck http://sebastianviereck.de/?p=3885-de Weiterlesen ]]> Folgende Fehlermeldung hat mein Composer trotz unbegrenztem Speicher:

 composer update
 Loading composer repositories with package information
 Updating dependencies (including require-dev)

 VirtualAlloc() failed: [0x00000008] Zur Verarbeitung dieses Befehls sind nicht gen
 VirtualAlloc() failed: [0x00000008] Zur Verarbeitung dieses Befehls sind nicht gen

 Fatal error: Out of memory (allocated 1260388352) (tried to allocate 201326600 bytes) in phar://C:/ProgramData/ComposerSetup/bin/composer.phar/src/Composer/DependencyResolver/RuleSet.php on line 83

Wenn man unter Windows ein composer Update nicht mehr durchführen kann, obwohl man das Memory Limit auf unbegrenzt gesetzt hat, dann hat man ein Problem:

Das Windows-Xammp ist nur als 32 bit System erhältlich und kann nur 2GB Ram bereitstellen im Moment, eine weitere Erhöhung ist nicht möglich.

Die Lösung ist  Composer mit einem 64bit PHP auf der Konsole auszuführen (dies hat dann bis zu 4GB Memory).

  • Download von PHP x64 Version
  • entpacken und php.ini anlegen (umbennnen der php.ini-development)
  • memory Limit erhöhen in php.ini: memory_limit = -1
  • auf der Konsole ausführen:
"C:\php-7.2.12-nts-Win32-VC15-x64\php" C:\ProgramData\ComposerSetup\bin\composer.phar update
]]>
http://sebastianviereck.de/windows-composer-update-fatal-error-allowed-memory-size-1610612736-bytes-exhausted/feed/ 0
Yii2 versus Symfony 4 – ein Framework Vergleich http://sebastianviereck.de/yii2-symfony-4-ein-framework-vergleich/?utm_source=rss&utm_medium=rss&utm_campaign=yii2-symfony-4-ein-framework-vergleich http://sebastianviereck.de/yii2-symfony-4-ein-framework-vergleich/#comments Sun, 21 Oct 2018 14:17:20 +0000 Sebastian Viereck http://sebastianviereck.de/?p=3873-de Weiterlesen ]]> Ich habe lange mit Yii und dem Symfony Framework gearbeitet und will versuchen im Folgenden die Unterschiede von beiden Frameworks aus Programmierer Sicht zu erläutern.

Konfiguration von Umgebungen

Beim Erstellen von Web-Anwendungen hat man typischer Weise mindestens 2 Umgebungen: Die Entwicklungsumgebung, auf der man Fehler sehen will und die Live Umgebung, wo dies nicht passieren soll. Dazu kommen Test-Umgebung zum Ausführen automatisierter Tests und vielleicht eine Staging Umgebung.

Symfony löst das sehr geschickt, mit .env Dateien und eigenen Ordnern innerhalb des Konfigurations-Ordners.

Bei Yii muss der Programmierer selber hand anlegen, um die richtige Konfiguration zu laden, es sind von Hause aus nur 3 (dev, prod, test) Umgebungen vorgsehen, danach wird es unübersichtlich.

Konsolen Commands

Konsolen Commands und normale Controller unterscheiden sich in Symfony komplett in Sachen Syntax, jedoch bieten beide dieselbe Funktionalität an.

Hier hat Yii den Vorteil, sich sehr änhlich zu verhalten und denselben Syntax für Controller zu verwenden.

 Datenbank Interaktion

Yii 2 setzt auf einen eigenen Datenbank Wrapper, mit dem Datenbankoperationen und Migrationen getätigt werden. Datenbanken müssen über Migrationen erstellt werden und daraus können dann die Entitäten Objekte generiert werden. Yii setzt auf das ActiveRecord Pattern, was aus Performancesicht leider nicht optimal ist im Verglech zum Repository Pattern von Symfony, da jedes Entitäten Objekt unnötigen Funktionalität mit sich herum schleppt. Auf der anderen Seite ist alles sehr zentral abgelegt in einer Datei, seien es nun Labels oder Fehlermeldungen für Formulare, Validatoren für einzelne Attribute oder Queries auf die Tabelle. Komfortabel ist die Möglichkeit pro Entität einen andere Datenbank-Verbindung zu benutzen. Die Daten können mit Hilfe der Gridview sehr einfach angezeigt werden.

Symfony setzt auf Doctrine als ORM Mapper und hat damit den Vorteil, dass Tabellen automatisch erzeugt werden anhand der Entitäten Definitionen und man einen weitaus größeren Funktionsumfang verwenden kann sowie mehr Auto-Completition in der IDE erhält aufgrund des objektorientierten Stils von Doctrine. Zum Anzeigen der Daten in einer Listview gibt es keine direkte Komponente, hier kann man beim Erstellen von Administrationsoberflächen auf das Sonata Projekt zurück greifen, mit dem erstklassige Backends erstellt werden können.

Code Generatoren

Yii besitzt einen sehr guten Code Generator namens Gii, mit dem neben den Standard Funktionen wie Model und Extensions Skeletons auch CRUD Oberflächen und Formulare sehr schön und schnell generiert werden können auf der Konsole und zusätzlich auch mit einem Web Frontend.

Symfony hat seit neustem das Symfony Maker Bundle, welches sich sehr schön anpassen lässt, aber nicht an die Funktionalität von Gii heran reicht.

Views

Yii besitzt von Hause keine Templating Engine, alles ist erlaubt und wird auch gemacht in der View, sie ist voller PHP, eigentlich ein Anti Pattern.

Symfony hat eine eigene, sehr schöne Templating Engine: Twig, mit der man sehr schön View und Applikations-Logik/Code trennen kann.

REST

Yii bringt eine ausgewöhlich einfache und umfangreiche REST Implemnetierung mit sich, mit der man sehr einfach REST Schnittstellen erstellen kann inklusive HATEOAS.

Symfony hat seine eigene FOSRest Extension, die aber nicht so elegant wie die von Yii ist. HATEOAS ist nicht verfügbar.

Debugging

Beide Frameworks habe eigene Debugging Toolbars und Profiling Möglichkeiten an Board.

Testing

Yii besitzt sehr viel statische Methode Aufrufe, die erstmal schwierig zu testen sind.

Symfony benutzt Dependency Injection für alle Services und lässt sich ausgezeichnet testen.

Long Term Support

Yii legt sich beim Support nicht fest, wohin gegen Symfony Long Term Support Versionen anbietet, die garantiert 4 Jahre supportet werden.

Caching

Yii bietet von Hause alles Caching Features, die man sich wünschen kann:

  • verschiedene Cache Provider: File, Redis, Datenbank, Memcache, Windcache etc.
  • Datenbank Query Cache
  • View Fragment Cache
  • HTTP Cache

alle sehr einach zu verwenden, ein klarer Pluspunkt für Yii.

Symfony kann dies genauso, nur mit etwas mehr Installationsaufwand, weil es nicht von Hause dabei ist. Symfony unterstützt aber zum Esi (Edge Side Includes).

Architektur

Yii ist sehr einfach aufgebaut, sehr viel arrays mit beannten Keys, die man kennen muss und die einem das Leben schwer machen.

Symfony hat Dependency Injection, was beim Testen und Arbeiten sehr komfortabel ist und sehr verständlichen, gut lesbaren und testbaren Code produziert.

Fazit:

Symfony ist eine professionelle Basis für große und zu testende Projekte. Yii ist sehr gut geeignet für schnell zu erstellende Prototypen und kleinere Projekte.

]]>
http://sebastianviereck.de/yii2-symfony-4-ein-framework-vergleich/feed/ 0
PHP encode String zu Extended ASCII 8bit 255 Zeichen http://sebastianviereck.de/php-udp-encode-string-zu-extended-ascii-8bit-255-zeichen/?utm_source=rss&utm_medium=rss&utm_campaign=php-udp-encode-string-zu-extended-ascii-8bit-255-zeichen http://sebastianviereck.de/php-udp-encode-string-zu-extended-ascii-8bit-255-zeichen/#comments Thu, 11 Oct 2018 08:00:19 +0000 Sebastian Viereck http://sebastianviereck.de/?p=3868-de Weiterlesen ]]> Um auch Umlaute in ein Bit darzustellen, kann man den erweiterten ASCII Zeichensatz verwenden mit 255 Zeichen, der auch Umlaute enthält wie ä, ö, ü und ß.

Um dieses zu nutzen, kann man die folgende Funktion nutzen:

/**
 * @param string $string
 * @return string
 */
protected function asciiEncodeString(string $string): string
{
    $sourceEncoding = mb_detect_encoding($string);
    $destinationEncoding = 'CP437'; // Extended ASCII - Codepage 437
    $string = iconv($sourceEncoding, $destinationEncoding, $string);
    return $string;
}
]]>
http://sebastianviereck.de/php-udp-encode-string-zu-extended-ascii-8bit-255-zeichen/feed/ 0
Adobe Creative Suite CS2 kostenlos downloaden und Seriennummern http://sebastianviereck.de/adobe-creative-suite-cs2-kostenlos-downloaden-und-seriennummern/?utm_source=rss&utm_medium=rss&utm_campaign=adobe-creative-suite-cs2-kostenlos-downloaden-und-seriennummern http://sebastianviereck.de/adobe-creative-suite-cs2-kostenlos-downloaden-und-seriennummern/#comments Thu, 06 Sep 2018 08:56:40 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3853-de Weiterlesen ]]> Adobe hat netter Weise die CS2 Versionen seiner Creative Suite online gestelllt.

Allerdings ist es nicht einfach daran zu kommen. Unter Windows 10 hatte ich keine Probleme mit den Programmen bis jetzt.

Download des Installers

Die Dateien können hier gedownloaded werden, die Keys stehen jeweils neben dem Downloader.

]]>
http://sebastianviereck.de/adobe-creative-suite-cs2-kostenlos-downloaden-und-seriennummern/feed/ 0
Tutorial: Windows Datenrettung mit Freeware Software http://sebastianviereck.de/tutorial-windows-datenrettung-mit-freeware-software/?utm_source=rss&utm_medium=rss&utm_campaign=tutorial-windows-datenrettung-mit-freeware-software http://sebastianviereck.de/tutorial-windows-datenrettung-mit-freeware-software/#comments Sun, 02 Sep 2018 08:20:50 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3842-de Weiterlesen ]]> Wenn  unter Windows formatierte oder gelöschte Daten wiederherstellen will kann man die Freeware Version von EaseUS Data Recovery Wizard kostenlos verwenden (auch für MAC). Damit kann man bis zu 2GB an Daten wiederherstellen, mit der Pro Version unbegrenzt viele Daten. Allerdings gehen bei eine Formatierung generell die Ordnernamen unwiederruflich verloren, aber die Daten bleiben erhalten.

Nach dem Download und dem Start des Programmes, muss man das entsprechende Laufwerk auswählen:

laufwerk_auswählen

Danach wird das Laufwerk  gescannt und es werden gelöschte als auch formatierte Dateien aufgelistet nach Dateityp geordnet:

scannen

 

Außerdem kann man sehr Bequem Office Dokumente filtern nach Typ (Excel, Word, Powerpoint) und nach Author des Dokuments und kann so die passenden Daten wiederherstellen:

filter_powerpoint

Fazit: EaseUS ist ein gutes Programm, wenn eine gute Datenrettung Freeware, wenn man wenige Dateien schnell und einfach wiederherstellen will. Es stellt eine sehr gute Filter Funktion für Offcie Dokumente bereit.

]]>
http://sebastianviereck.de/tutorial-windows-datenrettung-mit-freeware-software/feed/ 0
UDP mit PHP Nachrichten senden und empfangen Beispiel http://sebastianviereck.de/udp-mit-php-nachrichten-senden-und-empfangen-beispiel/?utm_source=rss&utm_medium=rss&utm_campaign=udp-mit-php-nachrichten-senden-und-empfangen-beispiel http://sebastianviereck.de/udp-mit-php-nachrichten-senden-und-empfangen-beispiel/#comments Fri, 24 Aug 2018 08:39:40 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3832-de Weiterlesen ]]> Mit PHP kann man über UDP auf dem eigenen Rechner sehr einfach Packete verschicken. Um dies zu testen, braucht man einen Sender und einen Empfänger. In dem Biepsiel kommunizieren beider über die lokale IP auf Port 20010. Die Beispiele müssen auf der Konsole ausgeführt werden.

Sender:

<?php
$address = '127.0.0.1';
$port = 20010;
$beat_period = 1;

$fp = stream_socket_client("udp://$address:$port", $errno, $errstr);
if (!$fp) {
 die("ERROR: $errno - $errstr");
}

while (true) {
 $message = sprintf(
 '%s send: %s'. PHP_EOL,
 date('c'),
 rand(0, 1000000)
 );
 fwrite($fp, $message);
 echo $message;

 sleep($beat_period);
}

Empfänger:

<?php

$address = '127.0.0.1';
$port = 20010;

$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, $address, $port);

if ($socket === false) {
 throw new \RuntimeException(
 sprintf(
 'could not connect to socket address %s on port %s. Error: %s %s',
 $address,
 $port,
 socket_last_error(),
 socket_strerror(socket_last_error())
 )
 );
}

while (true){
 echo socket_read ($socket, 1024);
}
]]>
http://sebastianviereck.de/udp-mit-php-nachrichten-senden-und-empfangen-beispiel/feed/ 0
mehrer UDP Frames mit PHP parallel auslesen mit socket_select() http://sebastianviereck.de/mehrer-udp-frames-mit-php-parallel-auslesen-mit-socket_select/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mehrer-udp-frames-mit-php-parallel-auslesen-mit-socket_select http://sebastianviereck.de/mehrer-udp-frames-mit-php-parallel-auslesen-mit-socket_select/#comments Tue, 21 Aug 2018 10:44:36 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3823-de Weiterlesen ]]> Man kann in PHP sehr schwer parallel Operationen ausführen, aber für das lesen von mehreren Sockets gibt es die socket_select() Funktion. Damit lassen sich mehrere Socket Verbindungen parallel auslesen.

In dem Beispiel werden 2 UDP Socket Verbindungen erstellt und gleichzeitig ausgelesen:

function createSocket(string $ip, int $port)
{
    $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    //set non blocking read
    socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
    socket_bind($socket, $ip, $port);

    if ($socket === false) {
        throw new \RuntimeException(
            sprintf(
                'could not connect to socket address %s on port %s. Error: %s %s',
                $ip,
                $port,
                socket_last_error(),
                socket_strerror(socket_last_error())
                )
        );
    }
    return $socket;
}
function readSockets()
{
 $waitTimeoutSeconds = 1;

 $socket1 = $this->createSocket('127.0.0.1', 20001);
 $socket2 = $this->createSocket('127.0.0.1', 20002);

 $sockets['socket1'] = $socket1;
 $sockets['socket2'] = $socket2;

 $read = $sockets;
 $write = null;
 $except = null;

 if (socket_select($read, $write , $except, $waitTimeoutSeconds))
 {
 // loop through the sockets that showed activity
 if (isset($read['socket1'])) {
    // socket 1 got a message
    $content1 = socket_read ($socket1, 1024);
 }
 if (isset($read['socket2'])) {
    // socket 2 got a message
    $content2 = socket_read ($socket2, 1024);
 }

 } else {
 throw new \RuntimeException('could not read any socket');
 }

 socket_close($socket1);
 socket_close($socket2);
}
]]>
http://sebastianviereck.de/mehrer-udp-frames-mit-php-parallel-auslesen-mit-socket_select/feed/ 0
Windows 10: Die Aktion kann nicht abgeschlossen werden, da der Ordner in einem anderen Programm geöffnet ist http://sebastianviereck.de/windows-10-die-aktion-kann-nicht-abgeschlossen-werden-da-der-ordner-einem-anderen-programm-geoeffnet-ist/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=windows-10-die-aktion-kann-nicht-abgeschlossen-werden-da-der-ordner-einem-anderen-programm-geoeffnet-ist http://sebastianviereck.de/windows-10-die-aktion-kann-nicht-abgeschlossen-werden-da-der-ordner-einem-anderen-programm-geoeffnet-ist/#comments Wed, 04 Jul 2018 14:17:48 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3816-de Weiterlesen ]]> Bei Windows kommt die nervige Fehlermeldung:

Die Aktion kann nicht abgeschlossen werden, da der Ordner in einem anderen
Programm geöffnet ist. Schließen Sie den Ordner und wiederholen Sie den
Vorgang.

Auch in dem Fall, wenn man in der Konsole (cmd) in dem Ordner ist, man muss einfach aus dem Ordner rausgehen mit cd .. oder die Konsole schließen, dann kann man löschen.

 

]]>
http://sebastianviereck.de/windows-10-die-aktion-kann-nicht-abgeschlossen-werden-da-der-ordner-einem-anderen-programm-geoeffnet-ist/feed/ 0
PHP XMLReader für sehr große Dateien Beispiel http://sebastianviereck.de/php-xmlreader-fuer-sehr-grosse-dateien-beispiel/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=php-xmlreader-fuer-sehr-grosse-dateien-beispiel http://sebastianviereck.de/php-xmlreader-fuer-sehr-grosse-dateien-beispiel/#comments Wed, 04 Jul 2018 10:25:51 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3813-de Weiterlesen ]]> Um mit PHP große XML Dateien auswerten zu können, muss man einen SAX Parser verwenden, der die XML Dateien von oben nach unten durchliest und nicht in ein Objekt umwandelt. Dafür ist der XMLReader von PHP vorgesehen.

Ein Beispiel:

$data = new Data();
$reader = new \XMLReader();
$reader->open($file);

while ($reader->read()) {
    if ($reader->nodeType == \XMLReader::ELEMENT) {
        switch ($reader->name) {
            case "tagName1" :
                $node = new \SimpleXMLElement($reader->readOuterXML());
                $attributes = $node->attributes();
                $entity = new Entity();
                $entity->setId($attributes['id']);
                $entity->setName($attributes['name']);
                $entity->setCode($attributes['code']);
                $data->addEntity($entity);

                break;

            case  "tagName2":
                $node = new \SimpleXMLElement($reader->readOuterXML());
                $attributes = $node->attributes();
                $entity = new OtherEntity();
                $entity->setId($attributes['id']);
                $entity->setName($attributes['name']);
                $entity->setCode($attributes['code']);
                $data->addOtherEntity($entity);

                break;
        }
    }
}
]]>
http://sebastianviereck.de/php-xmlreader-fuer-sehr-grosse-dateien-beispiel/feed/ 0