福建二哥
个人技术博客分享

PHP短信发送功能实现与优化指南

分类: 编程脚本 时间:2025-09-16 08:55:15 浏览:11次 评论:0
摘要:PHP短信发送系统实现指南:涵盖基础功能、异常处理、性能优化、安全措施及监控日志,提供完整代码示例与最佳实践,助您构建高效稳定的短信服务。

1. 实现基础功能

1.1 选择短信服务提供商

首先需要选择可靠的短信服务提供商(如阿里云、腾讯云、Twilio等),注册账号并获取API密钥、访问密钥等必要信息。

1.2 安装必要的扩展

确保PHP环境已安装cURL扩展,用于发送HTTP请求:

sudo apt-get install php-curl

1.3 基础发送功能实现

<?php
class SmsSender {
    private $apiKey;
    private $apiSecret;
    private $endpoint;

    public function __construct($apiKey, $apiSecret, $endpoint) {
        $this->apiKey = $apiKey;
        $this->apiSecret = $apiSecret;
        $this->endpoint = $endpoint;
    }

    public function sendSMS($phoneNumber, $message) {
        $data = [
            'phone' => $phoneNumber,
            'message' => $message,
            'timestamp' => time()
        ];

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $this->endpoint);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Authorization: Bearer ' . $this->generateSignature($data)
        ]);

        $response = curl_exec($ch);
        curl_close($ch);

        return json_decode($response, true);
    }

    private function generateSignature($data) {
        ksort($data);
        $signString = http_build_query($data) . $this->apiSecret;
        return hash_hmac('sha256', $signString, $this->apiKey);
    }
}
?>

2. 功能优化

2.1 异常处理机制

public function sendSMS($phoneNumber, $message) {
    try {
        // 参数验证
        if (!preg_match('/^\+?[1-9]\d{1,14}$/', $phoneNumber)) {
            throw new InvalidArgumentException('Invalid phone number format');
        }

        if (empty(trim($message))) {
            throw new InvalidArgumentException('Message cannot be empty');
        }

        // 发送逻辑...

    } catch (Exception $e) {
        error_log('SMS sending failed: ' . $e->getMessage());
        return ['success' => false, 'error' => $e->getMessage()];
    }
}

2.2 请求超时设置

curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 30秒超时
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 10秒连接超时

2.3 重试机制

public function sendWithRetry($phoneNumber, $message, $maxRetries = 3) {
    $attempt = 0;

    while ($attempt < $maxRetries) {
        $result = $this->sendSMS($phoneNumber, $message);

        if ($result['success']) {
            return $result;
        }

        $attempt++;
        sleep(2 * $attempt); // 指数退避
    }

    return ['success' => false, 'error' => 'Max retries exceeded'];
}

3. 性能优化

3.1 连接池管理

使用持久连接减少TCP握手开销:

curl_setopt($ch, CURLOPT_FORBID_REUSE, false);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, false);

3.2 批量发送支持

public function sendBatch($messages) {
    $multiHandle = curl_multi_init();
    $handles = [];

    foreach ($messages as $index => $message) {
        $handles[$index] = $this->prepareCurlHandle($message);
        curl_multi_add_handle($multiHandle, $handles[$index]);
    }

    $running = null;
    do {
        curl_multi_exec($multiHandle, $running);
        curl_multi_select($multiHandle);
    } while ($running > 0);

    $results = [];
    foreach ($handles as $index => $handle) {
        $results[$index] = curl_multi_getcontent($handle);
        curl_multi_remove_handle($multiHandle, $handle);
        curl_close($handle);
    }

    curl_multi_close($multiHandle);
    return $results;
}

3.3 异步处理

对于大量短信发送,建议使用消息队列:

// 使用Redis队列示例
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 将短信任务加入队列
$redis->lpush('sms_queue', json_encode([
    'phone' => $phoneNumber,
    'message' => $message,
    'timestamp' => time()
]));

4. 安全考虑

4.1 敏感信息保护

// 使用环境变量存储密钥
$apiKey = getenv('SMS_API_KEY');
$apiSecret = getenv('SMS_API_SECRET');

// 或在配置文件中设置访问权限

4.2 频率限制

public function checkRateLimit($phoneNumber) {
    $key = 'sms_limit:' . $phoneNumber;
    $redis = new Redis();
    $count = $redis->incr($key);

    if ($count == 1) {
        $redis->expire($key, 3600); // 1小时限制
    }

    return $count <= 10; // 每小时最多10条
}

5. 监控与日志

5.1 详细日志记录

class SmsLogger {
    public static function log($phoneNumber, $message, $status, $response = null) {
        $logData = [
            'timestamp' => date('Y-m-d H:i:s'),
            'phone' => substr($phoneNumber, 0, 3) . '****' . substr($phoneNumber, -4),
            'message_length' => strlen($message),
            'status' => $status,
            'response' => $response
        ];

        file_put_contents(
            '/var/log/sms.log', 
            json_encode($logData) . PHP_EOL, 
            FILE_APPEND
        );
    }
}

5.2 性能监控

$startTime = microtime(true);
// 发送短信操作
$endTime = microtime(true);
$duration = ($endTime - $startTime) * 1000; // 毫秒

// 记录性能数据
Metrics::record('sms_latency', $duration);

6. 最佳实践总结

  1. 选择合适的服务商:根据业务需求选择可靠的短信服务提供商
  2. 实现错误处理:完善的异常处理和重试机制
  3. 性能优化:使用连接池、批量处理和异步队列
  4. 安全保障:保护敏感信息,实施频率限制
  5. 监控告警:建立完整的监控和日志系统
  6. 测试验证:定期测试短信发送功能,确保服务稳定

通过以上实现和优化措施,可以构建一个高效、稳定、安全的PHP短信发送系统。

评论留言请发表您的神机妙论……

昵称

邮箱

地址

私密评论
评论列表(共有0条评论)