mirror of
https://github.com/shivammathur/setup-php.git
synced 2024-11-26 13:23:05 +07:00
Add support to disable dependent extensions
This commit is contained in:
parent
5402397d9f
commit
bb36513e49
@ -126,6 +126,7 @@ enable_cache_extension() {
|
|||||||
enable_extension() {
|
enable_extension() {
|
||||||
modules_dir="/var/lib/php/modules/$version"
|
modules_dir="/var/lib/php/modules/$version"
|
||||||
[ -d "$modules_dir" ] && sudo find "$modules_dir" -path "*disabled*$1" -delete
|
[ -d "$modules_dir" ] && sudo find "$modules_dir" -path "*disabled*$1" -delete
|
||||||
|
enable_extension_dependencies "$1" "$2"
|
||||||
if [ -d /tmp/extcache/"$1" ]; then
|
if [ -d /tmp/extcache/"$1" ]; then
|
||||||
enable_cache_extension "$1" "$2"
|
enable_cache_extension "$1" "$2"
|
||||||
elif ! check_extension "$1" && [ -e "${ext_dir:?}/$1.so" ]; then
|
elif ! check_extension "$1" && [ -e "${ext_dir:?}/$1.so" ]; then
|
||||||
@ -133,13 +134,43 @@ enable_extension() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Function to disable an extensions.
|
# Function to get a map of extensions and their dependent shared extensions.
|
||||||
|
get_extension_map() {
|
||||||
|
php -d'error_reporting=0' "${dist:?}"/../src/scripts/ext/extension_map.php
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to enable extension dependencies which are also extensions.
|
||||||
|
enable_extension_dependencies() {
|
||||||
|
extension=$1
|
||||||
|
prefix=$2
|
||||||
|
if ! [ -e /tmp/map.orig ]; then
|
||||||
|
get_extension_map | sudo tee /tmp/map.orig >/dev/null
|
||||||
|
fi
|
||||||
|
for dependency in $(grep "$extension:" /tmp/map.orig | cut -d ':' -f 2 | tr '\n' ' '); do
|
||||||
|
enable_extension "$dependency" "$prefix"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to disable dependent extensions.
|
||||||
|
disable_extension_dependents() {
|
||||||
|
local extension=$1
|
||||||
|
for dependent in $(get_extension_map | grep -E ".*:.*\s$extension(\s|$)" | cut -d ':' -f 1 | tr '\n' ' '); do
|
||||||
|
disable_extension_helper "$dependent" true
|
||||||
|
add_log "${tick:?}" ":$extension" "Disabled $dependent as it depends on $extension"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to disable an extension.
|
||||||
disable_extension() {
|
disable_extension() {
|
||||||
extension=$1
|
extension=$1
|
||||||
if check_extension "$extension"; then
|
if check_extension "$extension"; then
|
||||||
disable_extension_helper "$extension"
|
if [ -e "${ext_dir:?}"/"$extension".so ]; then
|
||||||
|
disable_extension_helper "$extension" true
|
||||||
(! check_extension "$extension" && add_log "${tick:?}" ":$extension" "Disabled") ||
|
(! check_extension "$extension" && add_log "${tick:?}" ":$extension" "Disabled") ||
|
||||||
add_log "${cross:?}" ":$extension" "Could not disable $extension on PHP ${semver:?}"
|
add_log "${cross:?}" ":$extension" "Could not disable $extension on PHP ${semver:?}"
|
||||||
|
else
|
||||||
|
add_log "${cross:?}" ":$extension" "Could not disable $extension on PHP $semver as it not a shared extension"
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
add_log "${tick:?}" ":$extension" "Could not find $extension on PHP $semver"
|
add_log "${tick:?}" ":$extension" "Could not find $extension on PHP $semver"
|
||||||
fi
|
fi
|
||||||
|
@ -9,7 +9,11 @@ self_hosted_helper() {
|
|||||||
|
|
||||||
# Helper function to disable an extension.
|
# Helper function to disable an extension.
|
||||||
disable_extension_helper() {
|
disable_extension_helper() {
|
||||||
extension=$1
|
local extension=$1
|
||||||
|
local disable_dependents=${2:-false}
|
||||||
|
if [ "$disable_dependents" = "true" ]; then
|
||||||
|
disable_extension_dependents "$extension"
|
||||||
|
fi
|
||||||
sudo sed -Ei '' "/=(.*\/)?\"?$extension(.so)?$/d" "${ini_file:?}"
|
sudo sed -Ei '' "/=(.*\/)?\"?$extension(.so)?$/d" "${ini_file:?}"
|
||||||
sudo rm -rf "$scan_dir"/*"$extension"*
|
sudo rm -rf "$scan_dir"/*"$extension"*
|
||||||
}
|
}
|
||||||
|
109
src/scripts/ext/extension_map.php
Normal file
109
src/scripts/ext/extension_map.php
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class for a map of extensions and their dependent extensions.
|
||||||
|
*
|
||||||
|
* Class ExtensionMap
|
||||||
|
*/
|
||||||
|
class ExtensionMap {
|
||||||
|
/** @var string Directory in which shared extensions are stored. */
|
||||||
|
private $extension_dir;
|
||||||
|
|
||||||
|
/** @var string File extension for PHP extension file. */
|
||||||
|
private $file_extension;
|
||||||
|
|
||||||
|
/** @var string Prefix in PHP extension file. */
|
||||||
|
private $file_prefix;
|
||||||
|
|
||||||
|
/** @var string String to store the map */
|
||||||
|
private $map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ExtensionMap constructor.
|
||||||
|
*/
|
||||||
|
function __construct() {
|
||||||
|
$this->extension_dir = ini_get('extension_dir');
|
||||||
|
$this->file_extension = (PHP_OS == 'WINNT' ? '.dll' : '.so');
|
||||||
|
$this->file_prefix = (PHP_OS == 'WINNT' ? 'php_' : '');
|
||||||
|
$this->map = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function to check if a shared extension file exists.
|
||||||
|
*
|
||||||
|
* @param string $extension
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function checkSharedExtension($extension) {
|
||||||
|
$extension_file = $this->extension_dir. DIRECTORY_SEPARATOR . $this->file_prefix . $extension . $this->file_extension;
|
||||||
|
return file_exists($extension_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function to get all shared extensions.
|
||||||
|
*
|
||||||
|
* @return string[]
|
||||||
|
*/
|
||||||
|
public function getSharedExtensions() {
|
||||||
|
$files = scandir($this->extension_dir);
|
||||||
|
$extensions = array_diff($files, array('.','..'));
|
||||||
|
$filter_pattern = "/$this->file_extension|$this->file_prefix/";
|
||||||
|
return array_map(function ($extension) use($filter_pattern) {
|
||||||
|
return preg_replace($filter_pattern, '', $extension);
|
||||||
|
}, $extensions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function to patch dependencies if there are any bugs in Reflection data.
|
||||||
|
*
|
||||||
|
* @param string $extension
|
||||||
|
* @param array $dependencies
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function patchDependencies($extension, $dependencies) {
|
||||||
|
// memcached 2.2.0 has no dependencies in reflection data.
|
||||||
|
if($extension == 'memcached') {
|
||||||
|
$dependencies = array_unique(array_merge($dependencies, array('igbinary', 'json', 'msgpack')));
|
||||||
|
}
|
||||||
|
return $dependencies;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function to add extension to the map.
|
||||||
|
*
|
||||||
|
* @param string $extension
|
||||||
|
* @throws ReflectionException
|
||||||
|
*/
|
||||||
|
public function addExtensionToMap($extension) {
|
||||||
|
// PHP 5.3 does not allow using $this.
|
||||||
|
$self = $this;
|
||||||
|
|
||||||
|
$ref = new ReflectionExtension($extension);
|
||||||
|
$dependencies = array_keys(array_map('strtolower', $ref->getDependencies()));
|
||||||
|
$dependencies = $this->patchDependencies($extension, $dependencies);
|
||||||
|
$dependencies = array_filter($dependencies, function ($dependency) use ($self) {
|
||||||
|
return $self->checkSharedExtension($dependency);
|
||||||
|
});
|
||||||
|
$self->map .= $extension . ': ' . implode(' ', $dependencies) . PHP_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function to print the map of shared extensions and their dependent extensions.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function __toString() {
|
||||||
|
$extensions = array_map('strtolower', $this->getSharedExtensions());
|
||||||
|
foreach ($extensions as $extension) {
|
||||||
|
try {
|
||||||
|
$this->addExtensionToMap($extension);
|
||||||
|
} catch (ReflectionException $e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $this->map;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$extension_map = new ExtensionMap();
|
||||||
|
echo $extension_map;
|
@ -20,9 +20,13 @@ install_packages() {
|
|||||||
|
|
||||||
# Function to disable an extension.
|
# Function to disable an extension.
|
||||||
disable_extension_helper() {
|
disable_extension_helper() {
|
||||||
extension=$1
|
local extension=$1
|
||||||
|
local disable_dependents=${2:-false}
|
||||||
|
if [ "$disable_dependents" = "true" ]; then
|
||||||
|
disable_extension_dependents "$extension"
|
||||||
|
fi
|
||||||
sudo sed -Ei "/=(.*\/)?\"?$extension(.so)?$/d" "${ini_file[@]}" "$pecl_file"
|
sudo sed -Ei "/=(.*\/)?\"?$extension(.so)?$/d" "${ini_file[@]}" "$pecl_file"
|
||||||
sudo find "$ini_dir"/.. -name "*$extension.ini" -delete >/dev/null 2>&1 || true
|
sudo find "$ini_dir"/.. -name "*$extension.ini" -not -path "*mods-available*" -delete >/dev/null 2>&1 || true
|
||||||
}
|
}
|
||||||
|
|
||||||
# Function to add PDO extension.
|
# Function to add PDO extension.
|
||||||
|
@ -192,6 +192,7 @@ Function Add-Extension {
|
|||||||
}
|
}
|
||||||
default {
|
default {
|
||||||
$deps_dir = Get-ExtensionPrerequisites $extension
|
$deps_dir = Get-ExtensionPrerequisites $extension
|
||||||
|
Enable-ExtensionDependencies $extension
|
||||||
Enable-PhpExtension -Extension $extension_info.Handle -Path $php_dir
|
Enable-PhpExtension -Extension $extension_info.Handle -Path $php_dir
|
||||||
Set-ExtensionPrerequisites $deps_dir
|
Set-ExtensionPrerequisites $deps_dir
|
||||||
Add-Log $tick $extension "Enabled"
|
Add-Log $tick $extension "Enabled"
|
||||||
@ -214,8 +215,13 @@ Function Add-Extension {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Function to disable an extension.
|
# Function to get a map of extensions and their dependent shared extensions.
|
||||||
Function Disable-Extension() {
|
Function Get-ExtensionMap {
|
||||||
|
php -d'error_reporting=0' $dist\..\src\scripts\ext\extension_map.php
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to enable extension dependencies which are also extensions.
|
||||||
|
Function Enable-ExtensionDependencies {
|
||||||
Param (
|
Param (
|
||||||
[Parameter(Position = 0, Mandatory = $true)]
|
[Parameter(Position = 0, Mandatory = $true)]
|
||||||
[ValidateNotNull()]
|
[ValidateNotNull()]
|
||||||
@ -223,13 +229,77 @@ Function Disable-Extension() {
|
|||||||
[string]
|
[string]
|
||||||
$extension
|
$extension
|
||||||
)
|
)
|
||||||
|
if (-not(Test-Path $env:TEMP\map.orig)) {
|
||||||
|
Get-ExtensionMap | Set-Content -Path $env:TEMP\map.orig
|
||||||
|
}
|
||||||
|
$entry = findstr /r "$extension`:.*" $env:TEMP\map.orig
|
||||||
|
if($entry) {
|
||||||
|
$entry.split(':')[1].trim().split(' ') | ForEach-Object {
|
||||||
|
if (-not(php -m | findstr -i $_)) {
|
||||||
|
Enable-PhpExtension -Extension $_ -Path $php_dir
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to disable dependent extensions.
|
||||||
|
Function Disable-DependentExtensions() {
|
||||||
|
Param (
|
||||||
|
[Parameter(Position = 0, Mandatory = $true)]
|
||||||
|
[ValidateNotNull()]
|
||||||
|
[ValidateLength(1, [int]::MaxValue)]
|
||||||
|
[string]
|
||||||
|
$extension
|
||||||
|
)
|
||||||
|
Get-ExtensionMap | Select-String -Pattern ".*:.*\s$extension(\s|$)" | ForEach-Object {
|
||||||
|
$dependent = $_.Matches[0].Value.split(':')[0];
|
||||||
|
Disable-ExtensionHelper -Extension $dependent -DisableDependents
|
||||||
|
Add-Log $tick ":$extension" "Disabled $dependent as it depends on $extension"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Helper function to disable an extension.
|
||||||
|
Function Disable-ExtensionHelper() {
|
||||||
|
Param (
|
||||||
|
[Parameter(Position = 0, Mandatory = $true)]
|
||||||
|
[ValidateNotNull()]
|
||||||
|
[ValidateLength(1, [int]::MaxValue)]
|
||||||
|
[string]
|
||||||
|
$extension,
|
||||||
|
[switch] $DisableDependents
|
||||||
|
)
|
||||||
|
if($DisableDependents) {
|
||||||
|
Disable-DependentExtensions $extension
|
||||||
|
}
|
||||||
|
Disable-PhpExtension -Extension $extension -Path $php_dir
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to disable an extension.
|
||||||
|
Function Disable-Extension() {
|
||||||
|
Param (
|
||||||
|
[Parameter(Position = 0, Mandatory = $true)]
|
||||||
|
[ValidateNotNull()]
|
||||||
|
[ValidateLength(1, [int]::MaxValue)]
|
||||||
|
[string]
|
||||||
|
$extension,
|
||||||
|
[Parameter(Position = 1, Mandatory = $false)]
|
||||||
|
[ValidateNotNull()]
|
||||||
|
[ValidateLength(1, [int]::MaxValue)]
|
||||||
|
[string]
|
||||||
|
$DisableDependents
|
||||||
|
)
|
||||||
if(php -m | findstr -i $extension) {
|
if(php -m | findstr -i $extension) {
|
||||||
|
if(Test-Path $ext_dir\php_$extension.dll) {
|
||||||
try {
|
try {
|
||||||
Disable-PhpExtension $extension $php_dir
|
$params = @{ Extension = $extension; DisableDependents = ($DisableDependents -ne 'false') }
|
||||||
|
Disable-ExtensionHelper @params
|
||||||
Add-Log $tick ":$extension" "Disabled"
|
Add-Log $tick ":$extension" "Disabled"
|
||||||
} catch {
|
} catch {
|
||||||
Add-Log $cross ":$extension" "Could not disable $extension on PHP $($installed.FullVersion)"
|
Add-Log $cross ":$extension" "Could not disable $extension on PHP $($installed.FullVersion)"
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
Add-Log $cross ":$extension" "Could not disable $extension on PHP $($installed.FullVersion) as it not a shared extension"
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Add-Log $tick ":$extension" "Could not find $extension on PHP $($installed.FullVersion)"
|
Add-Log $tick ":$extension" "Could not find $extension on PHP $($installed.FullVersion)"
|
||||||
}
|
}
|
||||||
@ -461,6 +531,7 @@ if ($null -eq $installed -or -not("$($installed.Version).".StartsWith(($version
|
|||||||
}
|
}
|
||||||
} catch { }
|
} catch { }
|
||||||
} else {
|
} else {
|
||||||
|
Set-PhpIniKey -Key 'extension_dir' -Value $ext_dir -Path $php_dir
|
||||||
if($version -match $jit_versions) {
|
if($version -match $jit_versions) {
|
||||||
('opcache.enable=1', 'opcache.jit_buffer_size=256M', 'opcache.jit=1235') | ForEach-Object { $p=$_.split('='); Set-PhpIniKey -Key $p[0] -Value $p[1] -Path $php_dir }
|
('opcache.enable=1', 'opcache.jit_buffer_size=256M', 'opcache.jit=1235') | ForEach-Object { $p=$_.split('='); Set-PhpIniKey -Key $p[0] -Value $p[1] -Path $php_dir }
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user