ThinkPHP5 后台不使用API路由
THINKPHP5开发API接口路由容易影响后台管理系统访问,需在route.php中使用路由变量规则定义API路由Route::pattern('ver','^v\d+');
此时定义API路由Route::get(':ver/version', "api/common/get_version");
THINKPHP5开发API接口路由容易影响后台管理系统访问,需在route.php中使用路由变量规则定义API路由Route::pattern('ver','^v\d+');
此时定义API路由Route::get(':ver/version', "api/common/get_version");
工作过程需要定时查询某些关键在百度、360及搜狗中的排序,于是写了一个简单的查询类,有更好的方法或错误可以回复交流。
基本思路:根据关键词搜索结果匹配所在页面中的排序值
ThinkPHP5 /extend/org/util/KeyRank.php
<?php
namespace org\util;
error_reporting(E_ALL & ~E_NOTICE);
/**
* 获取关键词在百度、360、搜狗排名
*
* Author: IceCry <http://www.zhinizhiwo.com>
*
* @param string $key 检测关键字
* @param string $url 检测域名
* @param integer $deep 页面深度
* @param integer $start 起始页面
* @param integer $trytime尝试次数
*
* @return integer 排名(不包含竞价广告,为自然排名)
*/
class KeyRank{
private static $url;
private static $key;
private static $start;
private static $deep;
private static $trytime;
public function __construct($key='', $url='', $deep=3, $start=1, $trytime=3) {
if($key==='' || $url===''){
die('key & url required !');
}
self::$url = $url;
self::$key = $key;
self::$deep = $deep;
self::$start = $start;
self::$trytime = $trytime;
}
//百度
public static function baiduRank(){
$rank=$page=0;
$res = ['rank'=>$rank, 'page'=>$rank];
for ($d=self::$start; $d <= self::$deep; $d++) {
$pn = 10*($d-1);
$url = "http://www.baidu.com/s?ie=utf-8&wd=".urlencode(self::$key).'&pn='.$pn;
$str = self::https_request($url);
preg_match("/<div id=\"content_left\">.*?<div id=\"rs\">/ism", $str, $content);
$str = $content[0];
$arr = explode('<div class="result', $str);
// var_dump($arr);die;
if(!$arr[0]){
for ($i=0; $i < self::$trytime; $i++) {
$str = self::https_request($url);
preg_match("/<div id=\"content_left\">.*?<div id=\"rs\">/ism", $str, $content);
$str = $content[0];
$arr = explode('<div class="result', $str);
if($arr[0] != ''){
break;
}
sleep(3);
}
if(!$arr[0]){
$err = date('Y/m/d H:i:s')."【错误】#百度#关键词@".self::$key."@页面抓取失败\r\n";
file_put_contents('./err.log', $err, FILE_APPEND);
break;
}
}
foreach ($arr as $k => $v) {
if($k==0) continue;
// preg_match("/<div class=\"f13\">.*?<\/a>/ism", $v, $xxx);
preg_match("/class=\"c-showurl\".*?>.*?<\/[^b|.]*?>/ism", $v, $xxx);
if(isset($xxx[0]) && strstr(strip_tags($xxx[0]), self::$url)){
global $rank, $page;
$page = $d;
$rank = $k + ($d-1)*10;
break;
}
}
if($rank){
$res['rank'] = $rank;
$res['page'] = $page;
return $res;
}
}
return $res;
}
//360
public static function soRank(){
$rank=$page=0;
$res = ['rank'=>$rank, 'page'=>$rank];
for ($d=self::$start; $d <= self::$deep; $d++) {
$url = "https://www.so.com/s?ie=utf-8&fr=so.com&src=home_so.com&q=".urlencode(self::$key)."&pn=".$d;
$str = self::https_request($url);
preg_match("/<ul class=\"result\">.*?<div id=\"side\">/ism", $str, $content);
$str = $content[0];
$arr = explode('<li class="res-list', $str);
if(!$arr[0]){
for ($i=0; $i < self::$trytime; $i++) {
$str = self::https_request($url);
preg_match("/<ul class=\"result\">.*?<div id=\"side\">/ism", $str, $content);
$str = $content[0];
$arr = explode('<li class="res-list', $str);
if($arr[0] != ''){
break;
}
sleep(3);
}
if(!$arr[0]){
$err = date('Y/m/d H:i:s')."【错误】#360#关键词@".self::$key."@页面抓取失败\r\n";
file_put_contents('./err.log', $err, FILE_APPEND);
break;
}
}
foreach ($arr as $k => $v) {
if($k==0) continue;
preg_match("/<cite>.*?<\/cite>/ism", $v, $xxx);
if(isset($xxx[0]) && strstr(strip_tags($xxx[0]), self::$url)){
global $rank, $page;
$page = $d;
$rank = $k + ($d-1)*10;
break;
}
}
if($rank){
$res['rank'] = $rank;
$res['page'] = $page;
return $res;
}
}
return $res;
}
//搜狗
public static function sogouRank(){
$rank=$page=0;
$res = ['rank'=>$rank, 'page'=>$rank];
for ($d=self::$start; $d <= self::$deep; $d++) {
$url = "https://www.sogou.com/web?query=".urlencode(self::$key)."&page=".$d;
$str = self::https_request($url);
preg_match("/<div class=\"results\".*?<div class=\"right\"/ism", $str, $content);
$str = $content[0];
$arr = explode('<!-- a -->', $str);
if(!$arr[0]){
for ($i=0; $i < self::$trytime; $i++) {
$str = self::https_request($url);
preg_match("/<div class=\"results\".*?<div class=\"right\"/ism", $str, $content);
$str = $content[0];
$arr = explode('<!-- a -->', $str);
if($arr[0] != ''){
break;
}
sleep(3);
}
if(!$arr[0]){
$err = date('Y/m/d H:i:s')."【错误】#搜狗#关键词@".self::$key."@页面抓取失败\r\n";
file_put_contents('./err.log', $err, FILE_APPEND);
break;
}
}
//sogou首页个数非稳定10个 判断排名依据
foreach ($arr as $k => $v) {
$total = count($arr);
if($k==0) continue;
preg_match("/<cite.*?>.*?<\/cite>/ism", $v, $xxx);
if(isset($xxx[0]) && strstr(strip_tags($xxx[0]), self::$url)){
global $rank, $page;
$page = $d;
// $rank = $k + ($d-1)*10;
$tmp += $total;
$rank = $k + $tmp - $total;
break;
}
}
if($rank){
$res['rank'] = $rank;
$res['page'] = $page;
return $res;
}
}
return $res;
}
//curl
public static function https_request($url, $data = null){
$headers = array(
"Content-type:application/html;charset=utf-8",
"User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36",
'Cache-Control:no-cache'
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_TIMEOUT,3);
if (!empty($data)){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
}
/*$KeyRank = new KeyRank('婧氏纸尿裤', 'magibaby.net', 2);
$baidu = $KeyRank::baiduRank();
$so = $KeyRank::soRank();
$sogou = $KeyRank::sogouRank();
var_dump($baidu);
var_dump($so);
var_dump($sogou);*/ 支持PHP5.5+
项目中大部分加密基于MD5+SALT,事实上password_hash()已经帮我们处理好了加盐。加进去的随机子串通过加密算法自动保存着,成为哈希的一部分。password_verify()会把随机子串从中提取,所以你不必使用另一个数据库来记录这些随机子串,大大简化了计算密码哈希值和验证密码的操作。
使用PHP自带的一个函数:array_column() ,该函数的作用是返回输入数组中某个单一列的值。
$firms = M('lawfirm')->where('status=1')->field('id')->select();
$firmids = array_column($firms, 'id');
$who = implode(',', $firmids);或是通过foreach进行拼装。
PHP实现页面执行中显示执行信息
set_time_limit(0); //在有关数据库的大量数据的时候,可以将其设置为0,表示无限制。
ob_end_clean(); //在循环输出前,要关闭输出缓冲区
echo str_pad('',1024); //浏览器在接受输出一定长度内容之前不会显示缓冲输出,这个长度值 IE是256,火狐是1024,不会出现上下的拉动条。
for($i=1;$i<=100;$i++){
echo $i.'<br>';
flush(); //刷新输出缓冲
sleep(1); //这个控制输出的速度。
} function fix_pre($str, $fix='0', $len=2, $type=STR_PAD_LEFT){
$str = str_pad($str, $len, $fix, $type);
return $str;
}
{:fix_pre($seats['seats'], '0', 3)}
项目中需要读取php中图片保存到服务器同时将图片地址写入数据库,phpexcel示例代码如下:
<?php
ini_set("display_errors",1);
include 'PHPExcel.php';
include 'PHPExcel/IOFactory.php';
define('EXCEL_EXTENSION_2003', "xls");
define('EXCEL_EXTENSION_2007', "xlsx");
$fileName2003 = "file.xls";
$fileName2007 = "file.xlsx";
$fileName = $fileName2003;
//$fileName = $fileName2007;
if(getExtendFileName($fileName) == EXCEL_EXTENSION_2003)
{
$reader = PHPExcel_IOFactory::createReader('Excel5');
}
else if(getExtendFileName($fileName) == EXCEL_EXTENSION_2007)
{
$reader = new PHPExcel_Reader_Excel2007();
}
$PHPExcel = $reader->load($fileName);
$worksheet = $PHPExcel->getActiveSheet();
$imageInfo = extractImageFromWorksheet($worksheet,"savepath/");
print_r($imageInfo);
/**
* 检测文件类型
*
* @param <type> $file_name The file name
*
* @return <type> The extend file name.
*/
function getExtendFileName($file_name) {
$extend = pathinfo($file_name);
$extend = strtolower($extend["extension"]);
return $extend;
}
/**
* 获取图片
*
* @param <type> $worksheet The worksheet
* @param <type> $basePath The base path
*
* @return array ( description_of_the_return_value )
*/
function extractImageFromWorksheet($worksheet, $basePath){
$result = array();
$imageFileName = "";
foreach ($worksheet->getDrawingCollection() as $drawing) {
$xy=$drawing->getCoordinates();
$path = $basePath;
// for xlsx
if ($drawing instanceof PHPExcel_Worksheet_Drawing) {
$filename = $drawing->getPath();
$imageFileName = $drawing->getIndexedFilename();
$path = $path . $drawing->getIndexedFilename();
copy($filename, $path);
$result[$xy] = $path;
// for xls
} else if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) {
$image = $drawing->getImageResource();
$renderingFunction = $drawing->getRenderingFunction();
switch ($renderingFunction) {
case PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG:
$imageFileName = $drawing->getIndexedFilename();
$path = $path . $drawing->getIndexedFilename();
imagejpeg($image, $path);
break;
case PHPExcel_Worksheet_MemoryDrawing::RENDERING_GIF:
$imageFileName = $drawing->getIndexedFilename();
$path = $path . $drawing->getIndexedFilename();
imagegif($image, $path);
break;
case PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG:
$imageFileName = $drawing->getIndexedFilename();
$path = $path . $drawing->getIndexedFilename();
imagegif($image, $path);
break;
case PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT:
$imageFileName = $drawing->getIndexedFilename();
$path = $path . $drawing->getIndexedFilename();
imagegif($image, $path);
break;
}
$result[$xy] = $imageFileName;
}
}
return $result;
} <?php
//屏蔽北上广
$ip = get_client_ip();
// $url = "http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;
$url = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=".$ip;
$data = https_request($url);
$data = json_decode($data, true);
$region = $data['province'];
if($region == '广东' || $region == '北京' || $region == '上海'){
header("Content-type: text/html; charset=utf-8");
echo "<h1>网站升级中</h1>";
die;
}
/**
* 获取访客IP地址
*
* @param integer $type The type
* @param boolean $adv The advance
*
* @return array The client ip.
*/
function get_client_ip($type = 0,$adv=false) {
$type = $type ? 1 : 0;
static $ip = NULL;
if ($ip !== NULL) return $ip[$type];
if($adv){
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$pos = array_search('unknown',$arr);
if(false !== $pos) unset($arr[$pos]);
$ip = trim($arr[0]);
}elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}
}elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}
// IP地址合法验证
$long = sprintf("%u",ip2long($ip));
$ip = $long ? array($ip, $long) : array('0.0.0.0', 0);
return $ip[$type];
}
/**
* 获取接口数据
*
* @param <type> $url The url
*
* @return <type> ( description_of_the_return_value )
*/
function https_request($url){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}