Docker php ext install redis

Докеризируем Socket.io, redis и php

Для передачи данных сервером на php клиенту можно использовать следующий алгоритм:

  1. Сервер php публикует данные в канал redis.
  2. Сервер node подписывается на события в соответствующем канале redis и при
    наступлении события поступления данных публикует эти данные уже в
    socket.io
  3. Клиент подписывается на сообщения socket.io и обрабатывает их при поступлении

Исходный код проекта можно найти на github

Здесь я буду двигаться очень маленькими шагами.
В проекте будет использоваться связка nginx и php-fpm и начну я с настройки
nginx.

Настройка nginx

Начнем создавать docker-compose.yml в корневой папке нашего проекта.

# docker-compose.yml version: '3' services: nginx: image: nginx ports: - 4400:80

Откроем в браузере: http://localhost:4400 и увидим стандартное приветствие
nginx.
Теперь настроим, чтобы nginx отдавал статическое содержимое папки
./www/public .
Сначала создадим папки

Создадим файл ./www/pulbic/index.html

Создадим файл конфигурации nginx — nginx/conf/custom.conf . Для начала
скопируем стандартный /etc/nginx/conf.d/default.conf .
Изменим docker-compose.yml

 services: nginx: image: nginx + volumes: + - ./nginx/conf/custom.conf:/etc/nginx/conf.d/default.conf ports: - 4400:80

Пересоздадим контейнер nginx

И вновь наблюдаем по в браузере по адресу http://localhost:4400 стандартное
приветствие nginx.
Внесем изменения
docker-compose.yml

 image: nginx volumes: - ./nginx/conf/custom.conf:/etc/nginx/conf.d/default.conf + - ./www:/www ports: - 4400:80
 #access_log /var/log/nginx/host.access.log main; location / < - root /usr/share/nginx/html; + root /www/public; index index.html index.htm; >

Теперь по адресу http://localhost:4400 отображается ‘Hello World!’ из файла
www/public/index.html .
Прорывом это назвать сложно, но мы определенно двигаемся в нужном направлении.

Настройка php

Начнем с создания папок для хранения файлов настроек контейнера.

Далее создадим php/Dockerfile

FROM php:7-fpm RUN apt-get -qq update && apt-get -qq install \ curl \ > /dev/null ENV PHPREDIS_VERSION 3.0.0 RUN mkdir -p /usr/src/php/ext/redis \ && curl -L https://github.com/phpredis/phpredis/archive/$PHPREDIS_VERSION.tar.gz | tar xvz -C /usr/src/php/ext/redis --strip 1 \ && echo 'redis' >> /usr/src/php-available-exts \ && docker-php-ext-install redis

И внесем изменения в docker-compose.yml

 - ./www:/www ports: - 4400:80 + php: + build: ./php + volumes: + - ./www:/www + environment: + - REDIS_PASSWORD=$

Также нам нужно внести изменения в настройки nginx, чтобы файлы с расширением
.php обрабатывались php-fpm .
Изменим файл nginx/conf/custom.conf следующим образом

 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # -#location ~ \.php$ < -# root html; -# fastcgi_pass 127.0.0.1:9000; -# fastcgi_index index.php; -# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; -# include fastcgi_params; -#>+location ~ \.php$ < + root /www; + fastcgi_pass php:9000; + fastcgi_index index.php; + fastcgi_param REQUEST_METHOD $request_method; + fastcgi_param CONTENT_TYPE $content_type; + fastcgi_param CONTENT_LENGTH $content_length; + fastcgi_param SCRIPT_FILENAME /www/public/$fastcgi_script_name; + include fastcgi_params; +>

Осталось создать файл www/public/info.php со следующим кодом

Перезапустим наш контейнер

И теперь по адресу http://localhost:4400/info.php отображается информация о
настройках php.
Еще немного поэкспериментируем и создадим файл www/Test.php

А содержимое файла www/public/info.php заменим на следующее:

Теперь по адресу http://localhost:4400/info.php отображается ‘success’, а это
означает, что php-fpm доступны скрипты расположенные в папке www , а через
браузер они недоступны. Т.е. мы продолжаем двигаться в нужном направлении.

