Тот факт, что у вас проблемы с темпераментом, говорит о том, что у вас может быть та же проблема, с которой я столкнулся, - которая не имеет ничего общего с кодом.
Я вытаскиваю свой zip с удаленного сервера, используя cURL, а затем извлекаю локально сохраненный zip. Иногда это работает, иногда нет ... это вызвало некоторое серьезное перетягивание волос.
Я загружаю свой zip-файл через filezilla, и я обнаружил, что он часто вылетает, повторяется несколько раз и в конце концов работает. Загруженный файл имеет правильный размер и выглядит как успешно загруженный, но если я загружаю его снова, иногда он просто поврежден и не может быть разархивирован.
Пока я проверяю, что мой загруженный zip-файл в порядке, мой скрипт работает нормально ... вот оно:
$zip_url = "http://www.mydomain.com.au/";
$version = "1.0.1.zip"; // zip name
$ch = curl_init();
$tmp_zip = fopen($version, 'w'); // open local file for writing
curl_setopt($ch, CURLOPT_URL, "$zip_url$version"); // pull remote file
curl_setopt($ch, CURLOPT_FILE, $tmp_zip); // save to local file
$data = curl_exec($ch); // do execute
curl_close($ch);
fclose($tmp_zip); // close local file
// extract latest build
$zip = new ZipArchive;
$zip->open($version);
$result = $zip->extractTo("."); // extract to this directory
$zip->close();
if ($result) @unlink($version); // delete local zip if extracted
else echo "failed to unzip";
Одно большое отличие моего кода от предыдущего ответа состоит в том, что я использую CURLOPT_FILE, а не CURLOPT_RETURNTRANSFER. Вы можете прочитать, почему CURLOPT_FILE лучше подходит для крупных переводов, по адресу:
www.phpriot.com/articles/download-with-curl-and-php