From 54831fd444684434493cb706459c9667852357aa Mon Sep 17 00:00:00 2001 From: cytopia Date: Wed, 30 Nov 2022 00:45:02 +0100 Subject: [PATCH] Adjust PHP module generation for README --- Makefile | 4 +- bin/gen-readme.sh | 259 +++-- doc/php-modules.md | 2304 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 2509 insertions(+), 58 deletions(-) create mode 100644 doc/php-modules.md diff --git a/Makefile b/Makefile index c807fa0..ddf9dbe 100644 --- a/Makefile +++ b/Makefile @@ -185,6 +185,7 @@ manifest-push: docker-manifest-push test: check-stage-is-set test: check-current-image-exists test: test-integration +test: gen-readme .PHONY: test-integration test-integration: @@ -200,11 +201,12 @@ test-integration: ### .PHONY: gen-readme gen-readme: check-version-is-set +gen-readme: check-stage-is-set gen-readme: @echo "################################################################################" @echo "# Generate README.md for PHP $(VERSION) ($(IMAGE):$(DOCKER_TAG)) on $(ARCH)" @echo "################################################################################" - ./bin/gen-readme.sh $(IMAGE) $(ARCH) $(BASE_TAG) $(MODS_TAG) $(VERSION) + ./bin/gen-readme.sh $(IMAGE) $(ARCH) $(STAGE) $(VERSION) git diff --quiet || { echo "Build Changes"; git diff; git status; false; } ### diff --git a/bin/gen-readme.sh b/bin/gen-readme.sh index 29abd81..cb7207d 100755 --- a/bin/gen-readme.sh +++ b/bin/gen-readme.sh @@ -6,98 +6,243 @@ set -u set -o pipefail # Get absolute directory of this script -CWD="$(cd -P -- "$(dirname -- "$0")" && pwd -P)" +SCRIPT_PATH="$(cd -P -- "$(dirname -- "$0")" && pwd -P)" +SCRIPT_NAME="$(basename "${SCRIPT_PATH}")" +REPO_PATH="${SCRIPT_PATH}/.." +README="${REPO_PATH}/doc/php-modules.md" -IMAGE="${1}" -ARCH="${2}" -TAG_BASE="${3}" -TAG_MODS="${4}" -VERSION="${5:-}" +#-------------------------------------------------------------------------------------------------- +# Evaluate given cli arguments +#-------------------------------------------------------------------------------------------------- ### ### Show Usage ### print_usage() { - echo "Usage: gen-readme.sh []" + echo "Usage: ${SCRIPT_NAME} []" +} + +if [ "${#}" -lt "3" ]; then + print_usage + exit 1 +fi + +IMAGE="${1}" +ARCH="${2}" +STAGE="${3}" +VERSION="${4:-}" + +if [ "${STAGE}" != "base" ] && [ "${STAGE}" != "mods" ]; then + echo "[SKIP]: Skipping for STAGE: ${STAGE} (only 'base' and 'mods' supported" + exit 0 +fi + + +#-------------------------------------------------------------------------------------------------- +# Module functions +#-------------------------------------------------------------------------------------------------- + +### +### Get all modules defined in README +### +get_modules_from_readme() { + local php_version="${1}" # PHP version + local modules + modules="$( \ + grep -Eo "ext_${STAGE}_.+_${php_version}" "${README}" \ + | sed "s/^ext_${STAGE}_//g" \ + | sed "s/_${php_version}//g" \ + )" + echo "${modules}" | sort -fu } ### -### Extract PHP modules in alphabetical order and comma separated in one line +### Get modules available in PHP image ### -get_modules() { - current_tag="${1}" - # Retrieve all modules - PHP_MODULES="$( docker run --rm --platform "${ARCH}" "$(tty -s && echo '-it' || echo)" --entrypoint=php "${IMAGE}:${current_tag}" -m )" - ALL_MODULES= +get_modules_from_image() { + local php_version="${1}" + local img_tag="${2}" + local modules - if docker run --rm --platform "${ARCH}" "$(tty -s && echo '-it' || echo)" --entrypoint=find "${IMAGE}:${current_tag}" /usr/local/lib/php/extensions -name 'ioncube.so' | grep -q ioncube.so; then - ALL_MODULES="${ALL_MODULES},ioncube"; + modules="$( \ + docker run --rm "$(tty -s && echo '-it' || echo)" --platform "${ARCH}" --entrypoint=php "${IMAGE}:${img_tag}" -m \ + | sed 's/Zend //g' \ + | sed 's/xdebug/Xdebug/g' \ + | sed 's/Core//g' \ + | sed 's/standard//g' \ + | grep -E '^[a-zA-Z]' \ + | sort -fu \ + )" + + # Get modules which might be disabled + if docker run --rm --platform "${ARCH}" "$(tty -s && echo '-it' || echo)" --entrypoint=find "${IMAGE}:${img_tag}" /usr/local/lib/php/extensions -name 'ioncube.so' | grep -q ioncube.so; then + modules="$( printf "%s\n%s\n" "${modules}" "ioncube" )"; fi - if docker run --rm --platform "${ARCH}" "$(tty -s && echo '-it' || echo)" --entrypoint=find "${IMAGE}:${current_tag}" /usr/local/lib/php/extensions -name 'blackfire.so' | grep -q blackfire.so; then - ALL_MODULES="${ALL_MODULES},blackfire"; + if docker run --rm --platform "${ARCH}" "$(tty -s && echo '-it' || echo)" --entrypoint=find "${IMAGE}:${img_tag}" /usr/local/lib/php/extensions -name 'blackfire.so' | grep -q blackfire.so; then + modules="$( printf "%s\n%s\n" "${modules}" "blackfire" )"; fi - if docker run --rm --platform "${ARCH}" "$(tty -s && echo '-it' || echo)" --entrypoint=find "${IMAGE}:${current_tag}" /usr/local/lib/php/extensions -name 'psr.so' | grep -q psr.so; then - ALL_MODULES="${ALL_MODULES},psr"; + if docker run --rm --platform "${ARCH}" "$(tty -s && echo '-it' || echo)" --entrypoint=find "${IMAGE}:${img_tag}" /usr/local/lib/php/extensions -name 'psr.so' | grep -q psr.so; then + modules="$( printf "%s\n%s\n" "${modules}" "psr" )"; fi - if docker run --rm --platform "${ARCH}" "$(tty -s && echo '-it' || echo)" --entrypoint=find "${IMAGE}:${current_tag}" /usr/local/lib/php/extensions -name 'phalcon.so' | grep -q phalcon.so; then - ALL_MODULES="${ALL_MODULES},phalcon"; + if docker run --rm --platform "${ARCH}" "$(tty -s && echo '-it' || echo)" --entrypoint=find "${IMAGE}:${img_tag}" /usr/local/lib/php/extensions -name 'phalcon.so' | grep -q phalcon.so; then + modules="$( printf "%s\n%s\n" "${modules}" "phalcon" )"; fi - # Process module string into correct format for README.md - PHP_MODULES="$( echo "${PHP_MODULES}" | sed 's/^\[.*//g' )" # Remove PHP Modules headlines - PHP_MODULES="${ALL_MODULES}${PHP_MODULES}" # Append all available modules - PHP_MODULES="$( echo "${PHP_MODULES}" | sort -fu )" # Unique - PHP_MODULES="$( echo "${PHP_MODULES}" | sed '/^\s*$/d' )" # Remove empty lines - PHP_MODULES="$( echo "${PHP_MODULES}" | tr '\r\n' ',' )" # Newlines to commas - PHP_MODULES="$( echo "${PHP_MODULES}" | tr '\n' ',' )" # Newlines to commas - PHP_MODULES="$( echo "${PHP_MODULES}" | tr '\r' ',' )" # Newlines to commas - PHP_MODULES="$( echo "${PHP_MODULES}" | sed 's/^M/,/g' )" # Newlines to commas - PHP_MODULES="$( echo "${PHP_MODULES}" | sed 's/,,/,/g' )" # Remove PHP Modules headlines - PHP_MODULES="$( echo "${PHP_MODULES}" | sed 's/,/\n/g' )" # Back to newlines - PHP_MODULES="$( echo "${PHP_MODULES}" | sort -fu )" # Unique - PHP_MODULES="$( echo "${PHP_MODULES}" | sed '/^\s*$/d' )" # Remove empty lines - PHP_MODULES="$( echo "${PHP_MODULES}" | tr '\n' ',' )" # Newlines to commas - PHP_MODULES="$( echo "${PHP_MODULES}" | sed 's/,$//g' )" # Remove trailing comma - PHP_MODULES="$( echo "${PHP_MODULES}" | sed 's/,/, /g' )" # Add space to comma + # Sort alphabetically + modules="$( echo "${modules}" | sort -fu )" - echo "${PHP_MODULES}" + # Remove weired line endings + while read -r line; do + echo "${line}" | tr -d '\r' | tr -d '\n' + echo + done < <(echo "${modules}") } ### -### Replace modules in Readme for specified PHP version +### Validate that README.md has all modules defined that are found in the PHP docker image +### +validate_readme() { + local php_version="${1}" + local modules_img="${2}" # Modules found in the PHP docker image + local stage="${3}" # base or mods + + # Check if README.md contains all modules we have retrieved from the PHP image + while read -r line; do + module="$( echo "${line}" | tr '[:upper:]' '[:lower:]' )" + search="ext_${stage}_${module}_${php_version}" + if ! grep -q "${search}" "${README}"; then + echo "[ERROR] Module: '${module}' not present in ${README} for PHP ${php_version}, STAGE: ${stage}" + echo "grep -q \"${search}\" \"${README}\"" + exit 1 + fi + done < <(echo "${modules_img}") +} + + +### +### Update README.md for a specific PHP version ### update_readme() { - v="${1}" - # Those sections must exist in README.md, otherwise this script will exit with errors - sed -i'' "s|.*<\/td>|$( get_modules "${TAG_BASE}" )<\/td>|g" "${CWD}/../README.md" - sed -i'' "s|.*<\/td>|$( get_modules "${TAG_MODS}" )<\/td>|g" "${CWD}/../README.md" + local php_version="${1}" + local modules_image="${2}" + local modules_avail="${3}" + local stage="${4}" # base or mods + + while read -r line_avail; do + module_avail="$( echo "${line_avail}" | tr '[:upper:]' '[:lower:]' )" + + avail=0 + while read -r line_image; do + module_image="$( echo "${line_image}" | tr '[:upper:]' '[:lower:]' )" + if [ "${module_image}" = "${module_avail}" ]; then + avail=1 + break + fi + done < <(echo "${modules_image}") + + if [ "${avail}" = "1" ]; then + sed -i "s|\(\)\(.*\)\(<\/sup><\/td>\)|\1🗸\3|g" "${README}" + echo "[YES] [${stage}] PHP ${php_version}, mod: '${module_avail}'" + else + sed -i "s|\(\)\(.*\)\(<\/sup><\/td>\)|\1\3|g" "${README}" + echo "[NO] [${stage}] PHP ${php_version}, mod: '${module_avail}'" + fi + done < <(echo "${modules_avail}") } +# The following commented code is used to generate the README initially +#echo "" +#echo " " +#echo " " +#echo " " +#echo " " +#echo " " +#echo " " +#echo " " +#echo " " +#echo " " +#echo " " +#echo " " +#echo " " +#echo " " +#echo " " +#echo " " +#echo " " +# +#while read -r line; do +# MOD_NAME="$( echo "${line}" )" +# MOD_LOWER="$( echo "${MOD_NAME}" | tr '[:upper:]' '[:lower:]' )" +# echo " " +# echo " " +# echo " " +# echo " " +# echo " " +# echo " " +# echo " " +# echo " " +# echo " " +# echo " " +# echo " " +# echo " " +# echo " " +# echo " " +# echo " " +# echo " " +#done < <(echo "${MODS_IMAGE}") +#echo "
ExtPHP 5.2PHP 5.3PHP 5.4PHP 5.5PHP 5.6PHP 7.0PHP 7.1PHP 7.2PHP 7.3PHP 7.4PHP 8.0PHP 8.1PHP 8.2
${MOD_NAME}🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
" +#exit + + +#-------------------------------------------------------------------------------------------------- +# Main functions +#-------------------------------------------------------------------------------------------------- + +### +### Replace module available in README for a specific PHP version +### +update() { + local php_version="${1}" + local mods_in_readme + local mods_in_image + + mods_in_readme="$( get_modules_from_readme "${php_version}" )" + + mods_in_image="$( get_modules_from_image "${php_version}" "${php_version}-${STAGE}" )" + + validate_readme "${php_version}" "${mods_in_image}" "${STAGE}" + update_readme "${php_version}" "${mods_in_image}" "${mods_in_readme}" "${STAGE}" +} + + +#-------------------------------------------------------------------------------------------------- +# Entrypoint +#-------------------------------------------------------------------------------------------------- + ### ### Entrypoint ### if [ "${VERSION}" = "" ]; then # Update PHP modules for all versions at once - update_readme "5.2" - update_readme "5.3" - update_readme "5.4" - update_readme "5.5" - update_readme "5.6" - update_readme "7.0" - update_readme "7.1" - update_readme "7.2" - update_readme "7.3" - update_readme "7.4" - update_readme "8.0" - update_readme "8.1" - update_readme "8.2" + update "5.2" + update "5.3" + update "5.4" + update "5.5" + update "5.6" + update "7.0" + update "7.1" + update "7.2" + update "7.3" + update "7.4" + update "8.0" + update "8.1" + update "8.2" else if [ "${VERSION}" != "5.2" ] \ && [ "${VERSION}" != "5.3" ] \ @@ -118,6 +263,6 @@ else exit 1 else # Update PHP modules for one specific PHP version - update_readme "${VERSION}" + update "${VERSION}" fi fi diff --git a/doc/php-modules.md b/doc/php-modules.md new file mode 100644 index 0000000..c1c38bb --- /dev/null +++ b/doc/php-modules.md @@ -0,0 +1,2304 @@ +[Permissions](syncronize-file-permissions.md) | +[Tags](docker-tags.md) | +[Architectures](supported-architectures.md) | +[Versions](php-versions.md) | +[Flavours](flavours.md) | +Extensions | +[Tools](available-tools.md) | +[Env Vars](docker-env-variables.md) | +[Volumes](docker-volumes.md) | +[Base Images](base-images.md) + +--- + +