Настройка redis

Это, пожалуй, самая короткая часть.
Redis в этом проекте не будет доступен из внешней сети, но защиту паролем
настроим.
Для этого создадим файл .env

Внесем изменения в docker-compose.yml

 build: ./php volumes: - ./www:/www + redis: + image: redis + command: ["sh", "-c", "exec redis-server --requirepass \"$\""]

Чтобы протестировать подключение к redis изменим файл www/public/info.php

connect( 'redis', 6379 ); // авторизуемся. 'eustatos' - пароль, который мы задали в файле `.env` $redis->auth($_ENV['REDIS_PASSWORD']); // публикуем сообщение в канале 'eustatos' $redis->publish( 'eustatos', json_encode([ 'test' => 'success' ]) ); // закрываем соединение $redis->close();

Теперь подключимся к серверу redis

docker-compose exec redis bash

Перейдем к командной строке. ‘eustatos’ — пароль, который мы ранее задали в
файле .env

Подпишемся на канал ‘eustatos’ (название произвольное, чтобы все работало,
долно совпадать с названием канала, которое мы определили в файле
www/public/info.php )

После всех этих приготовлений, переходим в браузере по адресу
http://localhost:4400/info.php и наблюдаем, как в терминале, где мы
подключались к redis появляются примерно следующие строки:

Значит мы стали еще ближе к нашей цели.

Настройка socket.io

Созадим папку, где будут лежать файлы нашего socket.io сервера

Внесем изменения в docker-compose.yml

 redis: image: redis command: ["sh", "-c", "exec redis-server --requirepass \"$\""] + socket: + image: node + user: "node" + volumes: + - ./socket:/home/node/app + ports: + - 5000:5000 + working_dir: /home/node/app + command: "npm start"

Установим необходимые пакеты

npm init -y npm i -S socket.io redis express

После этого добавим в файл socket/package.json строки

< "name": "socket-php-example", "version": "1.0.0", "main": "index.js", "author": "eustatos ", "license": "MIT", + "scripts": < + "start": "node index.js" + >, "dependencies": < "express": "^4.16.3", "redis": "^2.8.0", "socket.io": "^2.1.0" >>

Создадим файл socket/index.js

const express = require('express'); const app = express(); const http = require('http').Server(app); const port = process.env.PORT || 5000; app.get( '/', function(req, res, next) < res.send('success'); >); http.listen( port, function() < console.log('Listen at ' + port); >);

Перезапустим наш контейнер

После этого в браузере по адресу http://localhost:5000 отображается «success».
Значит мы еще чуть ближе к нашей цели. Осталось совсем немного.
Изменим файл socket/index.js

const express = require('express'); const app = express(); const http = require('http').Server(app); const io = require('socket.io')(http); // подключаемся к redis const subscriber = require('redis').createClient(< host: 'redis', port: 6379, password: 'eustatos' >); // подписываемся на изменения в каналах redis subscriber.on('message', function(channel, message) < // пересылаем сообщение из канала redis в комнату socket.io io.emit('eustatosRoom', message); >); // открываем соединение socket.io io.on('connection', function(socket)< // подписываемся на канал redis 'eustatos' в callback subscriber.subscribe('eustatos'); >); const port = process.env.PORT || 5000; http.listen( port, function() < console.log('Listen at ' + port); >);

На этом настройка контейнера socket.io завершена.

Настройка клиентского приложения

Клиентское приложение можно развернуть в любом из наших контейнеров, но
для чистоты эксперимента развернем его в отдельном контейнере.
Файлы клиентского приложения разместим в папке client

Создадим файл client/index.html

       
 ports: - 5000:5000 command: "npm start" + client: + image: nginx + volumes: + - ./client:/usr/share/nginx/html + ports: + - 8000:80

Перезапустим наш контейнер

Откроем сначала в браузере http://localhost:8000 . Для демонстрации результата
наших трудов нужно открыть панель разработчика.
Пока ничего не отображается.
Откроем в другой вкладке или окне адрес http://localhost:4400/info.php и посмотри на консоль панели разработчика нашего клиента. Мы должны увидеть:

