#!/bin/bash
cpuInfo=$(getconf _NPROCESSORS_ONLN)
ext_list=${1}

function compared_php_version() {
    if [[ -z "$1" || -z "$2" ]]; then
        echo "请传入正确的版本号"
        return 1
    fi

    local PHP_MAJOR_VERSION
    local PHP_MINOR_VERSION

    PHP_MAJOR_VERSION=$(php -r "echo PHP_MAJOR_VERSION;")
    PHP_MINOR_VERSION=$(php -r "echo PHP_MINOR_VERSION;")

    if [[ -z "$PHP_MAJOR_VERSION" || -z "$PHP_MINOR_VERSION" ]]; then
        echo "获取PHP版本失败"
        return 1
    fi

    if [[ "$PHP_MAJOR_VERSION" -gt "$1" ]]; then
        return 1
    fi

    if [[ "$PHP_MAJOR_VERSION" -eq "$1" && "$PHP_MINOR_VERSION" -ge "$2" ]]; then
        return 1
    fi

    return 0
}

function local_install_ext() {
    package_name=$1
    tar -xf ${package_name}.tgz
    cd ${package_name} || exit
    phpize
    ./configure
    make ${make_j}
    make install
    cd ..
    rm -rf ${package_name}*
    ext_name=$(echo ${package_name} | awk -F '-' '{print $1}')

    docker-php-ext-enable ${ext_name}
}

# 2024/10/25 14:36 使用docker-php-ext-install安装
function gd() {
    compared_php_version 8 0
    if [[ $? -eq 1 ]]; then
        options="--with-freetype --with-jpeg --with-webp"
    else
        options="--with-gd --with-freetype-dir=/usr/include/ --with-png-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-webp-dir=/usr/include/"
    fi

    apk add --no-cache freetype freetype-dev libpng libpng-dev libjpeg-turbo libjpeg-turbo-dev libwebp-dev
    docker-php-ext-configure gd ${options}
    docker-php-ext-install ${make_j} gd

}

function zmq() {
    apk add --no-cache zeromq zeromq-dev
    pecl install zmq-beta
    docker-php-ext-enable zmq
}

function pcntl() {
    docker-php-ext-install ${make_j} pcntl
}

function ldap() {
    apk add --no-cache ldb-dev openldap-dev
    docker-php-ext-install ${make_j} ldap
}

function pdo_mysql() {
    docker-php-ext-install ${make_j} pdo_mysql
}

function mysqli() {
    docker-php-ext-install ${make_j} mysqli
}

function mysql() {
    docker-php-ext-install ${make_j} mysql
}

function exif() {
    docker-php-ext-install ${make_j} exif
}

function bcmath() {
    docker-php-ext-install ${make_j} bcmath
}

function bz2() {
    apk add --no-cache bzip2-dev
    docker-php-ext-install ${make_j} bz2
}

function calendar() {
    docker-php-ext-install ${make_j} calendar
}

function opcache() {
    docker-php-ext-install ${make_j} opcache
}

function sockets() {
    docker-php-ext-install ${make_j} sockets
}

function gettext() {
    apk add --no-cache gettext-dev
    docker-php-ext-install ${make_j} gettext
}

function shmop() {
    docker-php-ext-install ${make_j} shmop
}

function sysvmsg() {
    docker-php-ext-install ${make_j} sysvmsg
}

function sysvsem() {
    docker-php-ext-install ${make_j} sysvsem
}

function sysvshm() {
    docker-php-ext-install ${make_j} sysvshm
}

function pdo_firebird() {
    #    apk add --no-cache firebird-dev
    docker-php-ext-install ${make_j} pdo_firebird
}

function pdo_dblib() {
    #    apk add --no-cache freetds-dev
    docker-php-ext-install ${make_j} pdo_dblib
}

function pdo_odbc() {
    #    apk add --no-cache unixodbc-dev
    docker-php-ext-install ${make_j} pdo_odbc
}

function pdo_pgsql() {
    apk add --no-cache postgresql-dev
    docker-php-ext-install ${make_j} pdo_pgsql
}

function odbc() {
    #    apk add --no-cache unixodbc-dev
    docker-php-ext-install ${make_j} odbc
}

function dba() {
    #    apk add --no-cache gdbm-dev
    docker-php-ext-install ${make_j} dba
}

function zip() {
    apk add --no-cache libzip-dev
    compared_php_version 8 0
    if [[ $? -ne 1 ]]; then
        docker-php-ext-configure zip --with-libzip=/usr/include
    fi
    docker-php-ext-install ${make_j} zip
}

function intl() {
    apk add --no-cache icu-dev
    docker-php-ext-install ${make_j} intl
}

function soap() {
    apk add --no-cache libxml2-dev
    docker-php-ext-install ${make_j} soap
}

function xsl() {
    apk add --no-cache libxml2-dev libxslt-dev
    docker-php-ext-install ${make_j} xsl
}

function wddx() {
    apk add --no-cache libxml2-dev libxslt-dev
    docker-php-ext-install ${make_j} wddx
}

