Results for category "PHP"

58 Articles

Test environments for database integration tests in Laravel 5

As far as I have read, in Laravel 4 you could define your database integration test environment by adding a testing/database.php or .env.testing.php file containing your configuiration. In Laravel 5 both ways does no longer work. To switch your environment you have two options:

  1. Put both configuration definitions (testing, dev/production) inside your config/database.php:
        'connections' => [
    
            'sqlite' => [
                'driver' => 'sqlite',
                'database' => storage_path('database.sqlite'),
                'prefix' => '',
            ],
            'mysql' => [
                'driver' => 'mysql',
                'host' => env('DB_HOST', 'localhost'),
                'database' => env('DB_DATABASE', 'schema'),
                'username' => env('DB_USERNAME', 'root'),
                'password' => env('DB_PASSWORD', 'root'),
                'charset' => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix' => '',
                'strict' => false,
            ],
            'mysql_testing' => [
                'driver' => 'mysql',
                'host' => env('DB_HOST_TEST', 'localhost'),
                'database' => env('DB_DATABASE_TEST', 'schema_test'),
                'username' => env('DB_USERNAME_TEST', 'root'),
                'password' => env('DB_PASSWORD_TEST', 'root'),
                'charset' => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix' => '',
                'strict' => false,
            ],
    

    and store the configuration defaults in your .env file by adding the configuration keys DB_HOST_TEST, DB_DATABASE_TEST and so on. Eventually you must modify your base TestCase::createApplication to use the mysql_testing connection:

        /**
         * Creates the application.
         *
         * @return \Illuminate\Foundation\Application
         */
        public function createApplication()
        {
            putenv('DB_CONNECTION', 'mysql_testing');
    
            $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
    
            return $app;
        }
    
  2. I prefer the second solution: Copy the .env file to .env.testing, modify the settings and override the default Dotenv file .env by modifying your base TestCase::createApplication:
        public function createApplication()
        {
            $app = require __DIR__.'/../bootstrap/app.php';
            // ckl: use .env.testing in favor of .env; clear separation between configuration values and configuration definition
            $app->loadEnvironmentFrom('.env.testing');
    
            $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
    
            return $app;
    

Using GitHub forks or local Git repositories with Composer

For two weeks I have been heavily developing a new web application based upon Laravel. Tonight I searched for an easy filtering solution like Zend_Filter so that the request strings are automagically trim’d, lowercased, and so on. Lucky me, the repository https://github.com/rmasters/filter is available with a composer.json but latest commit from 2013 is not compatible with Laravel 5.1. The compatibility fix would be trivial: editing two files in the composer.json and it is done. But how can I use my own fork on GitHub or my local cloned repository?

I learned, that I can add a repository reference to the composer.json of my application:

"repositories": [
		{
			"type": "vcs",
			"url": "http://github.com/schakko/filter"
		}
	],

Additionally, I have to specify my development branch which contains the Laravel 5.1 fix (laravel51):

    "require": {
        "php": ">=5.5.9",
        "laravel/framework": "5.1.*",
        "laracasts/flash": "~1.3",
        "cocur/slugify": "dev-master",
        "rmasters/filter": "dev-laravel51"
    },

It is important that the Git branch is named laravel51 and not dev-laravel51, otherwise you will receive an error like

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - The requested package rmasters/filter could not be found in any version, there may be a typo in the package name.

Potential causes:
 - A typo in the package name
 - The package is not available in a stable-enough version according to your minimum-stability setting
   see https://groups.google.com/d/topic/composer-dev/_g3ASeIFlrc/discussion for more details.

Read https://getcomposer.org/doc/articles/troubleshooting.md for further common problems.

Another neat feature is that Composer supports local repositories without any problems. During testing I changed my repository to

	"repositories": [
		{
			"type": "vcs",
			"url": "c:/ckl/projects/github/filter"
		}
	],

and had no longer to push my changes to the remote repository. The code has to be committed to local branch, of course.

Convert Active Directory schema to XML or JSON

As I mentioned yesterday, Christoph is currently developing the Active Directory Integration WordPress plugin. Today we were talking about the write back of WordPress profile settings to Active Directory. I mentioned it would be helpful to have an abstract definition of available Active Directory attributes which can be dynamically integrated into WordPress.

Suggest that you can select wished Active Directory attributes in WordPress from a list and Active Directory Integration will automatically generate the designated input fields or disable the field if write back is not allowed (e.g. for login time). All information are already existent in Active Directory namely stored in Active Directory Schema Configuration.

Because I had to take a break from preparing my next math exam I fired up Notepad++ and did a quick hack in PHP. The converter transforms a given LDIF input file into XML or JSON which then can be used as template for systems using Active Directory attributes.

Neues sf.net-Projekt: h2benchw2csv / Ergebnis der iSCSI Performance-Tests

Die letzten beiden Tage habe ich unser SAN und das dahinter liegende iSCSI-Geraffel ausführlich mit h2benchw von Heise / c’t getestet. Da ich absolut keine Lust hatte, alle Ergebnisse in den Text-Dateien (waren knapp 20 Files) per Hand in Excel einzutippen, frickelte ich mir kurzerhand ein PHP-Script zusammen, dass mir aus den .txt-Dateien von h2benchw eine große CSV-Datei baut. Diese kann dann wiederum in Excel oder irgendeinem anderen Tabellen eingelesen werden.

Weiterhin unterstützt h2benchw2csv – so der Name des kleinen Scripts – die automatische Umwandlung der .ps-Dateien nach .pdf. Dies geschieht mit Hilfe des PDFCreators, der in der %PATH%-Variable verfügbar sein muss. Gegenwärtig ist h2benchw2csv noch im sf.net Approval State, sollte aber morgen oder übermorgen freigeschaltet werden.

Features:

  • Umwandeln von h2benchw .txt-Ergebnissen in eine CSV-Datei
  • Komplette Inhalte von Verzeichnissen können in der CSV-Datei gespeichert werden
  • Deutsch/Englisch
  • Umwandlung der h2benchw .ps-Dateien mit Hilfe des PDFCreators nach PDF
  • 100% Open Source und Kommandozeile
  • Benötigt wird nur PHP – es wird keine zusätzliche Bibliothek benötigt

Zu den Ergebnissen meiner iSCSI-Performance-Messung ist folgendes zu schreiben:

  1. Round-Robin oder Weighted Path in einem Verbund von 4 Netzwerkkarten auf Client und Server bringen rein gar nichts, wenn sie gemeinsam auf ein Target zugreifen. Die maximale Leserate betrug 75 MByte/s, die maximale Schreibrate 60 MByte/s. Wir gingen eigentlich davon aus, dass mit jeder (Gigabit)-Netzwerkkarte die Performance mitskaliert – also eine NIC: 70 MByte/s, zwei NICs 140 MByte/s u.s.w. Dem ist aber eindeutig nicht so.
  2. Interessant war hingegen, dass bei 4 Targets und Fail Over der Gesamtdurchsatz auf ca. 200 MByte/s beim Lesen und 170 MByte/s beim Schreiben anstieg.
  3. Für mich schaut das nach einem Problem im iSCSI Initiator oder -Treiber aus.
  4. Bonding und Multipath gemeinsam benutzt bringen nichts.
  5. Die Firmware 1.46 des Areca 1231 kann nun vernünftig mit NTP-Servern umgehen – bringt aber keine bessere Performance
  6. FileIO ist beim Schreiben geringfügig schneller als BlockIO (2 MByte/s)
  7. Jumboframes (MTU 9000 auf Windows Server 2003 und 9014 auf DSS) brachten bei uns keinen Performance-Unterschied
  8. Fail Over ist schneller als Weighted Path, Weighted Path ist schneller als Round Robin
  9. Keine der vier Intel-Netzwerkkarten wurde unter Windows Server 2003 zu mehr als 50% ausgelastet. Hier gibt es eventuell auch Treiber-Probleme.
  10. Trotz allem ist unser iSCSI-SAN fix 😉

XCache / PHP liefert falsche Dateien zurück

Ich erwähnte das Problem bereits vor ein paar Tagen: Flo’s Blog ist unter http://prunkster.ecw.de zu erreichen, meiner unter http://wap.ecw.de. Wir beide fahren die WordPress-Version. Auf dem Server läuft ein PHP 5.3.8 mit der aktuellen XCache-Version.
Das Problem ist nun folgendes: In bestimmten Abständen sind Flo’s-Seiten nicht erreichbar. Im error.log des Apache ist dann zu finden, dass zuerst die richtige Datei geladen wird, er dann aber die Datei im Verzeichnis von wap.ecw.de lädt. Ich vermutete zu Anfang, dass der Fehler im Apache entsteht. Allerdings ist dem nicht so – unter http://xcache.lighttpd.net/ticket/117 gibt es dazu bereits ein Ticket, das genau auf unsere Fehlerbeschreibung zutrifft. Ich hoffe, dass sich die Jungs von XCache mal daran setzen und den Bug irgendwie fixen.

Besonders interessant ist, dass das oben genannte Ticket auf einen Eintrag im PHP-Bugtracker verweist – sich die PHP-Entwickler darum aber nicht kümmern.
Mir ist es mittlerweile auch schon zweimal passiert, dass ein offensichtlicher Bug als “Bogus” abgelehnt worden ist.

WordPress: Smilies für vorformattierten Text deaktivieren

Der JavaScript Syntax-Highlighter SyntaxHighlighter ist mittlerweile recht bekannt und auch als Plugin für WordPress verfügbar. Leider ist nun so, dass bestimmte Zeichen in einem Quellcode – z.B. 8); – zu einem Smiley konvertiert werden.
Das sorgt dafür, dass die Smilies den kompletten Quellcode zerstören. Für die Umwandlung von Sonderzeichen sorgt die Funktion wp-includes/formatting.php/convert_smilies($text).

Mit folgendem Code (WP 2.7.1, ab Zeile 1094) werden vorformattierte Texte – d.h. die mit <pre> eingeleitet werden – nicht mehr mit Smilies verunreinigt:

/**
* Convert text equivalent of smilies to images.
*
* Will only convert smilies if the option 'use_smilies' is true and the globals
* used in the function aren't empty.
*
* @since 0.71
* @uses $wp_smiliessearch, $wp_smiliesreplace Smiley replacement arrays.
*
* @param string $text Content to convert smilies from text.
* @return string Converted content with text smilies replaced with images. Pre-formatted text is ignored.
*/
function convert_smilies($text) {
  global $wp_smiliessearch, $wp_smiliesreplace, $post;
  $output = '';

  if ( get_option('use_smilies') && !empty($wp_smiliessearch) && !empty($wp_smiliesreplace) ) {
    // HTML loop taken from texturize function, could possible be consolidated
    $textarr = preg_split("/(<.*>)/U", $text, -1, PREG_SPLIT_DELIM_CAPTURE);
    // capture the tags as well as in between
    $stop = count($textarr);// loop stuff

    $bInPreFormattedText = FALSE;

    for ($i = 0; $i < $stop; $i++) {
      $content = $textarr[$i];

      // pre-formatted text reached => set flag
      if (strpos($content, "<pre") !== FALSE) {
        $bInPreFormattedText = TRUE;
      }

      // pre-formatted text ends => disable flag
      if (strpos($content, "</pre>") !== FALSE) {
        $bInPreFormattedText = FALSE;
      }

      if ((strlen($content) > 0) && ('<' != $content{0}) && !$bInPreFormattedText) {
        // If it's not a tag and we are not in an <pre>-tag
        $content = preg_replace($wp_smiliessearch, $wp_smiliesreplace, $content);
      }

      $output .= $content;
    }
  } else {
    // return default text.
    $output = $text;
  }

  return $output;
}

Projekt-Plan PDT 2.0

Kurzer Quote aus dem Projektplan, den Roy Ganor gerade veröffentlichte:

• 2.0 M1 – November 03 (done)
• 2.0 M2 – November 24
• 2.0 RC1 – December 08
• 2.0 RC2 – December 14
• 2.0 RC3 – December 23 (tentative)
• 2.0 Release – December 29

In wenigen Schritten von ISO-8859-1 zu UTF-8

Ich frickel momentan an der Umstellung meines Blogs und damit steht auch die Umstellung von ISO-8859-1 auf UTF-8 auf dem Plan.
Damit alles wunderbar funktioniert, hier die Vorgehensweise für eine MySQL 5-Datenbank:

  1. In PDT/ZS als Encoding des Projekts UTF-8 auswählen und Projekt neu builden lassen.
  2. Eventuell noch einmal mit Notepad++ sich die View-Scripte anschauen und manuell nach UTF-8 konvertieren (Format > Konvertiere zu UTF-8).
  3. Im head-Tag das obligatorische
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

    einfügen.

  4. Einen Dump der aktuellen MySQL-Datenbank ziehen
  5. Diesen Dump mit Notepad++ nach UTF-8 konvertieren (s.o.)
  6. Im Dump CHARSET=latin1 durch CHARSET=utf8 ersetzen
  7. Neuen Dump einspielen und eventuell beim Connecten mit PHP zur Datenbank SET NAMES ‘utf8’ aufrufen.
  8. Glücklich sein.

PHP 5.3 alpha 2: parse_ini_file liefert leeres Array

Gerade habe ich die Alpha 2 von PHP 5.3 angetestet und bin gleich über die ersten Fehler gestolpert:
parse_ini_file liefert ein leeres Array, wenn die ini-Datei als UTF-8 gespeichert ist. Ich hab unter http://bugs.php.net/bug.php?id=45991 gleich mal einen Eintrag hinzugefügt.

Der nächste “Fehler” besteht darin, dass pdo_mysql sich nicht mehr mit MySQL < 4.1 verbinden kann. Dann wird der include_path falsch interpretiert. Enthält der include_path Backslashes -was er zwar nicht sollte, aber in PHP 5.2.x erlaubt war- wird das nachfolgende Zeichen hinter dem Backslash als Meta-Character interpretiert. "dirtrunk" wird in "dir runk" umgewandelt (t => Tab).
Zu finden unter http://bugs.php.net/bug.php?id=45992.

Als letztes kam dann noch der Fehler, dass die Klasse Zend_Session nicht geladen werden konnte.
PHP kann die Datei Zend/Session/Namespace.php des Zend Frameworks nicht einbinden.
Der Fehler ist ebenfalls im Bugtracker zu finden, und zwar unter http://bugs.php.net/46000.

Fazit: Alpha2 taugt bis jetzt noch nicht viel.