А это значит, что наш сервер благополучно передал клиентскому приложению данные.

Источник

How to install php-redis extension using the official php docker image approach?

The Redis extension is used to interact with Redis databases from PHP. Installing this extension on the official PHP Docker image is a common requirement for PHP applications that use Redis for data storage or caching. There are several methods for installing the PHP Redis extension using the official PHP Docker image approach.

Method 1: Installing PHP Redis Extension using Dockerfile

To install the PHP Redis extension using the official PHP Docker image approach, you can use the following steps:

FROM php:7.4 RUN pecl install redis && docker-php-ext-enable redis
docker run -it --rm --name my-running-app my-php-app
docker exec my-running-app php -m | grep redis

This Dockerfile uses the official PHP Docker image as a base and installs the Redis extension using the pecl command. The docker-php-ext-enable command enables the extension in the PHP configuration.

After building and running the Docker container, you can verify that the Redis extension is installed by running the php -m command inside the container and searching for the redis module.

Note that you can customize the Dockerfile to use a different PHP version or Redis extension version by changing the php:7.4 and pecl install redis lines, respectively.

Method 2: Installing PHP Redis Extension using a Script in Dockerfile

To install the PHP Redis extension using the official PHP Docker image approach, you can use a script in your Dockerfile. Here are the steps to follow:

FROM php:7.4-cli RUN apt-get update && \ apt-get install -y \ git \ unzip \ && pecl install redis \ && docker-php-ext-enable redis
  1. In the Dockerfile, we are using the official PHP Docker image with version 7.4-cli as the base image.
  2. We then update the package list and install the necessary packages, including Git and Unzip.
  3. Next, we install the Redis extension using the pecl command, which is a package manager for PHP extensions.
  4. Finally, we enable the Redis extension using the docker-php-ext-enable command.
  5. Build the Docker image using the following command:
docker run -it --rm my-php-app php -m

This command will list all the installed PHP modules, including the Redis extension.

That’s it! You have successfully installed the PHP Redis extension using the official PHP Docker image approach with a script in the Dockerfile.

Method 3: Installing PHP Redis Extension using a Custom Image

To install the PHP Redis extension using a custom image, follow the below steps:

FROM php:7.4 RUN pecl install redis \ && docker-php-ext-enable redis
docker build -t my-php-redis-image .
docker run -it --rm --name my-php-app \ -v "$PWD":/var/www/html \ -w /var/www/html \ my-php-redis-image \ php index.php
  1. Verify that the PHP Redis extension is installed by running the following command inside the container:
docker exec -it my-php-app php -m | grep redis

This should output redis which means that the PHP Redis extension is installed and enabled.

That’s it! You have successfully installed the PHP Redis extension using a custom Docker image.

Источник

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add redis to installable extensions #263

Add redis to installable extensions #263

Comments

Related to #262, I often want to install the very popular Redis client for PHP. This isn’t trivial on Alpine Linux. If you could please support it, it’d help greatly.

The text was updated successfully, but these errors were encountered:

Hi @wernight redis is not shipped within php source code so, you should just follow explained steps in #262 (comment).

Could there be a place for people to include ways to install common extensions, or some docker-php-ext-install run a script that does the install?

See #75 (comment), which describes how I determine what’s necessary to install extensions (and really compiled software in general).

Given that redis is not a built-in extension (as noted above), there’s nothing for us to do here. Installing redis from PECL is the appropriate solution. 👍

apk add —update —no-cache autoconf g++ make
adds extra 200Mb to the 179Mb alpine package so I prefere to install it from source

ENV REDIS_VERSION 4.0.2 RUN curl -L -o /tmp/redis.tar.gz https://github.com/phpredis/phpredis/archive/$REDIS_VERSION.tar.gz \ && tar xfz /tmp/redis.tar.gz \ && rm -r /tmp/redis.tar.gz \ && mkdir -p /usr/src/php/ext \ && mv phpredis-* /usr/src/php/ext/redis RUN docker-php-ext-install redis 

(last command purges all runtime packages after installation)
inspired by #77

Источник

Читайте также:  Java play for android
Оцените статью