mirror of
https://github.com/shivammathur/setup-php.git
synced 2025-07-02 05:03:17 +07:00
Compare commits
20 Commits
Author | SHA1 | Date | |
---|---|---|---|
dccdb5ab67 | |||
9a01fd28ca | |||
d5cd6a4bd1 | |||
006301e81d | |||
4a38014043 | |||
a0ac655b06 | |||
41e56c42c7 | |||
4e8a0cfe8b | |||
ee72f2f8ad | |||
ed557fd2c3 | |||
d90cd153ee | |||
3376371dd8 | |||
a2b261d79a | |||
6c93dbd391 | |||
f58dc6eca1 | |||
5326f2302f | |||
b9a78a31fb | |||
ba69b25cab | |||
a6533acdd4 | |||
d3b37e3d0d |
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@ -1,6 +1,6 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: shivammathur
|
||||
tidelift: "npm/setup-php"
|
||||
community_bridge: setup-php
|
||||
issuehunt: shivammathur
|
||||
patreon: shivammathur
|
||||
|
30
.github/SECURITY.md
vendored
Normal file
30
.github/SECURITY.md
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
The following versions of this project are supported for security updates.
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 1.8.x | :white_check_mark: |
|
||||
| 2.1.x | :white_check_mark: |
|
||||
|
||||
## Supported PHP Versions
|
||||
|
||||
This security policy only applies to the latest patches of the following PHP versions.
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 7.2 | :white_check_mark: |
|
||||
| 7.3 | :white_check_mark: |
|
||||
| 7.4 | :white_check_mark: |
|
||||
| 8.0 | :white_check_mark: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
If you have found any issues that might have security implications in the versions supported, please send a report privately to [contact@shivammathur.com](mailto:contact@shivammathur.com)
|
||||
Do not report security reports publicly.
|
||||
|
||||
## Tidelift
|
||||
|
||||
If you use this GitHub Action through a Tidelift subscription, please refer to [https://tidelift.com/security](https://tidelift.com/security).
|
2
.github/workflows/experimental-workflow.yml
vendored
2
.github/workflows/experimental-workflow.yml
vendored
@ -28,7 +28,7 @@ jobs:
|
||||
operating-system: [ubuntu-latest, windows-latest, macos-latest]
|
||||
php-versions: ['8.0']
|
||||
env:
|
||||
extensions: xml, opcache, xdebug, pcov
|
||||
extensions: xml, opcache, pcov
|
||||
key: cache-v2
|
||||
steps:
|
||||
- name: Checkout
|
||||
|
14
README.md
14
README.md
@ -36,6 +36,7 @@ Setup PHP with required extensions, php.ini configuration, code-coverage support
|
||||
- [Cache Extensions](#cache-extensions)
|
||||
- [Cache Composer Dependencies](#cache-composer-dependencies)
|
||||
- [Cache Node.js Dependencies](#cache-nodejs-dependencies)
|
||||
- [Composer GitHub OAuth](#composer-github-oauth)
|
||||
- [Problem Matchers](#problem-matchers)
|
||||
- [Examples](#examples)
|
||||
- [License](#scroll-license)
|
||||
@ -430,6 +431,19 @@ If your project has node.js dependencies, you can persist npm's or yarn's cache
|
||||
|
||||
**Note:** Please do not cache `node_modules` directory as that will have side-effects.
|
||||
|
||||
### Composer GitHub OAuth
|
||||
|
||||
If you have a number of workflows which setup multiple tools or have many composer dependencies, you might hit the GitHub's rate limit for composer. To avoid that you can add a `OAuth` token to the composer's config by setting `COMPOSER_TOKEN` environment variable. You can use [`GITHUB_TOKEN`](https://help.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token "GITHUB_TOKEN documentation") secret for this purpose.
|
||||
|
||||
```yaml
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: '7.4'
|
||||
env:
|
||||
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
```
|
||||
|
||||
### Problem Matchers
|
||||
|
||||
#### PHP
|
||||
|
@ -49,15 +49,17 @@ describe('Extension tests', () => {
|
||||
|
||||
it('checking addExtensionOnLinux', async () => {
|
||||
let linux: string = await extensions.addExtension(
|
||||
'Xdebug, pcov, sqlite, ast-beta, pdo_mysql, pdo-odbc, xdebug-alpha, grpc-1.2.3',
|
||||
'Xdebug, pcov, sqlite, ast, uopz, ast-beta, pdo_mysql, pdo-odbc, xdebug-alpha, grpc-1.2.3',
|
||||
'7.4',
|
||||
'linux'
|
||||
);
|
||||
expect(linux).toContain('update_extension xdebug 2.9.2');
|
||||
expect(linux).toContain('update_extension xdebug 2.9.3');
|
||||
expect(linux).toContain('sudo $debconf_fix apt-get install -y php7.4-pcov');
|
||||
expect(linux).toContain(
|
||||
'sudo $debconf_fix apt-get install -y php7.4-sqlite3'
|
||||
);
|
||||
expect(linux).toContain('sudo $debconf_fix apt-get install -y php-ast');
|
||||
expect(linux).toContain('sudo $debconf_fix apt-get install -y php-uopz');
|
||||
expect(linux).toContain('add_unstable_extension ast beta extension');
|
||||
expect(linux).toContain('add_pdo_extension mysql');
|
||||
expect(linux).toContain('add_pdo_extension odbc');
|
||||
|
44
dist/index.js
vendored
44
dist/index.js
vendored
@ -354,13 +354,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||||
result["default"] = mod;
|
||||
return result;
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const os = __webpack_require__(87);
|
||||
const events = __webpack_require__(614);
|
||||
const child = __webpack_require__(129);
|
||||
const path = __webpack_require__(622);
|
||||
const io = __webpack_require__(1);
|
||||
const ioUtil = __webpack_require__(672);
|
||||
const os = __importStar(__webpack_require__(87));
|
||||
const events = __importStar(__webpack_require__(614));
|
||||
const child = __importStar(__webpack_require__(129));
|
||||
const path = __importStar(__webpack_require__(622));
|
||||
const io = __importStar(__webpack_require__(1));
|
||||
const ioUtil = __importStar(__webpack_require__(672));
|
||||
/* eslint-disable @typescript-eslint/unbound-method */
|
||||
const IS_WINDOWS = process.platform === 'win32';
|
||||
/*
|
||||
@ -804,6 +811,12 @@ class ToolRunner extends events.EventEmitter {
|
||||
resolve(exitCode);
|
||||
}
|
||||
});
|
||||
if (this.options.input) {
|
||||
if (!cp.stdin) {
|
||||
throw new Error('child process missing stdin');
|
||||
}
|
||||
cp.stdin.end(this.options.input);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
@ -2788,10 +2801,10 @@ async function addExtensionLinux(extension_csv, version, pipe) {
|
||||
' ' +
|
||||
version;
|
||||
return;
|
||||
// match 7.0xdebug..7.4xdebug
|
||||
case /^7\.[0-4]xdebug$/.test(version_extension):
|
||||
// match 7.1xdebug..7.4xdebug
|
||||
case /^7\.[1-4]xdebug$/.test(version_extension):
|
||||
script +=
|
||||
'\nupdate_extension xdebug 2.9.2' +
|
||||
'\nupdate_extension xdebug 2.9.3' +
|
||||
pipe +
|
||||
'\n' +
|
||||
(await utils.addLog('$tick', 'xdebug', 'Enabled', 'linux'));
|
||||
@ -2801,6 +2814,10 @@ async function addExtensionLinux(extension_csv, version, pipe) {
|
||||
extension = extension.replace('pdo_', '').replace('pdo-', '');
|
||||
script += '\nadd_pdo_extension ' + extension;
|
||||
return;
|
||||
// match ast and uopz
|
||||
case /^(ast|uopz)$/.test(extension):
|
||||
command = command_prefix + '-' + extension + pipe;
|
||||
break;
|
||||
// match sqlite
|
||||
case /^sqlite$/.test(extension):
|
||||
extension = 'sqlite3';
|
||||
@ -2866,8 +2883,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||||
result["default"] = mod;
|
||||
return result;
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const tr = __webpack_require__(9);
|
||||
const tr = __importStar(__webpack_require__(9));
|
||||
/**
|
||||
* Exec a command.
|
||||
* Output will be streamed to the live console.
|
||||
|
1356
package-lock.json
generated
1356
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
22
package.json
22
package.json
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "setup-php",
|
||||
"version": "2.1.2",
|
||||
"version": "2.1.4",
|
||||
"private": false,
|
||||
"description": "Setup PHP for use with GitHub Actions",
|
||||
"main": "dist/index.js",
|
||||
@ -30,21 +30,21 @@
|
||||
"fs": "0.0.1-security"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^25.1.4",
|
||||
"@types/node": "^13.9.1",
|
||||
"@typescript-eslint/eslint-plugin": "^2.23.0",
|
||||
"@typescript-eslint/parser": "^2.23.0",
|
||||
"@zeit/ncc": "^0.21.1",
|
||||
"@types/jest": "^25.2.1",
|
||||
"@types/node": "^13.11.1",
|
||||
"@typescript-eslint/eslint-plugin": "^2.27.0",
|
||||
"@typescript-eslint/parser": "^2.27.0",
|
||||
"@zeit/ncc": "^0.22.1",
|
||||
"eslint": "^6.8.0",
|
||||
"eslint-config-prettier": "^6.10.0",
|
||||
"eslint-plugin-import": "^2.20.1",
|
||||
"eslint-config-prettier": "^6.10.1",
|
||||
"eslint-plugin-import": "^2.20.2",
|
||||
"eslint-plugin-jest": "^23.8.2",
|
||||
"eslint-plugin-prettier": "^3.1.2",
|
||||
"husky": "^4.2.3",
|
||||
"jest": "^25.1.0",
|
||||
"jest-circus": "^25.1.0",
|
||||
"jest": "^25.3.0",
|
||||
"jest-circus": "^25.3.0",
|
||||
"prettier": "^1.19.1",
|
||||
"ts-jest": "^25.2.1",
|
||||
"ts-jest": "^25.3.1",
|
||||
"typescript": "^3.8.3"
|
||||
},
|
||||
"husky": {
|
||||
|
Binary file not shown.
Binary file not shown.
@ -268,10 +268,10 @@ export async function addExtensionLinux(
|
||||
' ' +
|
||||
version;
|
||||
return;
|
||||
// match 7.0xdebug..7.4xdebug
|
||||
case /^7\.[0-4]xdebug$/.test(version_extension):
|
||||
// match 7.1xdebug..7.4xdebug
|
||||
case /^7\.[1-4]xdebug$/.test(version_extension):
|
||||
script +=
|
||||
'\nupdate_extension xdebug 2.9.2' +
|
||||
'\nupdate_extension xdebug 2.9.3' +
|
||||
pipe +
|
||||
'\n' +
|
||||
(await utils.addLog('$tick', 'xdebug', 'Enabled', 'linux'));
|
||||
@ -281,6 +281,10 @@ export async function addExtensionLinux(
|
||||
extension = extension.replace('pdo_', '').replace('pdo-', '');
|
||||
script += '\nadd_pdo_extension ' + extension;
|
||||
return;
|
||||
// match ast and uopz
|
||||
case /^(ast|uopz)$/.test(extension):
|
||||
command = command_prefix + '-' + extension + pipe;
|
||||
break;
|
||||
// match sqlite
|
||||
case /^sqlite$/.test(extension):
|
||||
extension = 'sqlite3';
|
||||
|
@ -108,6 +108,9 @@ add_tool() {
|
||||
sudo chmod a+x "$tool_path"
|
||||
if [ "$tool" = "composer" ]; then
|
||||
composer -q global config process-timeout 0
|
||||
if [ -n "$COMPOSER_TOKEN" ]; then
|
||||
composer -q global config github-oauth.github.com "$COMPOSER_TOKEN"
|
||||
fi
|
||||
elif [ "$tool" = "phive" ]; then
|
||||
add_extension curl "sudo pecl install -f curl" extension >/dev/null 2>&1
|
||||
add_extension mbstring "sudo pecl install -f mbstring" extension >/dev/null 2>&1
|
||||
@ -162,13 +165,29 @@ add_pecl() {
|
||||
add_log "$tick" "PECL" "Added"
|
||||
}
|
||||
|
||||
# Function to fetch updated formulas
|
||||
update_formulae() {
|
||||
brew_dir=$(brew --prefix)/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
|
||||
for formula in httpd pkg-config apr apr-util argon2 aspell autoconf bison curl-openssl freetds freetype gettext glib gmp icu4c jpeg krb5 libffi libpng libpq libsodium libzip oniguruma openldap openssl@1.1 re2c sqlite tidyp unixodbc webp; do
|
||||
sudo curl -o "$brew_dir"/"$formula".rb -sSL https://raw.githubusercontent.com/Homebrew/homebrew-core/master/Formula/"$formula".rb &
|
||||
to_wait+=( $! )
|
||||
done
|
||||
wait "${to_wait[@]}"
|
||||
}
|
||||
|
||||
# Function to setup PHP >=5.6
|
||||
setup_php() {
|
||||
action=$1
|
||||
export HOMEBREW_NO_INSTALL_CLEANUP=TRUE >/dev/null 2>&1
|
||||
brew tap shivammathur/homebrew-php >/dev/null 2>&1
|
||||
brew "$action" shivammathur/php/php@"$version" >/dev/null 2>&1
|
||||
brew link --force --overwrite php@"$version" >/dev/null 2>&1
|
||||
if [ "$version" = "8.0" ]; then
|
||||
update_formulae
|
||||
fi
|
||||
export HOMEBREW_NO_INSTALL_CLEANUP=TRUE
|
||||
brew tap shivammathur/homebrew-php
|
||||
if [ "$version" = "5.6" ] || [ "$version" = "7.0" ]; then
|
||||
brew install https://raw.githubusercontent.com/shivammathur/homebrew-php/master/Formula/icu4c.rb --force
|
||||
fi
|
||||
brew "$action" shivammathur/php/php@"$version"
|
||||
brew link --force --overwrite php@"$version"
|
||||
}
|
||||
|
||||
# Variables
|
||||
@ -187,10 +206,10 @@ if [[ "$version" =~ $old_versions ]]; then
|
||||
curl -sSL https://github.com/shivammathur/php5-darwin/releases/latest/download/install.sh | bash -s "$nodot_version" >/dev/null 2>&1 &&
|
||||
status="Installed"
|
||||
elif [ "$existing_version" != "$version" ]; then
|
||||
setup_php "install"
|
||||
setup_php "install" >/dev/null 2>&1
|
||||
status="Installed"
|
||||
elif [ "$existing_version" = "$version" ] && [ "$update" = "true" ]; then
|
||||
setup_php "upgrade"
|
||||
setup_php "upgrade" >/dev/null 2>&1
|
||||
status="Updated to"
|
||||
else
|
||||
status="Found"
|
||||
|
@ -19,12 +19,7 @@ add_log() {
|
||||
# Function to update php ppa
|
||||
update_ppa() {
|
||||
if [ "$ppa_updated" = "false" ]; then
|
||||
if [[ "$version" =~ $old_versions ]]; then
|
||||
ppa="dotdeb-ubuntu-php*.list"
|
||||
else
|
||||
ppa="ondrej-ubuntu-php*.list"
|
||||
fi
|
||||
find /etc/apt/sources.list.d -type f -name "$ppa" -exec sudo "$debconf_fix" apt-fast update -o Dir::Etc::sourcelist="{}" ';' >/dev/null 2>&1
|
||||
sudo "$debconf_fix" apt-get update >/dev/null 2>&1
|
||||
ppa_updated="true"
|
||||
fi
|
||||
}
|
||||
@ -32,8 +27,9 @@ update_ppa() {
|
||||
# Function to configure PECL
|
||||
configure_pecl() {
|
||||
if [ "$pecl_config" = "false" ] && [ -e /usr/bin/pecl ]; then
|
||||
sudo touch "$scan_dir"/99-pecl.ini >/dev/null 2>&1
|
||||
for tool in pear pecl; do
|
||||
sudo "$tool" config-set php_ini "$ini_file" >/dev/null 2>&1
|
||||
sudo "$tool" config-set php_ini "$scan_dir"/99-pecl.ini >/dev/null 2>&1
|
||||
sudo "$tool" config-set auto_discover 1 >/dev/null 2>&1
|
||||
sudo "$tool" channel-update "$tool".php.net >/dev/null 2>&1
|
||||
done
|
||||
@ -186,6 +182,9 @@ add_tool() {
|
||||
sudo chmod a+x "$tool_path"
|
||||
if [ "$tool" = "composer" ]; then
|
||||
composer -q global config process-timeout 0
|
||||
if [ -n "$COMPOSER_TOKEN" ]; then
|
||||
composer -q global config github-oauth.github.com "$COMPOSER_TOKEN"
|
||||
fi
|
||||
elif [ "$tool" = "cs2pr" ]; then
|
||||
sudo sed -i 's/\r$//; s/exit(9)/exit(0)/' "$tool_path"
|
||||
elif [ "$tool" = "phive" ]; then
|
||||
@ -239,29 +238,26 @@ add_blackfire() {
|
||||
|
||||
# Function to setup the nightly build from master branch
|
||||
setup_master() {
|
||||
update_ppa && $apt_install libzip-dev
|
||||
tar_file=php_"$version"%2Bubuntu"$(lsb_release -r -s)".tar.xz
|
||||
install_dir=~/php/"$version"
|
||||
bintray_url=https://dl.bintray.com/shivammathur/php/"$tar_file"
|
||||
sudo mkdir -m 777 -p ~/php
|
||||
update_ppa && $apt_install libicu-dev >/dev/null 2>&1
|
||||
curl -SLO https://dl.bintray.com/shivammathur/php/"$tar_file" >/dev/null 2>&1
|
||||
sudo tar xf "$tar_file" -C ~/php >/dev/null 2>&1
|
||||
rm -rf "$tar_file"
|
||||
curl -o /tmp/"$tar_file" -sSL "$bintray_url"
|
||||
sudo tar xf /tmp/"$tar_file" -C ~/php
|
||||
sudo ln -sf -S "$version" "$install_dir"/bin/* /usr/bin/
|
||||
sudo ln -sf "$install_dir"/etc/php.ini /etc/php.ini
|
||||
}
|
||||
|
||||
# Function to setup PHP 5.3, PHP 5.4 and PHP 5.5
|
||||
setup_old_versions() {
|
||||
(
|
||||
cd /tmp || exit
|
||||
curl -SLO https://dl.bintray.com/shivammathur/php/php-"$version".tar.xz >/dev/null 2>&1
|
||||
sudo tar xf php-"$version".tar.xz >/dev/null 2>&1
|
||||
cd php-"$version" || exit
|
||||
sudo chmod a+x ./*.sh
|
||||
./install.sh >/dev/null 2>&1
|
||||
./post-install.sh >/dev/null 2>&1
|
||||
)
|
||||
sudo rm -rf /tmp/php-"$version"
|
||||
dir=php-"$version"
|
||||
tar_file="$dir".tar.xz
|
||||
bintray_url=https://dl.bintray.com/shivammathur/php/"$tar_file"
|
||||
curl -o /tmp/"$tar_file" -sSL "$bintray_url"
|
||||
sudo tar xf /tmp/"$tar_file" -C /tmp
|
||||
sudo chmod a+x /tmp/"$dir"/*.sh
|
||||
(cd /tmp/"$dir" && ./install.sh && ./post-install.sh)
|
||||
configure_pecl
|
||||
release_version=$(php -v | head -n 1 | cut -d' ' -f 2)
|
||||
}
|
||||
@ -327,9 +323,9 @@ sudo mkdir -p /var/run /run/php
|
||||
if [ "$existing_version" != "$version" ]; then
|
||||
if [ ! -e "/usr/bin/php$version" ]; then
|
||||
if [ "$version" = "8.0" ]; then
|
||||
setup_master
|
||||
setup_master >/dev/null 2>&1
|
||||
elif [[ "$version" =~ $old_versions ]] || [ "$version" = "5.3" ]; then
|
||||
setup_old_versions
|
||||
setup_old_versions >/dev/null 2>&1
|
||||
else
|
||||
update_ppa
|
||||
$apt_install php"$version" php"$version"-curl php"$version"-mbstring php"$version"-xml >/dev/null 2>&1
|
||||
|
@ -20,6 +20,18 @@ Function Add-Log($mark, $subject, $message) {
|
||||
printf "\033[%s;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" $code $mark $subject $message
|
||||
}
|
||||
|
||||
Function Install-PhpManager() {
|
||||
$repo = "mlocati/powershell-phpmanager"
|
||||
$zip_file = "$php_dir\PhpManager.zip"
|
||||
$tags = Invoke-WebRequest https://api.github.com/repos/$repo/tags | ConvertFrom-Json
|
||||
$tag = $tags[0].Name
|
||||
$module_path = "$php_dir\PhpManager\powershell-phpmanager-$tag\PhpManager"
|
||||
Invoke-WebRequest -UseBasicParsing -Uri https://github.com/$repo/archive/$tag.zip -OutFile $zip_file
|
||||
Expand-Archive -Path $zip_file -DestinationPath $php_dir\PhpManager
|
||||
Import-Module $module_path
|
||||
Add-Content -Path $PsHome\profile.ps1 -Value "Import-Module $module_path"
|
||||
}
|
||||
|
||||
Function Add-Extension {
|
||||
Param (
|
||||
[Parameter(Position = 0, Mandatory = $true)]
|
||||
@ -124,6 +136,9 @@ Function Add-Tool() {
|
||||
(Get-Content $php_dir/cs2pr).replace('exit(9)', 'exit(0)') | Set-Content $php_dir/cs2pr
|
||||
} elseif($tool -eq "composer") {
|
||||
composer -q global config process-timeout 0
|
||||
if (Test-Path env:COMPOSER_TOKEN) {
|
||||
composer -q global config github-oauth.github.com $env:COMPOSER_TOKEN
|
||||
}
|
||||
} elseif($tool -eq "wp-cli") {
|
||||
Copy-Item $php_dir\wp-cli.bat -Destination $php_dir\wp.bat
|
||||
}
|
||||
@ -204,7 +219,7 @@ if((Test-Path env:PHPTS) -and $env:PHPTS -eq 'ts') {
|
||||
}
|
||||
|
||||
Step-Log "Setup PhpManager"
|
||||
Install-Module -Name PhpManager -Force -Scope CurrentUser
|
||||
Install-PhpManager >$null 2>&1
|
||||
Add-Log $tick "PhpManager" "Installed"
|
||||
|
||||
$installed = $null
|
||||
|
Reference in New Issue
Block a user