¿Por qué automatizar la rutina con PHP? O cómo hacer que la computadora trabaje por ti
\n\nImagina: cada mañana entras al servidor, ejecutas un backup de la base de datos, revisas los logs de errores, generas el informe del día anterior y se lo envías a tu jefe. Y luego, otra vez, y otra. ¿Aburrido? Demasiado. Y lo peor es perder el tiempo de un programador en lo que una máquina puede hacer.
\n\nPHP no es solo para sitios web. Este lenguaje es ideal para la automatización de tareas en PHP: desde renombrar archivos hasta hacer scraping de sitios web complejos. En este artículo te mostraré 10 ejemplos reales que te ahorrarán horas de trabajo. Todos los scripts funcionan y están probados: tómalos y úsalos.
\n\nPor cierto, si buscas soluciones listas para automatizar con PHP, has llegado al lugar indicado. ¡Allá vamos!
\n\n1. Envío automático de email con adjunto (informe PDF)
\n\nLa petición más común de las empresas: "Haz que los informes lleguen solos". Aquí tienes un script simple que envía un correo con un archivo PDF adjunto.
\n\n<?php\nfunction sendReportWithAttachment($to, $subject, $body, $filePath) {\n $boundary = md5(time());\n \n $headers = "MIME-Version: 1.0\\r\\n";\n $headers .= "From: report@mysite.com\\r\\n";\n $headers .= "Content-Type: multipart/mixed; boundary=\\"{$boundary}\\"\\r\\n";\n \n $message = "--{$boundary}\\r\\n";\n $message .= "Content-Type: text/plain; charset=utf-8\\r\\n\\r\\n";\n $message .= $body . "\\r\\n\\r\\n";\n \n if (file_exists($filePath)) {\n $content = file_get_contents($filePath);\n $content = chunk_split(base64_encode($content));\n $message .= "--{$boundary}\\r\\n";\n $message .= "Content-Type: application/pdf; name=\\"" . basename($filePath) . "\\"\\r\\n";\n $message .= "Content-Disposition: attachment; filename=\\"" . basename($filePath) . "\\"\\r\\n";\n $message .= "Content-Transfer-Encoding: base64\\r\\n\\r\\n";\n $message .= $content . "\\r\\n";\n }\n \n $message .= "--{$boundary}--";\n \n return mail($to, $subject, $message, $headers);\n}\n\n// Uso:\nsendReportWithAttachment(\n 'jefe@empresa.com',\n 'Informe diario del ' . date('d/m/Y'),\n 'Adjunto encontrarás el informe en PDF. Detalles en el archivo.',\n '/var/informes/informe_diario.pdf'\n);\n?>\n\nCómo automatizarlo: programa este script en cron para que se ejecute una vez al día y los informes se enviarán solos.
\n\n2. Scraping de un sitio web y guardado en CSV
\n\nSupongamos que necesitas recopilar precios de la competencia o una lista de ofertas de trabajo. El scraping web con PHP es sencillo. Usamos cURL y DOMDocument.
\n\n<?php\nfunction parseSiteToCSV($url, $cssSelector, $outputFile) {\n $ch = curl_init();\n curl_setopt($ch, CURLOPT_URL, $url);\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);\n curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)');\n \n $html = curl_exec($ch);\n curl_close($ch);\n \n if (!$html) {\n return false;\n }\n \n $dom = new DOMDocument();\n @$dom->loadHTML($html);\n $xpath = new DOMXPath($dom);\n \n $items = $xpath->query($cssSelector);\n \n $file = fopen($outputFile, 'w');\n fputcsv($file, ['Texto', 'Enlace']);\n \n foreach ($items as $item) {\n $text = trim($item->textContent);\n $link = $item->getAttribute('href') ?: '—';\n fputcsv($file, [$text, $link]);\n }\n \n fclose($file);\n return true;\n}\n\n// Ejemplo: extraemos titulares de noticias de un sitio\nparseSiteToCSV(\n 'https://news.ycombinator.com/',\n '//tr[@class="athing"]/td[@class="title"]/a',\n 'titulares_hacker_news.csv'\n);\n?>\n\nEste ejemplo de automatización de tareas con PHP se puede ejecutar cada hora para obtener datos actualizados sin hacer un solo clic.
\n\n3. Automatización de backups de base de datos
\n\nNunca está de más tener una copia de seguridad automática. Este script genera un backup de MySQL y lo comprime.
\n\n<?php\nfunction backupDatabase($host, $user, $pass, $dbName, $backupDir) {\n $date = date('Y-m-d_H-i-s');\n $filename = "{$backupDir}/{$dbName}_{$date}.sql.gz";\n \n $command = "mysqldump --host={$host} --user={$user} --password={$pass} {$dbName} | gzip > {$filename}";\n exec($command, $output, $returnCode);\n \n if ($returnCode === 0) {\n echo "Backup creado: {$filename}\\n";\n return $filename;\n } else {\n echo "Error al crear el backup.\\n";\n return false;\n }\n}\n\n// Uso:\nbackupDatabase('localhost', 'root', 'password', 'mi_app', '/var/backups');\n?>\n\nPrograma este script en cron para que se ejecute todas las noches y tendrás tus datos siempre seguros.
\n\n4. Generación de informes en Excel con PhpSpreadsheet
\n\n¿Necesitas enviar informes en formato Excel? Con la librería PhpSpreadsheet es muy fácil.
\n\n<?php\nrequire 'vendor/autoload.php';\n\nuse PhpOffice\\PhpSpreadsheet\\Spreadsheet;\nuse PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx;\n\nfunction generateExcelReport($data, $filename) {\n $spreadsheet = new Spreadsheet();\n $sheet = $spreadsheet->getActiveSheet();\n \n // Encabezados\n $sheet->setCellValue('A1', 'Producto');\n $sheet->setCellValue('B1', 'Precio');\n $sheet->setCellValue('C1', 'Stock');\n \n // Datos\n $row = 2;\n foreach ($data as $item) {\n $sheet->setCellValue("A{$row}", $item['producto']);\n $sheet->setCellValue("B{$row}", $item['precio']);\n $sheet->setCellValue("C{$row}", $item['stock']);\n $row++;\n }\n \n $writer = new Xlsx($spreadsheet);\n $writer->save($filename);\n echo "Informe Excel generado: {$filename}\\n";\n}\n\n// Ejemplo de uso:\n$productos = [\n ['producto' => 'Laptop', 'precio' => 1200, 'stock' => 15],\n ['producto' => 'Teclado', 'precio' => 45, 'stock' => 30],\n];\ngenerateExcelReport($productos, 'informe_productos.xlsx');\n?>\n\nEste script es perfecto para automatizar la generación de informes en PHP y enviarlos por correo.
\n\n5. Renombrado masivo de archivos
\n\n¿Tienes cientos de archivos con nombres incorrectos? Este script los renombra en segundos.
\n\n<?php\nfunction batchRenameFiles($directory, $prefix, $extension) {\n $files = glob("{$directory}/*.{$extension}");\n $counter = 1;\n \n foreach ($files as $file) {\n $newName = "{$directory}/{$prefix}_{$counter}.{$extension}";\n if (rename($file, $newName)) {\n echo "Renombrado: {$file} -> {$newName}\\n";\n $counter++;\n }\n }\n}\n\n// Uso:\nbatchRenameFiles('/var/uploads', 'foto', 'jpg');\n?>\n\nIdeal para automatizar tareas de administración de archivos con PHP.
\n\n6. Limpieza automática de archivos temporales
\n\nMantén tu servidor limpio eliminando archivos antiguos automáticamente.
\n\n<?php\nfunction cleanOldFiles($directory, $daysOld) {\n $files = glob("{$directory}/*");\n $now = time();\n \n foreach ($files as $file) {\n if (is_file($file)) {\n $fileAge = $now - filemtime($file);\n $days = $fileAge / (60 * 60 * 24);\n \n if ($days > $daysOld) {\n unlink($file);\n echo "Eliminado: {$file}\\n";\n }\n }\n }\n}\n\n// Elimina archivos de más de 30 días\ncleanOldFiles('/tmp/cache', 30);\n?>\n\nEjecútalo semanalmente con cron para mantener tu disco duro libre.
\n\n7. Monitoreo de disponibilidad de sitios web
\n\n¿Quieres saber si tu sitio web está caído? Este script te avisa por email.
\n\n<?php\nfunction checkWebsite($url, $adminEmail) {\n $ch = curl_init();\n curl_setopt($ch, CURLOPT_URL, $url);\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n curl_setopt($ch, CURLOPT_TIMEOUT, 10);\n curl_setopt($ch, CURLOPT_NOBODY, true);\n \n curl_exec($ch);\n $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n curl_close($ch);\n \n if ($httpCode >= 400) {\n $subject = "ALERTA: Sitio {$url} no disponible";\n $message = "El sitio {$url} respondió con código HTTP {$httpCode}.";\n mail($adminEmail, $subject, $message);\n echo "Alerta enviada a {$adminEmail}\\n";\n } else {\n echo "Sitio {$url} OK (código {$httpCode})\\n";\n }\n}\n\n// Uso:\ncheckWebsite('https://tusitio.com', 'admin@tusitio.com');\n?>\n\nEjecútalo cada 5 minutos desde cron y recibe alertas inmediatas si algo falla.
\n\n8. Descarga automática de archivos desde una URL
\n\n¿Necesitas descargar archivos regularmente? Este script lo hace por ti.
\n\n<?php\nfunction downloadFile($url, $destination) {\n $ch = curl_init();\n curl_setopt($ch, CURLOPT_URL, $url);\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);\n \n $content = curl_exec($ch);\n $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n curl_close($ch);\n \n if ($httpCode === 200 && $content) {\n file_put_contents($destination, $content);\n echo "Archivo descargado: {$destination}\\n";\n return true;\n } else {\n echo "Error al descargar {$url}\\n";\n return false;\n }\n}\n\n// Uso:\ndownloadFile('https://ejemplo.com/datos.csv', '/var/data/datos.csv');\n?>\n\nPerfecto para automatizar la descarga de archivos con PHP desde APIs o sitios externos.
\n\n9. Procesamiento de imágenes en lote
\n\nRedimensiona o comprime imágenes automáticamente con GD.
\n\n<?php\nfunction resizeImages($directory, $maxWidth, $maxHeight) {\n $images = glob("{$directory}/*.{jpg,jpeg,png,gif}", GLOB_BRACE);\n \n foreach ($images as $imagePath) {\n $info = getimagesize($imagePath);\n $width = $info[0];\n $height = $info[1];\n \n if ($width > $maxWidth || $height > $maxHeight) {\n $ratio = min($maxWidth / $width, $maxHeight / $height);\n $newWidth = (int)($width * $ratio);\n $newHeight = (int)($height * $ratio);\n \n $src = imagecreatefromstring(file_get_contents($imagePath));\n $dst = imagecreatetruecolor($newWidth, $newHeight);\n imagecopyresampled($dst, $src, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);\n \n imagejpeg($dst, $imagePath, 85);\n imagedestroy($src);\n imagedestroy($dst);\n echo "Redimensionada: {$imagePath}\\n";\n }\n }\n}\n\n// Uso:\nresizeImages('/var/uploads/images', 800, 600);\n?>\n\nIdeal para automatizar el procesamiento de imágenes en PHP en servidores de carga.
\n\n10. Sincronización de archivos entre servidores vía FTP
\n\nMantén tus servidores sincronizados automáticamente.
\n\n<?php\nfunction syncFilesFTP($localDir, $remoteDir, $ftpServer, $ftpUser, $ftpPass) {\n $conn = ftp_connect($ftpServer);\n ftp_login($conn, $ftpUser, $ftpPass);\n ftp_pasv($conn, true);\n \n $localFiles = glob("{$localDir}/*");\n \n foreach ($localFiles as $localFile) {\n $remoteFile = $remoteDir . '/' . basename($localFile);\n if (ftp_put($conn, $remoteFile, $localFile, FTP_BINARY)) {\n echo "Subido: {$localFile}\\n";\n }\n }\n \n ftp_close($conn);\n echo "Sincronización completada.\\n";\n}\n\n// Uso:\nsyncFilesFTP('/var/www/local', '/public_html', 'ftp.miservidor.com', 'usuario', 'contraseña');\n?>\n\nEjecútalo cada hora para mantener tus archivos sincronizados sin esfuerzo.
\n\nConclusión: automatiza tu trabajo con PHP
\n\nEstos 10 ejemplos de automatización de tareas con PHP te ayudarán a ahorrar tiempo y evitar errores humanos. Desde backups hasta scraping web, PHP es una herramienta poderosa para la automatización.
\n\n¿Mi consejo? Empieza con un script pequeño, pruébalo bien y luego prográmalo en cron. En una semana te preguntarás cómo trabajabas antes sin automatizar.
\n\nSi te ha gustado este artículo, compártelo con otros programadores que también merecen dejar de hacer tareas repetitivas. ¡Feliz automatización!