Windows-эквивалент специального инструмента сжатия LINUX

В 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 и многое другое.


71
1

Ответ:

Решено

Вот моя версия вашего кода, надеюсь, комментарии добавят ясности.

Во-первых, я не скачивал запрошенный вами файл, я использовал файл отсюда: 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;
}