function readline() {
    apk add --no-cache readline-dev libedit-dev
    docker-php-ext-install ${make_j} readline
}

function snmp() {
    apk add --no-cache net-snmp-dev
    docker-php-ext-install ${make_j} snmp
}

function pspell() {
    apk add --no-cache aspell-dev aspell-en
    docker-php-ext-install ${make_j} pspell
}

function recode() {
    apk add --no-cache recode-dev
    docker-php-ext-install ${make_j} recode
}

function tidy() {
    apk add --no-cache tidyhtml-dev
    ln -s /usr/include/tidybuffio.h /usr/include/buffio.h
    docker-php-ext-install ${make_j} tidy
}

function gmp() {
    apk add --no-cache gmp-dev
    docker-php-ext-install ${make_j} gmp
}

function imap() {
    apk add --no-cache imap-dev
    docker-php-ext-configure imap --with-imap --with-imap-ssl
    docker-php-ext-install ${make_j} imap
}

function sodium() {
    compared_php_version 8 0
    if [[ $? -ne 1 ]]; then
        apk add --no-cache libsodium-dev
        docker-php-ext-install ${make_j} sodium
    fi
}

###################################################################

# 2024/10/25 14:35 使用install-php-extensions安装
function ioncube_loader() {
    install-php-extensions ioncube_loader
}

function sourceguardian() {
    apk add --no-cache eudev-libs
    install-php-extensions sourceguardian
}

function memcached() {
    install-php-extensions memcached
}

function ssh2() {
    install-php-extensions ssh2
}

function xmlrpc() {
    install-php-extensions xmlrpc
}

function maxminddb() {
    install-php-extensions maxminddb
}

function zstd() {
    install-php-extensions zstd
}

function ftp() {
    install-php-extensions ftp
}

function grpc() {
    install-php-extensions grpc
    docker-php-ext-enable grpc
}

function snuffleupagus() {
    install-php-extensions snuffleupagus
}

function pdo_oci() {
    install-php-extensions pdo_oci
}

function oci8() {
    install-php-extensions oci8
}

function swoole() {
    install-php-extensions swoole
}

###################################################################

# 2024/10/25 14:39 docker-php-ext-enable
function hprose() {
    printf "\n" | pecl install hprose
    docker-php-ext-enable hprose
}

function yaml() {
    apk add --no-cache yaml-dev
    printf "\n" | pecl install yaml
    docker-php-ext-enable yaml
}

function psr() {
    printf "\n" | pecl install psr
    docker-php-ext-enable psr
}

function rar() {
    printf "\n" | pecl install rar
    docker-php-ext-enable rar
}

function ast() {
    printf "\n" | pecl install ast
    docker-php-ext-enable ast
}

function msgpack() {
    printf "\n" | pecl install msgpack
    docker-php-ext-enable msgpack
}

function igbinary() {
    printf "\n" | pecl install igbinary
    docker-php-ext-enable igbinary
}

function seaslog() {
    printf "\n" | pecl install seaslog
    docker-php-ext-enable seaslog
}

function varnish() {
    apk add --no-cache varnish-dev
    printf "\n" | pecl install varnish
    docker-php-ext-enable varnish
}

function protobuf() {
    compared_php_version 8 0
    if [[ $? -eq 1 ]]; then
        printf "\n" | pecl install protobuf
        docker-php-ext-enable protobuf
    fi
}

function yac() {
    compared_php_version 8 0
    if [[ $? -eq 1 ]]; then
        printf "\n" | pecl install yac-2.0.2
        docker-php-ext-enable yac
    fi
}

function yar() {
    compared_php_version 8 0
    if [[ $? -eq 1 ]]; then
        printf "\n" | pecl install yar
        docker-php-ext-enable yar
    fi
}

function yaconf() {
    compared_php_version 8 0
    if [[ $? -eq 1 ]]; then
        printf "\n" | pecl install yaconf
        docker-php-ext-enable yaconf
    fi
}

function pdo_sqlsrv() {
    compared_php_version 8 0
    if [[ $? -eq 1 ]]; then
        apk add --no-cache unixodbc-dev
        printf "\n" | pecl install pdo_sqlsrv
        docker-php-ext-enable pdo_sqlsrv
        curl -o /tmp/msodbcsql17_amd64.apk https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/msodbcsql17_17.5.2.1-1_amd64.apk
        apk add --allow-untrusted /tmp/msodbcsql17_amd64.apk
    fi
}

function sqlsrv() {
    compared_php_version 8 0
    if [[ $? -eq 1 ]]; then
        apk add --no-cache unixodbc-dev
        printf "\n" | pecl install sqlsrv
        docker-php-ext-enable sqlsrv
    fi
}

function mcrypt() {
    compared_php_version 8 0
    if [[ $? -ne 1 ]]; then
        apk add --no-cache libmcrypt-dev libmcrypt re2c
        printf "\n" | pecl install mcrypt
        docker-php-ext-enable mcrypt
    else
        apk add --no-cache libmcrypt-dev
        docker-php-ext-install ${make_j} mcrypt
    fi
}