Documentation

+ + + +#### PHP Modules (`base`) + +The following PHP modules are available on the `base` flavour: + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ExtPHP 5.2PHP 5.3PHP 5.4PHP 5.5PHP 5.6PHP 7.0PHP 7.1PHP 7.2PHP 7.3PHP 7.4PHP 8.0PHP 8.1PHP 8.2
ctype🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
curl🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
date🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
dom🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
ereg🗸🗸🗸🗸
FFI🗸🗸🗸
fileinfo🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
filter🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
ftp🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
hash🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
iconv🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
json🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
libxml🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
mbstring🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
mhash🗸🗸🗸🗸🗸
mysqlnd🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
openssl🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
pcre🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
PDO🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
pdo_sqlite🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
Phar🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
posix🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
random🗸
readline🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
recode🗸🗸🗸🗸
Reflection🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
session🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
SimpleXML🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
sodium🗸🗸🗸🗸🗸🗸
SPL🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
sqlite🗸🗸
sqlite3🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
tokenizer🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
xml🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
xmlreader🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
xmlwriter🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
zlib🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
+ + + +#### PHP Modules (`mods`, `prod` and `work`) + +The following PHP modules are available on the `mods`, `prod` and `work` flavour: + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ExtPHP 5.2PHP 5.3PHP 5.4PHP 5.5PHP 5.6PHP 7.0PHP 7.1PHP 7.2PHP 7.3PHP 7.4PHP 8.0PHP 8.1PHP 8.2
amqp🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
apc🗸🗸🗸🗸
apcu🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
bcmath🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
blackfire🗸🗸🗸🗸🗸🗸
bz2🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
calendar🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
ctype🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
curl🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
date🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
dba🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
dom🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
enchant🗸🗸🗸🗸🗸🗸🗸🗸🗸
ereg🗸🗸🗸🗸
exif🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
FFI🗸🗸🗸🗸
fileinfo🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
filter🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
ftp🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
gd🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
gettext🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
gmp🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
hash🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
iconv🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
igbinary🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
imagick🗸🗸🗸🗸🗸🗸🗸🗸
imap🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
interbase🗸🗸🗸🗸🗸🗸🗸🗸🗸
intl🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
ioncube🗸🗸🗸🗸🗸🗸🗸
json🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
ldap🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
libxml🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
mbstring🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
mcrypt🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
memcache🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
memcached🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
mhash🗸🗸🗸🗸🗸
mongo🗸🗸🗸🗸🗸
mongodb🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
msgpack🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
mysql🗸🗸🗸🗸🗸
mysqli🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
mysqlnd🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
OAuth🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
oci8🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
OPcache🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
openssl🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
pcntl🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
pcre🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
PDO🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
pdo_dblib🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
PDO_Firebird🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
pdo_mysql🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
PDO_OCI🗸🗸🗸🗸🗸🗸
pdo_pgsql🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
pdo_sqlite🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
pdo_sqlsrv🗸🗸🗸🗸🗸🗸
pgsql🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
phalcon🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
Phar🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
posix🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
pspell🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
psr🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
random🗸
rdkafka🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
readline🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
recode🗸🗸🗸🗸🗸🗸🗸🗸🗸
redis🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
Reflection🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
session🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
shmop🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
SimpleXML🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
snmp🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
soap🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
sockets🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
sodium🗸🗸🗸🗸🗸🗸
solr🗸🗸🗸🗸🗸
SPL🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
sqlite🗸🗸
sqlite3🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
sqlsrv🗸🗸🗸🗸🗸🗸
ssh2🗸🗸🗸🗸🗸
swoole🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
sysvmsg🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
sysvsem🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
sysvshm🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
tidy🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
tokenizer🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
uploadprogress🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
uuid🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
wddx🗸🗸🗸🗸🗸🗸🗸🗸🗸
vips🗸🗸🗸🗸🗸🗸
Xdebug🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
xlswriter🗸🗸🗸🗸🗸🗸
xml🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
xmlreader🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
xmlrpc🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
xmlwriter🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
xsl🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
yaml🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
zip🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸
zlib🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸🗸