Не уверен, что это возможно, но теперь это стало академической борьбой.
Используя __halt_compiler()
для встраивания двоичных данных в файл PHP, я успешно создал сценарий самообслуживания, который будет fseek()
до __COMPILER_HALT_OFFSET__
( не слишком сложно увидеть, как этот точный пример задокументирован в руководстве )
В любом случае, я записал небольшой кусок двоичных данных ZIP ( одна папка, содержащая один файл, который говорит «привет мир» ) после моего вызова __halt_compiler()
То, что я пытался сделать, это скопировать данные непосредственно в поток php://temp
и сделать это с успехом ( если я 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()
), проблема здесь заключается в неотъемлемойzip_open()
данных вphp://memory
иphp://temp
потоках между ручками. Если это можно обойти, возможно, это действительно возможно.
Он продолжает отменять код ошибки 11
, на который я не нашел 2 документации (по- видимому, как и большинство других возможных кодов ошибок )
var_dump($zip); // int(11)
2 Как отметил @cweiske, код ошибки
11 = ZipArchive::ER_OPEN
, не11 = ZipArchive::ER_OPEN
открыть файл
Является ли это следствием для моей попытки использования потока php://temp
или какой-либо другой возможной проблемы? Я также знаю, что существует подход ООП ( ZipArchive
и др. ), Но я решил, что начну с основ.
Есть идеи?
11 – это постоянный ZIPARCHIVE::ER_OPEN
, который описывается в руководстве с помощью
Не удается открыть файл
Обратите внимание, что в руководстве не указано, что могут использоваться обертки потоков.
Пожалуйста, подумайте об использовании PHP phar extension – он делает то, что вы хотите, и хорошо протестирован.