您的个人PHP助手:为什么自动化是一种超能力
想象一下周一的早晨。您来到办公室,打开笔记本电脑,所有日常事务都已处理完毕:备份已上传到服务器,提醒邮件已发送给客户,昨天的CSV报告已处理完毕并精美地打包成PDF。听起来像科幻小说?其实不然。
大多数PHP开发者(不仅限于PHP)会将高达30%的工作时间花在重复性的同类任务上。PHP自动化不是魔法,而是合理利用内置函数和少数几个库。今天我将向您展示5个真实脚本,您在阅读本文后10分钟内即可运行它们。
顺便说一句,如果您对Python自动化感兴趣,我们在PythonLib上有很棒的资料。但今天我们讨论PHP,因为它仍然在服务器端占据主导地位(高达77%的网站运行在PHP上)。
1. 自动清理和归档旧日志
日志文件像雪球一样越滚越大。昨天error.log文件还只有50MB,今天就已经500MB了。手动清理很痛苦。让我们编写一个PHP自动化脚本来处理这个任务。
脚本:LogRotator
<?phpclass LogRotator { private string $logDir; private string $archiveDir; private int $maxFileAgeDays;
public function __construct(string $logDir, string $archiveDir, int $maxFileAgeDays = 30) { $this->logDir = rtrim($logDir, '/'); $this->archiveDir = rtrim($archiveDir, '/'); $this->maxFileAgeDays = $maxFileAgeDays; }
public function rotate(): void { if (!is_dir($this->archiveDir)) { mkdir($this->archiveDir, 0755, true); }
$files = glob($this->logDir . '/*.log'); foreach ($files as $file) { $fileAge = time() - filemtime($file); if ($fileAge > $this->maxFileAgeDays * 86400) { $archiveName = $this->archiveDir . '/' . basename($file) . '.' . date('Ymd') . '.gz'; $gzData = gzencode(file_get_contents($file), 9); file_put_contents($archiveName, $gzData); unlink($file); echo "已归档: " . basename($file) . PHP_EOL; } } }}
// 使用方式:$rotator = new LogRotator('/var/log/myapp', '/backup/logs/archive');$rotator->rotate();?>这个PHP自动化脚本做了三件事:查找超过30天的文件,将其压缩为GZIP格式,并移动到归档目录。每周通过CRON运行一次——然后您就可以忘记“磁盘已满”的问题。
2. 批量发送个性化电子邮件通知
假设您有一个在线商店。客户下了一个订单,需要向他们发送一封包含详细信息的邮件。手动操作很愚蠢。PHP任务自动化使用内置的mail()函数或PHPMailer可以解决这个问题。
示例:发送购物车放弃提醒
<?phpfunction sendAbandonedCartReminder(string $email, string $customerName, array $items): bool { $subject = "您忘记了购物车,$customerName!🛒"; $message = "<h2>您好,$customerName!</h2>"; $message .= "<p>您留下了这些商品:</p><ul>"; foreach ($items as $item) { $message .= "<li>{$item['name']} - {$item['price']} 卢布</li>"; } $message .= "</ul><p><a href='https://yourshop.com/cart'>返回购物车</a></p>"; $headers = "MIME-Version: 1.0\\r"; $headers .= "Content-Type: text/html; charset=UTF-8\\r"; $headers .= "From: shop@yourshop.com\\r"; return mail($email, $subject, $message, $headers);}
// 批量发送:$customers = [ ['email' => 'ivan@example.com', 'name' => '伊