unterschiedliches Verhalten lokal-auf Server

unterschiedliches Verhalten lokal-auf Server

am 07.04.2008 09:35:09 von Micha Kuehn

Hallo,

ich habe ein Problem, das sich auf folgendes Mini-Skript reduzieren lässt:

$gefunden="";
$suche="Grä";
$text="Text\nGrä";
$muster = '~(? if (preg_match($muster,$text)) {
$gefunden .= "-".$suche;
}
echo $gefunden;
?>

Bei mir lokal wird der Text "Grä" gefunden und angezeigt. Auf dem Server
jedoch nicht. Das Problem habe ich bisher nur bei der Zeichenkette "Grä"
bemerkt, bei anderen, z.B. "Jäh" klappt es auch auf dem Server - es kann
also auch nicht an den Umlauten liegen.

Wo könnte die Ursache des Problems sein?

Danke für hilfreiche Hinweise!
Micha
--
Persönliche Mails: Bitte nur als reply - und als Wurmkur werden alle
Mails > 100 KB automatisch und unbesehen gelöscht!

Re: unterschiedliches Verhalten lokal-auf Server

am 07.04.2008 10:59:38 von Niels Braczek

Micha Kuehn schrieb:

> $suche=3D"Grä";
> $text=3D"Text\nGrä";
> $muster =3D '~(? > if (preg_match($muster,$text)) {
> $gefunden .=3D "-".$suche;
> }

> Bei mir lokal wird der Text "Grä" gefunden und angezeigt. Auf dem Ser=
ver=20
> jedoch nicht. Das Problem habe ich bisher nur bei der Zeichenkette "Grä=
"=20
> bemerkt, bei anderen, z.B. "Jäh" klappt es auch auf dem Server - es k=
ann=20
> also auch nicht an den Umlauten liegen.

Bist du sicher, dass du nur den Suchstring und nicht auch den Text
geändert hast? Dir fehlt nämlich der Modifier m - mehr kann ich auf d=
ie
Schnelle nicht sehen.

http://de3.php.net/manual/en/reference.pcre.pattern.modifier s.php

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: unterschiedliches Verhalten lokal-auf Server

am 07.04.2008 11:24:14 von Micha Kuehn

Niels Braczek schrieb:
> Bist du sicher, dass du nur den Suchstring und nicht auch den Text
> geändert hast? Dir fehlt nämlich der Modifier m - mehr kann ich auf die
> Schnelle nicht sehen.

Wenn ich den Modifier einbaue, ändert sich an dem Verhalten nichts. Ich
habe jetzt herausgefunden, dass das \b, also der Wortbegrenzer auf dem
Webserver im Netz anders arbeitet als lokal. Wenn im Suchstring hinten
ein Umlaut steht, matcht dies auf dem Server nicht, nur lokal.

Lasse ich das \b weg, dann geht das, aber das ist ja nicht das, was ich
will, ich will ja "Grä" nur dann finden, wenn es als einzelnes Wort dort
steht.

Es geht übrigens auch, wenn ich nach Grät suche (und den Text
entsprechend ändere). Dann wird das gefunden. Nur wenn der Umlaut hinten
steht (vermutlich auch wenn er vorne steht), dann funktioniert das \b
unterschiedlich lokal und auf dem Server.

Wie kann man das vereinheitlichen?

Micha
--
Persönliche Mails: Bitte nur als reply - und als Wurmkur werden alle
Mails > 100 KB automatisch und unbesehen gelöscht!

Re: unterschiedliches Verhalten lokal-auf Server

am 07.04.2008 11:46:53 von Christoph Bersch

Hallo,

Micha Kuehn schrieb:
>
> ich habe ein Problem, das sich auf folgendes Mini-Skript reduzieren lässt:
>
> > $gefunden="";
> $suche="Grä";
> $text="Text\nGrä";
> $muster = '~(? > if (preg_match($muster,$text)) {
> $gefunden .= "-".$suche;
> }
> echo $gefunden;
> ?>
>
> Bei mir lokal wird der Text "Grä" gefunden und angezeigt. Auf dem Server
> jedoch nicht. Das Problem habe ich bisher nur bei der Zeichenkette "Grä"
> bemerkt, bei anderen, z.B. "Jäh" klappt es auch auf dem Server - es kann
> also auch nicht an den Umlauten liegen.

Doch, es liegt ziemlich sicher an den Umlauten. Das Entscheidende ist,
dass je nach locale ein Umlaut als "Wortbestandteil" gesehen wird, oder
eben nicht. Wenn die Spracheinstellung englisch ist, dann ist ein "ä"
kein Wortbestandteil sonder fällt unter eine andere Kategorie.

Wenn ich obiges Skript unter Linux auf der Kommandozeile mit

LANG=C; php script.php

laufen lasse, dann wird nichts ausgegeben, da die Wortgrenze für diese
Spracheinstellung schon zwischen "r" und "ä" ist.

