PHP zip_open () и php: // temp, не могу открыть - PullRequest
6 голосов
/ 02 августа 2011

Не уверен, что это возможно, но сейчас это стало академической борьбой.

Используя трюк __halt_compiler() для встраивания бинарных данных в файл PHP, я успешно создал самораскрывающийся скрипт, который будет fseek() до __COMPILER_HALT_OFFSET__ ( не слишком сложным, поскольку этот точный пример документально подтверждено в руководстве )

В любом случае, после моего звонка на __halt_compiler()

я сохранил небольшой кусочек бинарных ZIP-данных ( одна папка, содержащая один файл с надписью "hello world" ).

Я пытался скопировать данные непосредственно в поток php://temp, и с успехом сделал это (, если I rewind() и passthru() дескриптор временного потока, он сбрасывает данные )

$php = fopen(__FILE__, 'rb');
$tmp = fopen('php://temp', 'r+b');
fseek($php, __COMPILER_HALT_OFFSET__);
stream_copy_to_stream($php, $tmp);

Моя проблема связана с попыткой открыть php://temp 1 с помощью zip_open()

$zip = zip_open('php://temp');

1 Из того, что я вижу (, несмотря на другие такие возможности, как отсутствие поддержки потока с zip_open()), проблема здесь заключается в непостоянстве данных в php://memory и php://temp потоки между дескрипторами. Если это можно обойти, возможно, это действительно возможно.

Продолжает возвращаться код ошибки 11, который я нашел нет 2 документация по (, похоже, как и большинство других возможных кодов ошибок )

var_dump($zip); // int(11)

2 Как указал @cweiske, код ошибки 11 = ZipArchive::ER_OPEN, Не удается открыть файл

Является ли это следствием моей попытки использовать поток php://temp или какой-либо другой возможной проблемой? Я также знаю, что существует подход ООП (ZipArchive и др. ), но я решил, что начну с основ.

Есть идеи?

1 Ответ

2 голосов
/ 02 августа 2011

11 - это константа ZIPARCHIVE::ER_OPEN, которую руководство описывает с помощью

Не могу открыть файл

Обратите внимание, что в руководстве не указано, что можно использовать потоковые упаковщики.


Пожалуйста, подумайте об использовании расширения PHP phar - оно делает то, что вы хотите, и хорошо протестировано.

...