7个实用的PHP代码片段:缓存、距离计算与文件下载等
本文将介绍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开发技巧和工具函数的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