function amqp() {
    apk add --no-cache -U autoconf gcc linux-headers libc-dev rabbitmq-c-dev --virtual .phpize-deps-configure $PHPIZE_DEPS
    printf "\n" | pecl install amqp
    docker-php-ext-enable amqp
    apk del .phpize-deps-configure
}

function apcu() {
    printf "\n" | pecl install apcu
    docker-php-ext-enable apcu
}

function memcache() {
    printf "\n" | pecl install memcache
    docker-php-ext-enable memcache
}

function yaf() {
    printf "\n" | pecl install yaf
    docker-php-ext-enable yaf
}

function xhprof() {
    printf "\n" | pecl install xhprof
    docker-php-ext-enable xhprof
}

function xlswriter() {
    compared_php_version 8 0
    if [[ $? -eq 1 ]]; then
        #        apk add --no-cache libxlsxwriter-dev
        printf "\n" | pecl install xlswriter
        docker-php-ext-enable xlswriter
    fi
}

function rdkafka() {
    compared_php_version 8 0
    if [[ $? -eq 1 ]]; then
        apk add --no-cache librdkafka-dev
        printf "\n" | pecl install rdkafka
        docker-php-ext-enable rdkafka
    fi
}

#function zookeeper() {
#    compared_php_version 8 0
#    if [[ $? -eq 1 ]]; then
#        apk add --no-cache re2c
##        apk add --no-cache libzookeeper-dev
#        apk add --no-cache libzookeeper-dev --repository http://${REPO_URL}/alpine/edge/testing/
#        printf "\n" | pecl install zookeeper
#        docker-php-ext-enable zookeeper
#    fi
#}

function phalcon() {
    compared_php_version 8 0
    if [[ $? -eq 1 ]]; then
        apk add --no-cache pcre-dev
        printf "\n" | pecl install phalcon
        docker-php-ext-enable phalcon
    fi
}

function xdebug() {
    compared_php_version 8 0
    if [[ $? -eq 1 ]]; then
        printf "\n" | pecl install xdebug
        docker-php-ext-enable xdebug
    fi
}

###################################################################

# 2024/10/25 14:59 使用local_install_ext安装
function imagick() {
    apk add --no-cache file-dev imagemagick imagemagick-dev
    local_install_ext imagick-3.7.0
}

function redis() {
    local_install_ext redis-6.0.2
}

#function xdebug() {
#    local_install_ext xdebug-3.2.0
#}

function event() {
    apk add --no-cache libevent-dev
    local sockets_installed
    sockets_installed=$(php -r "echo extension_loaded('sockets');")

    if [[ -z "${sockets_installed}" ]]; then
        sockets
    fi

    tar -xf event-3.0.8.tgz
    cd event-3.0.8 || exit
    phpize
    ./configure
    make ${make_j}
    make install
    cd ..
    rm -rf event-3.0.8*

    docker-php-ext-enable --ini-name event.ini event
}

function mongodb() {
    apk add --no-cache openssl-dev
    local_install_ext mongodb-1.15.2
    docker-php-ext-configure mongodb --with-mongodb-ssl=openssl
    docker-php-ext-enable mongodb
}

function zookeeper() {
    apk add --no-cache re2c
    apk add --no-cache libzookeeper-dev --repository http://${REPO_URL}/alpine/edge/testing/
    local_install_ext zookeeper-1.2.1
}

function get_cpu_stat() {
    time1=$(cat /proc/stat | grep 'cpu ')
    sleep 1
    time2=$(cat /proc/stat | grep 'cpu ')
    cpuTime1=$(echo ${time1} | awk '{print $2+$3+$4+$5+$6+$7+$8}')
    cpuTime2=$(echo ${time2} | awk '{print $2+$3+$4+$5+$6+$7+$8}')
    runTime=$((${cpuTime2} - ${cpuTime1}))
    idelTime1=$(echo ${time1} | awk '{print $5}')
    idelTime2=$(echo ${time2} | awk '{print $5}')
    idelTime=$((${idelTime2} - ${idelTime1}))
    useTime=$(((${runTime} - ${idelTime}) * 3))
    [ ${useTime} -gt ${runTime} ] && cpuBusy="true"
    if [ "${cpuBusy}" == "true" ]; then
        cpuCore=$((${cpuInfo} / 2))
    else
        cpuCore=$((${cpuInfo} - 1))
    fi
}

function install_ext() {
    echo "开始安装扩展"
    echo "扩展列表: ${ext_list}"
    echo ""

    for ext in ${ext_list}; do
        if ! type "${ext}" &> /dev/null; then
            echo "未找到扩展: ${ext}"
            exit 1
        fi

        echo "安装扩展: ${ext}"
        ${ext}
    done

    echo "所有扩展${ext_list}安装完成"
}

function main() {
    if [ "${cpuInfo}" -ge "4" ]; then
        get_cpu_stat
    else
        cpuCore="1"
    fi
    make_j="-j${cpuCore}"
    install_ext

    docker-php-source delete
}

main