Rufe ich es hingegen mit

LANG=de_DE@euro; php script.php

auf wird der Text gefunden, da der Umlaut zum Wort mitgezählt wird, und
das Wort demnach erst nach dem "ä" aufhört.

Wenn Umlauten innerhalb des Wortes vorkommen ist es egal!

Vielleicht wird es noch deutlicher, wenn du im obigen Skript mal als
Text z.B.
$text = "Text\nGräc";

reinschreibst, in diesem Fall wird bei LANG=C etwas gefunden, bei
LANG=de_DE@euro hingegen nicht.


Wie man das jedoch systemunabhängig lösen kann, weiß ich nicht :-(

Viele Grüße
Christoph

Re: unterschiedliches Verhalten lokal-auf Server

am 07.04.2008 12:10:56 von Niels Braczek

Micha Kuehn schrieb:

> Es geht übrigens auch, wenn ich nach Grät suche (und den Text=20
> entsprechend ändere). Dann wird das gefunden. Nur wenn der Umlaut hin=
ten=20
> steht (vermutlich auch wenn er vorne steht), dann funktioniert das \b=20
> unterschiedlich lokal und auf dem Server.
>=20
> Wie kann man das vereinheitlichen?

Setze locale auf Deutsch (je nach Server de-DE, german, deutsch, de,
..). Dann gelten Umlaute als Buchstaben.

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: unterschiedliches Verhalten lokal-auf Server

am 07.04.2008 12:13:03 von Niels Braczek

Christoph Bersch schrieb:

> Wie man das jedoch systemunabhängig lösen kann, weiß ich nicht :-=
(

Man kann das locale vorübergehend ändern. ABER: Die Einstellung gilt
zumindest immer accountweit, d.h. alle anderen parallel laufenden
Skripte sind von der Umstellung ebenso betroffen (böse Falle!).

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: unterschiedliches Verhalten lokal-auf Server

am 07.04.2008 12:37:54 von Christoph Bersch

Niels Braczek schrieb:
> Christoph Bersch schrieb:
>
>> Wie man das jedoch systemunabhängig lösen kann, weiß ich nicht :-(
>
> Man kann das locale vorübergehend ändern. ABER: Die Einstellung gilt
> zumindest immer accountweit, d.h. alle anderen parallel laufenden
> Skripte sind von der Umstellung ebenso betroffen (böse Falle!).

Was ist, wenn man setlocale() im Skript verwendet?

Ich hatte bei meiner Antwort eine Diskussion von vor etwa zwei Monaten
im Kopf, dass man sich bei Verwendung von setlocale() wieder eine
gewisse Systemabhängigkeit einfängt, da es auf unterschiedlichen
Systemen unterschiedliche Namensgebungen für dieselben Locales gibt,
bzw. ein locale nicht vorhanden sein kann.

Viele Grüße
Christoph

Re: unterschiedliches Verhalten lokal-auf Server

am 07.04.2008 12:44:03 von usenet

Christoph Bersch wrote:
> Was ist, wenn man setlocale() im Skript verwendet?

Das dürfte an Niels Aussage nichts ändern.

Gruß,
Habbo

Re: unterschiedliches Verhalten lokal-auf Server

am 07.04.2008 12:45:49 von Christoph Bersch

Jan Habbo BrŸüning schrieb:
> Christoph Bersch wrote:
>> Was ist, wenn man setlocale() im Skript verwendet?
>
> Das dürfte an Niels Aussage nichts ändern.

Da hast du wohl Recht, hatte diesen komischen roten "Note"-Kasten auf
der setlocale() Dokumentationsseite nicht gleich gesehen :-)

Viele Grüße
Christoph

Re: unterschiedliches Verhalten lokal-auf Server

am 07.04.2008 12:47:53 von Christoph Bersch

Ich mach dann mal die Ingrid:

Christoph Bersch schrieb:
> Niels Braczek schrieb:
>> Christoph Bersch schrieb:
>>
>>> Wie man das jedoch systemunabhängig lösen kann, weiß ich nicht :-(
>> Man kann das locale vorübergehend ändern. ABER: Die Einstellung gilt
>> zumindest immer accountweit, d.h. alle anderen parallel laufenden
>> Skripte sind von der Umstellung ebenso betroffen (böse Falle!).
>
> Was ist, wenn man setlocale() im Skript verwendet?

Das hat sich schon erledigt :-)

> Ich hatte bei meiner Antwort eine Diskussion von vor etwa zwei Monaten
> im Kopf, dass man sich bei Verwendung von setlocale() wieder eine
> gewisse Systemabhängigkeit einfängt, da es auf unterschiedlichen
> Systemen unterschiedliche Namensgebungen für dieselben Locales gibt,
> bzw. ein locale nicht vorhanden sein kann.

Als Ergänzung: Die Diskussion fing mit dem Beitrag
an (27. Dez)

Viele Grüße
Christoph

Re: unterschiedliches Verhalten lokal-auf Server

am 07.04.2008 14:17:21 von Micha Kuehn

Niels Braczek schrieb:
> Christoph Bersch schrieb:
>
>> Wie man das jedoch systemunabhängig lösen kann, weiß ich nicht :-(
>
> Man kann das locale vorübergehend ändern.

Bei mir scheint das jetzt mit setlocale zu funktionieren. Danke für eure
Hinweise.

> ABER: Die Einstellung gilt
> zumindest immer accountweit, d.h. alle anderen parallel laufenden
> Skripte sind von der Umstellung ebenso betroffen (böse Falle!).

Das habe ich noch nicht wirklich verstanden. Wann/wie laufen denn
mehrere PHP-Prozesse gleichzeitig?

Micha
--
Persönliche Mails: Bitte nur als reply - und als Wurmkur werden alle
Mails > 100 KB automatisch und unbesehen gelöscht!

Re: unterschiedliches Verhalten lokal-auf Server

am 07.04.2008 16:16:57 von Niels Braczek

Micha Kuehn schrieb:
> Niels Braczek schrieb:

>> ABER: Die Einstellung gilt
>> zumindest immer accountweit, d.h. alle anderen parallel laufenden
>> Skripte sind von der Umstellung ebenso betroffen (böse Falle!).
>=20
> Das habe ich noch nicht wirklich verstanden. Wann/wie laufen denn=20
> mehrere PHP-Prozesse gleichzeitig?

Es können verschiedene Seiten auf einem Server zur gleichen zeit
aufgerufen werden. Jede Seite entspricht (grob gesehen) einem Prozess.
Die locale-Einstellung aus einem einzigen Skript schlägt auf alle
anderen durch (bei denen dann wahrscheinlich irgendwas nicht
funktioniert). Solche Fehler sind sehr schwer zu debuggen. Es handelt
sich dabei IMO um einen schweren Bug in PHP.

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: unterschiedliches Verhalten lokal-auf Server

am 07.04.2008 16:44:34 von Micha Kuehn

Niels Braczek schrieb:
> Es können verschiedene Seiten auf einem Server zur gleichen zeit
> aufgerufen werden. Jede Seite entspricht (grob gesehen) einem Prozess.
> Die locale-Einstellung aus einem einzigen Skript schlägt auf alle
> anderen durch (bei denen dann wahrscheinlich irgendwas nicht
> funktioniert).

Danke, jetzt habe ich's kapiert.

> Solche Fehler sind sehr schwer zu debuggen. Es handelt
> sich dabei IMO um einen schweren Bug in PHP.

Das sehe ich auch so.

Micha
--
Persönliche Mails: Bitte nur als reply - und als Wurmkur werden alle
Mails > 100 KB automatisch und unbesehen gelöscht!

Re: unterschiedliches Verhalten lokal-auf Server

am 07.04.2008 16:51:16 von Carsten Wiedmann

Niels Braczek schrieb:
> Die locale-Einstellung aus einem einzigen Skript schlägt auf alle
> anderen durch (bei denen dann wahrscheinlich irgendwas nicht
> funktioniert). Solche Fehler sind sehr schwer zu debuggen. Es handelt
> sich dabei IMO um einen schweren Bug in PHP.

Das dürfte wohl daran liegen, dass setlocale(3) aus der LibC das nicht =

anders kann. Nur bedauerlich, dass gerade unter Windows (unter *nix hat m=
an=20
ja eher selten einen threaded Apachen), nicht die entsprechenen Funktione=
n=20
benutzt werden, um die Locale per Thread zu setzten.

BTW:
Mit Zend_Locale aus dem Zend Framework hat man dieses Problem auch nicht.=


Gruß
Carsten

Re: unterschiedliches Verhalten lokal-auf Server

am 09.04.2008 10:57:17 von Frank Arthur

>> Es können verschiedene Seiten auf einem Server zur gleichen zeit
>> aufgerufen werden. Jede Seite entspricht (grob gesehen) einem Prozess.
>> Die locale-Einstellung aus einem einzigen Skript schlägt auf alle
>> anderen durch (bei denen dann wahrscheinlich irgendwas nicht
>> funktioniert).
>
> Danke, jetzt habe ich's kapiert.

In der Dokumentation unter http://de2.php.net/manual/en/
function.setlocale.php steht, dass das problem nur unter folgender
Umgebung auftritt:
"If you are running PHP on a multithreaded server api like IIS or Apache
on Windows[...]"

Also ist die Fehlerbeschreibung hier doch zu allgemein, weil der Fehler
Leute mit Linux-Servern überhaupt nicht betrifft. Und die Windows-Leute
haben sowieso sehr viele Probleme mit besonderheiten in PHP.