Не удалось сохранить отредактированный zip-архив (docx)

Итак, вот мой код:

<?php $zip = new ZipArchive; if ($zip->open('test.docx') === TRUE) { $xmlString = $zip->getFromName('word/document.xml'); $xmlString = str_replace('$FIRST_AND_LAST_NAME', 'John Doe', $xmlString); $zip->addFromString('word/document.xml', $xmlString); echo 'ok'; $zip->close(); } else { echo 'failed'; } 

Его цель проста. Он открывает файл test.docx, ищет все вхождения строки «$ FIRST_AND_LAST_NAME» и заменяет их «John Doe».

Он отлично работает на моем сервере разработки Windows (строка «John Doe» находится в документе, когда я его открываю).

Он не работает на моем производственном сервере Lunux (строка $ FIRST_AND_LAST_NAME) все еще существует, нет «John Doe»).

Нет ошибки или уведомления, «ok» печатается без каких-либо ошибок. Я убедился, что файл test.docx имеет привилегии, установленные на 777.

Если close() возвращает false, произошла ошибка с записью архива.

Используйте getStatusString для получения точного сообщения об ошибке.

Добавить sleep(1) перед $zip->addFromString('word/document.xml', $xmlString);

Он работает на моем Ubuntu 12.04

Не забудьте ввести переменную в то же время, когда вы создаете файл docx, я имею в виду никогда не набирать FIRST_AND_LAST_NAME а затем после этого вы добавляете символ $ . Он создает другой XML-код.

Хорошо, я использовал класс, который я нашел в phpclasses:

http://phpclasses.web4u.cz/package/6278-PHP-Edit-a-Zip-archive-in-pure-PHP-no-temporary-files.html

Вот рабочий код:

 private function GenerateDocx($theTemplate, array $theReplacemenArray, $theOutputFile) { $aSearchArray = array(); foreach(range('A','Z') as $aLetter) { $aSearchArray[] = str_repeat($aLetter, 5); } $aArrayCountDifference = count($aSearchArray) - count($theReplacemenArray); $aSearchArray = array_slice($aSearchArray, 0, -$aArrayCountDifference); require_once('tbszip.php'); $tbszip = new clsTbsZip(); $tbszip->Open($theTemplate); $aXmlPath = 'word/document.xml'; if (true === $tbszip->FileExists($aXmlPath)) { $aXmlString = $tbszip->FileRead($aXmlPath); $aXmlString = str_replace($aSearchArray, $theReplacemenArray, $aXmlString); if (1 != $tbszip->FileReplace($aXmlPath, $aXmlString)) { throw new Exception('FileReplace() failed.'); } $tbszip->Flush(TBSZIP_FILE, $theOutputFile); $tbszip->Close(); } }