ZendOptimizer.so erzeugt im Apache2 “seg fault or similar nasty error detected in the parent process”

fehlt wasgeht sogutsehr guthat geholfen (No Ratings Yet)
Loading ... Loading ...
Werbung




Wer den ZendOptimizer einsetzt, kann unter Umständen morgens vor einem nicht mehr funktionierenden Apache2 sitzen.
Durch den logrotate Prozess wird dieser wohl so gar überlastet, dass er sich einfach beendet.
In der /var/log/apache2/error.log findet man dann noch Einträge wie diese:

[notice] child pid 13341 exit signal Segmentation fault (11)
[notice] child pid 18991 exit signal Segmentation fault (11)
[notice] Graceful restart requested, doing restart
[notice] seg fault or similar nasty error detected in the parent process

Nach etwas Suchen findet man auf der Zend Seite einen Fix für diesen Fehler.
Dieser wird wie folgt eingebaut:

Erzeugen Sie eine neue Datei:
{code type=php}# vi /usr/local/lib/ZendOptimizerFix.c[/html]
und kopieren folgenden Code hinein:

 /* Cheesy hack to work around ZendOptimizer.so unloading itself
* with dlclose. Use at own risk Walter Doekes, 2009.
* Compile: gcc -Wall -D_GNU_SOURCE -fPIC -ldl -shared -o \
* ZendOptimizerFix.so ZendOptimizerFix.c
* Append: export LD_PRELOAD=/path/to/ZendOptimizerFix.so
* to /etc/apache2/envvars. */
#include
#include #include
static void *zendopt = NULL;
static void *(*real_dlopen)(char const*, int) = NULL;
static int (*real_dlclose)(void*) = NULL;
__attribute__((constructor)) void init() {
real_dlopen = dlsym(RTLD_NEXT, "dlopen");
real_dlclose = dlsym(RTLD_NEXT, "dlclose");
}
void *dlopen(char const *filename, int flag) {
if (real_dlopen) {
void *handle = real_dlopen(filename, flag);
if (handle != NULL && strstr(filename, "ZendOptimizer.so")
!= NULL) {
assert(zendopt == NULL || zendopt == handle);
zendopt = handle;
}
return handle;
}
return 0;
}
int dlclose(void *handle) {
if (real_dlclose) {
if (handle == zendopt) {
/* Don't unload on the first call */
zendopt = NULL;
return 0;
} else {
return real_dlclose(handle);
}
}
return -1;
}

Kompilieren mit:

# gcc -Wall -D_GNU_SOURCE -fPIC -ldl -shared -o /usr/local/lib/ZendOptimizerFix.so /usr/local/lib/ZendOptimizerFix.c

Zuletzt muss der Aufruf noch in Apache bekannt werden, dazu in der Datei:

/etc/apache2/envvars

Die Zeile

export LD_PRELOAD=/usr/local/lib/ZendOptimizerFix.so

Nun den Apache neu starten und die Logs beobachten:

Quelle: http://forums.zend.com/viewtopic.php



Werbung


Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *


*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>