7个实用的PHP代码片段:缓存、距离计算与文件下载等

温以宁
温以宁
发布时间:2026-10-15 | 6人浏览过
原创

本文将介绍7个实用的PHP代码片段,包括无需框架的简单页面缓存方案、利用Haversine公式计算地理位置距离、秒数转换为年月日时分秒、实现浏览器强制文件下载、以及调用Google API快速获取天气和地址经纬度的功能函数。

1. 简易PHP页面缓存

在不依赖CMS或复杂框架的情况下,可以通过简单的文件读写机制为静态内容建立临时缓存。该逻辑会检查缓存文件是否过期(如设置为5小时),若未过期则直接读取旧文件并终止脚本;若需重新生成,则使用输出控制缓冲 ob_start() 捕获HTML,写入文件后刷新缓冲区。

<?php
// 定义缓存文件路径,文件名基于日期命名
$cachefile = 'cached-files/'.date('M-d-Y').'.php';
// 设置缓存存活时间(秒),示例为5小时(18000秒)
$cachetime = 18000;

// 判断缓存是否存在且未过期
if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) {
    include($cachefile); // 读取缓存内容
    exit;                // 结束执行
}

// 开启输出缓冲,准备捕获即将输出的HTML
ob_start(); 
?
>
<html>

</html>
<?php
// 将捕获的内容写入缓存文件
$fp = fopen($cachefile, 'w');
fwrite($fp, ob_get_contents());
fclose($fp);
// 将当前生成的内容发送给浏览器
ob_end_flush(); 
?>

2. 计算两个地理位置的距离

该函数利用球面三角学原理计算两点间的距离。接收起始点和终点的经纬度及目标单位(K-公里, N-海里, 默认英里),返回换算后的数值。

function distance($lat1, $lon1, $lat2, $lon2, $unit) {
    $theta = $lon1 - $lon2;
    // 核心计算公式
    $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
    $dist = acos($dist);
    $dist = rad2deg($dist);
    $miles = $dist * 60 * 1.1515; // 转换为英里
    
    $unit = strtoupper($unit);
    if ($unit == "K") {
        return ($miles * 1.609344); // 返回公里
    } else if ($unit == "N") {
        return ($miles * 0.8684);   // 返回海里
    } else {
        return $miles;              // 返回英里
    }
}

3. 将秒数转换为时间结构

用于将长时间跨度(秒数)拆解为更易读的年、天、时、分、秒数组结构,适合用于显示“运行了多久”或倒计时解析。

function Sec2Time($time){
    if(is_numeric($time)){
        $value = array(
            "years" => 0, "days" => 0, "hours" => 0,
            "minutes" => 0, "seconds" => 0,
        );
        if($time >= 31556926){
            $value["years"] = floor($time/31556926);
            $time = ($time%31556926);
        }
        if($time >= 86400){
            $value["days"] = floor($time/86400);
            $time = ($time%86400);
        }
        if($time >= 3600){
            $value["hours"] = floor($time/3600);
            $time = ($time%3600);
        }
        if($time >= 60){
            $value["minutes"] = floor($time/60);
            $time = ($time%60);
        }
        $value["seconds"] = floor($time);
        return (array) $value;
    }else{
        return (bool) FALSE;
    }
}

4. 强制触发文件下载

对于图片、音频等非文本资源,浏览器通常会尝试在线预览。以下代码通过发送特定的HTTP响应头(特别是 Content-Disposition: attachment),强制浏览器启动下载对话框而非直接在页面打开。

function downloadFile($file){
    $file_name = $file;
    $mime = 'application/force-download';
    header('Pragma: public'); // 必要,兼容旧客户端
    header('Expires: 0');     // 清除缓存
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Cache-Control: private',false);
    header('Content-Type: '.$mime);
    // 设置附件方式下载,指定文件名
    header('Content-Disposition: attachment; filename="'.basename($file_name).'"');
    header('Content-Transfer-Encoding: binary');
    header('Connection: close');
    readfile($file_name); // 推送文件流
    exit();
}

5. 获取指定城市的天气信息

利用SimpleXML解析Google天气API(需替换 ADDRESS 为城市名),快速获取当前天气状况描述。注意此方法依赖于第三方服务的稳定性。

$xml = simplexml_load_file('http://www.google.com/ig/api?weather=ADDRESS');
$information = $xml->xpath("/xml_api_reply/weather/current_conditions/condition");
echo $information[0]->attributes();

6. 根据地址获取经纬度

抓取Google Maps相关页面的原始数据,通过正则表达式提取特定地址对应的经度和纬度坐标。使用前请确保网络环境可访问目标域名。

function getLatLong($address){
    if (!is_string($address))die("All Addresses must be passed as a string");
    $_url = sprintf('http://maps.google.com/maps?output=js&q=%s',rawurlencode($address));
    $_result = false;
    if($_result = file_get_contents($_url)) {
        // 验证返回结果是否为错误信息
        if(strpos($_result,'errortips') > 1 || strpos($_result,'Did you mean:') !== false) return false;
        // 正则匹配中心点坐标
        preg_match('!center:\s*{lat:\s*(-?\d+\.\d+),lng:\s*(-?\d+\.\d+)}!U', $_result, $_match);
        $_coords['lat'] = $_match[1];
        $_coords['long'] = $_match[2];
    }
    return $_coords;
}

7. 获取网站Favicon图标链接

利用Google提供的Favicon服务接口,仅需传入网址即可生成对应的图标URL,常用于在列表中展示网站的视觉标识。

function get_favicon($url){
    $url = str_replace("http://",'',$url); // 去除协议前缀
    return "http://www.google.com/s2/favicons?domain=".$url;
}

以上就是这7个PHP实用代码片段的详细内容,更多关于PHP开发技巧和工具函数的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表