CREAR ARCHIVO ZIP ERROR

hola estoy intentando crear archivos zip en yii

pero tengo varios problemas


private function zip(){			

		$zipFile = "descargas.zip";

		$zipArchive = new \ZipArchive();

		if (!$zipArchive->open($zipFile, \ZIPARCHIVE::CREATE )) die("error al crear el zip\n");

		$zipArchive->addGlob("results/*");

		if (!$zipArchive->status == \ZIPARCHIVE::ER_OK) echo "OK... zip\n";

		$zipArchive->close();

		echo $zipFile;


	}

estoy usando


\ZipArchive()

porque si uso


ZipArchive()

, me dice que


Class 'app\controllers\ZipArchive' not found

pero incluso con "\" antes de ziparchive tengo errores, No marca ningun error pero simplemente cuando busco en las carpetas no hay ningun archivo zip.

Por cierto mi php.ini no tiene esta sentencia extension=php_zip.dll y tampoco la de xdebug… PORQUE? PORQUE? PORQUE?

Saben como puedo solucionar esto de ziP? Intente con un simple archivo y con todo un directorio pero nada…

De ante mano… MUCHAS GRACIAS.

Este es un ejemplo muy simple para crear un zip:




 $cadena = 'prueba de zip';

 $zip = new ZipArchive;

 $res = $zip->open('test.zip', ZipArchive::CREATE);

 $zip->addFromString('archivo.txt', $cadena);

 $zip->close();



sin indicar rutas debería crear un archivo test.zip en la carpeta web, es decir donde esta el archivo index.php

Por lo demas utilizar la documentacion de la libreria ZipArchive de php.

Espero que te ayude, saludos

Esta es la función que uso para crear el zip.


public function zipping(){

		$rootPath = realpath('results/');


		// Initialize archive object

		$zip = new \ZipArchive();

		$zip->open('../web/Region.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);


		// Initialize empty "delete list"

		$filesToDelete = array();


		// Create recursive directory iterator

		/** @var SplFileInfo[] $files */

		$files = new RecursiveIteratorIterator(

		    new RecursiveDirectoryIterator($rootPath),

		    RecursiveIteratorIterator::LEAVES_ONLY

		);


		foreach ($files as $name => $file)

		{

		    // Skip directories (they would be added automatically)

		    if (!$file->isDir())

		    {

		        // Get real and relative path for current file

		        $filePath = $file->getRealPath();

		        $relativePath = substr($filePath, strlen($rootPath) + 1);


		        // Add current file to archive

		        $zip->addFile($filePath, $relativePath);


		        // Add current file to "delete list"

		        // delete it later cause ZipArchive create archive only after calling close function and ZipArchive lock files until archive created)

		        if ($file->getFilename() != 'important.txt')

		        {

		            $filesToDelete[] = $filePath;

		        }

		    }

		}


		// Zip archive will be created only after closing object

		$zip->close();


		// Delete all files from "delete list"

		foreach ($filesToDelete as $file)

		{

		    unlink($file);

		}


	}

Esa funcion esta dentro de ExportarControler.

Me devuelve el error


Class 'app\controllers\ZipArchive' not found

Pero eso solo ocurre en la webapp de yii. Puesto que probé el codigo fuera de yii2 y funcionó perfectamente.

Sería ExportarController (no controler), y en Yii 1 ese no es su sitio, sino en la carpeta components o extensions, y asegurate de que se carga al iniciar la aplicación (en config/main).

Trabajo en yii2.

Ziparchive esta incluido en el core de php.

Debía usar "\" antes de cada función de ziparchive, debido al namespace.

Gracias a todos

Pues si está incluído en PHP solo tienes que usarlo, pensé que podía ser una clase que no tienes cargada.

Lo de usar new \Ziparchive() no lo entiendo.

Es verdad maurocrispin21 tiene razón, yo hice la prueba lo más simple posible y no me fije que estaba en el controlador.

Si pones el ejemplo que hice en un archivo php donde no haya al principio una linea del tipo namespace …

estas trabajando en el spacio de nombres global, el que utiliza php y la función es accesible.

Como trabaja en un controlador ha cambiado de espacio de trabajo (la 1ª linea del archivo del controlador) y por ello para llamar a funciones de otros espacios de trabajo debe indicarlo, por ejemplo poniendo la ruta global.

Muy bien por poner la respuesta, saludos a todos