[DOCKER] Führen Sie PHP-FPM mit aktiviertem OPcache in einem schreibgeschützten Container aus

Umgebung

PHP7.3opcacheDockerphp-fpm

Annahme

Methode

Mounten Sie das Volume auf / tmp, wo die Opcache-Sperrdatei erstellt wird.

docker run -d -p 9000:9000 --read-only -v $(pwd)/tmp:/tmp php:7.3-fpm-alpine3.12

Kommentar

Erklärt, warum das Volume auf / tmp gemountet ist. Für opcache ist eine Sperrdatei erforderlich, um sie im gemeinsam genutzten Speicher zwischenzuspeichern. Rufen Sie in der Funktion zend_shared_alloc_create_lock mkstemp auf, um eine Sperrdatei in / tmp zu erstellen. Wenn die Erstellung fehlschlägt, wird sie nach Ausgabe der Fehlermeldung "Sperrdatei kann nicht erstellt werden" abnormal beendet.

Funktion zum Erstellen von Dateien sperren


void zend_shared_alloc_create_lock(char *lockfile_path)
{
	int val;

#ifdef ZTS
    zts_lock = tsrm_mutex_alloc();
#endif

	snprintf(lockfile_name, sizeof(lockfile_name), "%s/%sXXXXXX", lockfile_path, SEM_FILENAME_PREFIX);
	lock_file = mkstemp(lockfile_name);
	fchmod(lock_file, 0666);

	if (lock_file == -1) {
		zend_accel_error(ACCEL_LOG_FATAL, "Unable to create lock file: %s (%d)", strerror(errno), errno);
	}
	val = fcntl(lock_file, F_GETFD, 0);
	val |= FD_CLOEXEC;
	fcntl(lock_file, F_SETFD, val);

	unlink(lockfile_name);
}

zend_shared_alloc_create_lock wird von zend_shared_alloc_startup aufgerufen und übergibt die Laufzeiteinstellung lockfile_path als Argument.

zend_shared_alloc_create_Anrufer des Schlosses


int zend_shared_alloc_startup(size_t requested_size)
{
/*Kürzung*/

#ifndef ZEND_WIN32
	zend_shared_alloc_create_lock(ZCG(accel_directives).lockfile_path);
#else
	zend_shared_alloc_create_lock();
#endif

Reference

Recommended Posts

Führen Sie PHP-FPM mit aktiviertem OPcache in einem schreibgeschützten Container aus
Lesen Sie eine Zeichenfolge in einer PDF-Datei mit Java
[Docker] Löschen Sie nur das Volume, das einem bestimmten Container zugeordnet ist
Führen Sie PureScript auf einem Docker-Container aus
Beginnen Sie mit der Installation von Docker auf EC2 und dem Ausführen von Yellowfin in einem Container
Führen Sie x11-Apps in einem Docker-Container aus (unterstützt den Netzwerkzugriff vom Container aus).
So starten Sie einen Docker-Container mit einem in einer Batchdatei bereitgestellten Volume
Führen Sie DMN mit der Camunda DMN Engine aus
Lesen Sie die xlsx-Datei in Java mit Selenium
Teilen Sie eine Zeichenfolge in Java mit ". (Dot)"
Konfigurieren Sie ein Multiprojekt mit Unterverzeichnissen in Gradle
Lassen Sie uns mit Azure Batch einen Stapel in einem Container ausführen
[Teil 1] Erstellen eines Docker-Containers, der mit Apache / Pandoc Markdown in HTML liefert