В LINUX есть очень специфическая утилита/инструмент сжатия по адресу /usr/bin/xz
.
Теперь я использую Windows 10 x64 с PHP 8.1, и у меня есть библиотека php, которая в одной строке своего кода вызывает этот очень специфический файл LINUX (все остальное в этом коде совместимо с Windows, за исключением этой строки кода) с некоторые конкретные переключатели, задающие его параметры. Это строка:
$x = proc_open("/usr/bin/xz '--format=raw' '--lzma1=lc=3,lp=0,pb=2,dict=128KiB' '-c' '-'", [0 => ["pipe", "r"], 1 => ["pipe", "w"]], $p);
Я пытаюсь найти какую-нибудь утилиту, эквивалентную Windows, которую я мог бы заменить этой утилитой LINUX, которая принимала бы некоторые аналогичные переключатели для установки своих атрибутов, формулировки могут быть другими - это не было бы проблемой, я бы просто изменил их соответствующим образом.
Я думал, что Windows XZ Utils может быть именно таким, но, к сожалению, их xz.exe не принимает никаких переключателей, которые бы устанавливали его атрибуты, как это делает файл LINUX.
Есть ли какое-нибудь приложение для Windows (или, может быть, даже PHP-скрипт?), которое могло бы выполнять сжатие данных lzma1, аналогичное LINUX /usr/bin/xz
, которое я мог бы использовать под Windows?
🤔 А знаете ли вы, что...
PHP поддерживает работу с различными протоколами, такими как HTTP, FTP и многое другое.
Вот моя версия вашего кода, надеюсь, комментарии добавят ясности.
Во-первых, я не скачивал запрошенный вами файл, я использовал файл отсюда: https://tukaani.org/xz/old.html#_windows
Во-вторых, моя версия предполагает, что PHP-скрипт и файл xz.exe находятся в одной папке. Если у вас это не так, сначала попробуйте мою версию, а затем попытайтесь выяснить, как изменить путь.
В-третьих, моя версия тестировалась только в CLI, у меня нет возможности запускать PHP на моем компьютере с Windows (кроме как через WSL).
В-четвертых, этот код записывает некоторый образец текста в стандартный ввод и сжимает его, и в случае успеха он выводит двоичный текст (который бесполезен, но показывает, что он работает). Обычно вы сохраняете это на диск, в кодировке Base64 или что-то еще.
<?php
// Variable for the current directory
$dir = __DIR__;
// Absolute path to the binary. This code assumes that it is in the
// same folder as this PHP script.
$xz = $dir . DIRECTORY_SEPARATOR . 'xz';
// Pipes to read/write to
$descriptorspec = [
0 => ["pipe", "r"],
1 => ["pipe", "w"],
2 => ["pipe", "w"],
];
// Open the process. Use the array format so that automatic
// escaping is handled for you.
$process = proc_open(
[
$xz,
'--format=raw',
'--lzma1=lc=3,lp=0,pb=2,dict=128KiB',
'-c',
'-',
],
$descriptorspec,
$pipes
);
// Make sure the above worked
if (!$process){
throw new RuntimeException('Could not open proc');
}
// Write some text to the stream to compress. You could also use
// file_get_contents or one of the command line switches
fwrite($pipes[0], 'This is a test');
// We're done writing
fclose($pipes[0]);
// Grab the contents of stdout and stderr
$output = stream_get_contents($pipes[1]);
$error = stream_get_contents($pipes[2]);
fclose($pipes[1]);
fclose($pipes[2]);
// Clean up
if (!$return_value = proc_close($process)){
// Successfully ran the command, do something with $output
echo 'Output:', PHP_EOL, $output;
}else{
echo 'There was an error, the command returned: ' . $return_value;
echo PHP_EOL;
echo $error;
}