Неглубокое клонирование коллекции легко, но если вы хотите использовать глубокий клон, библиотека, вероятно, сделает вас лучше, чем ручное кодирование (так как вы хотите клонировать элементы внутри в коллекции) .
Так же, как этот ответ , я использовал библиотеку Cloner и, в частности, протестировал его против XStream (который может «клонировать» путем сериализации десериализация) и двоичной сериализации. Хотя XStream очень быстро выполняет сериализацию в / из xml, Cloner намного быстрее при клонировании:
0.0851 ms: xstream (клонирование путем сериализации / десериализации) 0.0223 ms: двоичная сериализация (клонирование путем сериализации / десериализации) 0.0017 ms: cloner * среднее время клонирования простого объекта (два поля) и стандартного конструктора public. Выполняйте 10 000 раз.
В дополнение к быстрому, здесь больше причин выбирать клонирование:
У меня была одна и та же проблема, но в конце концов я нашел несколько неясное решение и решил поделиться им здесь.
Я пришел по большим сценариям zip.lib.php
/ unzip.lib.php
, которые поставляются с phpmyadmin
и являются расположенный в каталоге «libraries».
Использование zip.lib.php
работало как прелесть для меня:
require_once(LIBS_DIR . 'zip.lib.php');
...
//create the zip
$zip = new zipfile();
//add files to the zip, passing file contents, not actual files
$zip->addFile($file_content, $file_name);
...
//prepare the proper content type
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=my_archive.zip");
header("Content-Description: Files of an applicant");
//get the zip content and send it back to the browser
echo $zip->file();
Этот скрипт позволяет загружать почтовый индекс без необходимости иметь файлы как реальные файлы или сохранение самого zip в качестве файла.
Позор, что эта функциональность не является частью более общей библиотеки PHP.
Вот ссылка на zip.lib.php
из источника phpmyadmin: https://github.com/phpmyadmin/phpmyadmin/blob/RELEASE_4_5_5_1/libraries/zip.lib.php
UPDATE: убедитесь, что вы удалили следующую проверку с начала zip.lib.php, иначе скрипт просто завершится:
if (! defined('PHPMYADMIN')) {
exit;
}
UPDATE: этот код доступен и для проекта CodeIgniter : https://github.com/patricksavalle/CodeIgniter/blob/439ac3a87a448ae6c2cbae0890c9f672efcae32d/system/ хелперы / zip_helper.php
Что касается вашего комментария о том, что php: // temp работает для вас, за исключением случаев, когда вы его закрываете, попробуйте оставить его открытым, очистить вывод, а затем перемотать обратно на 0 и прочитать его.
Посмотрите еще несколько примеров: http://us.php.net/manual/en/function.tmpfile.php
Также исследует выходную буферизацию и захват: http://us.php.net/manual/en/function.ob-start.php
Есть ли проблема производительности здесь, или это просто оскорбляет ваше чувство правильности? Многие процессы записывают временные файлы и удаляют их, и часто они никогда не попадают на диск из-за кэширования.
Временной файл автоматически удаляется при закрытии. Вот в чем его природа.
Есть только два способа создать zip-файл в памяти и обслуживать его, и оба они, вероятно, больше проблем, чем они того стоят.
, что вы используете для создания архива? Возможно, вы сможете использовать память потока php: // temp или php: // для чтения и записи в / из архива.
Вам нужно использовать ZipArchive::addFromString
- если вы используете addFile()
, файл фактически не добавляется до тех пор, пока вы не закроете его. (Ужасная ошибка IMHO, если вы пытаетесь переместить файлы в zip, и вы удаляете их, прежде чем закрыть zip ...) Метод addFromString()
немедленно добавляет его в архив.