一、如果没有使用代理服务器, REMOTE_ADDR = 客户端IP HTTP_X_FORWARDED_FOR = 没数值或不显示
1 |
$ip = $_SERVER['REMOTE_ADDR']; |
二、使用透明代理, REMOTE_ADDR = 最后一个代理服务器 IP HTTP_X_FORWARDED_FOR = 客户端真实 IP (经过多个代理服务器时,这个值类似:221.5.252.160, 203.98.182.163, 203.129.72.215) 这类代理还会将客户真实ip发送到请求对象,无法隐藏真实ip。
1 |
$ip = $_SERVER['HTTP_X_FORWARDED_FOR']; |
三、使用普通匿名代理服务器, REMOTE_ADDR = 最后一个代理服务器 IP HTTP_X_FORWARDED_FOR = 代理服务器 IP (经过多个代理服务器时,这个值类似:203.98.182.163, 203.98.182.163, 203.129.72.215) 这样就隐藏了客户端的真实ip,但服务器会知道客户端是通过代理服务器去访问的。 四、使用欺骗性代理服务器, REMOTE_ADDR = 代理服务器 IP HTTP_X_FORWARDED_FOR = 随机的 IP(经过多个代理服务器时,这个值类似:220.4.251.159, 203.98.182.163, 203.129.72.215) 服务器可以识别到时通过代理服务器访问的,但发送给目标服务器的是虚假ip。 五、使用高匿名代理, REMOTE_ADDR = 代理服务器 IP HTTP_X_FORWARDED_FOR = 没数值或不显示 使用这种代理时,不同浏览器不同设备会返回不同的ip头信息,因此PHP使用$_SERVER["REMOTE_ADDR"] 、$_SERVER["HTTP_X_FORWARDED_FOR"] 获取的值可能是空值也可能是“unknown”值。 PHP获取ip代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public function ip() { //strcasecmp 比较两个字符,不区分大小写。返回0,>0,<0。 if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $ip = getenv('REMOTE_ADDR'); } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $ip = $_SERVER['REMOTE_ADDR']; } $res = preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : ''; echo $res; //dump(phpinfo());//所有PHP配置信息 } |
from:https://www.cnblogs.com/rendd/p/6183094.html
View Details
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
/** *@todo: 判断是否为post */ if(!function_exists('is_post')){ function is_post() { return isset($_SERVER['REQUEST_METHOD']) && strtoupper($_SERVER['REQUEST_METHOD'])=='POST'; } } /** *@todo: 判断是否为get */ if(!function_exists('is_get')){ function is_get() { return isset($_SERVER['REQUEST_METHOD']) && strtoupper($_SERVER['REQUEST_METHOD'])=='GET'; } } /** *@todo: 判断是否为ajax */ if(!function_exists('is_ajax')){ function is_ajax() { return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtoupper($_SERVER['HTTP_X_REQUESTED_WITH'])=='XMLHTTPREQUEST'; } } /** *@todo: 判断是否为命令行模式 */ if(!function_exists('is_cli')){ function is_cli() { return (PHP_SAPI === 'cli' OR defined('STDIN')); } } |
from:https://blog.csdn.net/wujiangwei567/article/details/72772783
View DetailsURL重写有利于网站首选域的确定,对于同一资源页面多条路径的301重定向有助于URL权重的集中 Nginx URL重写(rewrite)介绍 和apache等web服务软件一样,rewrite的组要功能是实现RUL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持 rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。 rewrite语法格式及参数语法说明如下: rewrite <regex> <replacement> [flag]; 关键字 正则 替代内容 flag标记 关键字:其中关键字error_log不能改变 正则:perl兼容正则表达式语句进行规则匹配 替代内容:将正则匹配的内容替换成replacement flag标记:rewrite支持的flag标记 flag标记说明: last #本条规则匹配完成后,继续向下匹配新的location URI规则 break #本条规则匹配完成即终止,不再匹配后面的任何规则 redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址 permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址 rewrite参数的标签段位置: server,location,if 例子: rewrite ^/(.*) http://www.czlun.com/$1 permanent; 说明: rewrite为固定关键字,表示开始进行rewrite匹配规则 regex部分是 ^/(.*) ,这是一个正则表达式,匹配完整的域名和后面的路径地址 replacement部分是http://www.czlun.com/$1 $1,是取自regex部分()里的内容。匹配成功后跳转到的URL。 flag部分 permanent表示永久301重定向标记,即跳转到新的 http://www.czlun.com/$1 地址上 regex 常用正则表达式说明 字符 描述 \ 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$” ^ 匹配输入字符串的起始位置 $ 匹配输入字符串的结束位置 * 匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” + 匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“oll”,但不能匹配“o” ? 匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,"?"等效于"{0,1}" . 匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式。 (pattern) 匹配括号内pattern并可以在后面获取对应的匹配,常用$0…$9属性获取小括号中的匹配内容,要匹配圆括号字符需要\(Content\) rewrite 企业应用场景 Nginx的rewrite功能在企业里应用非常广泛: u 可以调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。 u 为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。 u 网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的360buy.com会跳转到jd.com u 根据特殊变量、目录、客户端的信息进行URL调整等 Nginx配置rewrite过程介绍 (1)创建rewrite语句 vi conf/vhost/www.abc.com.conf #vi编辑虚拟主机配置文件 文件内容 server { listen 80; server_name abc.com; rewrite ^/(.*) http://www.abc.com/$1 permanent; } server { listen 80; server_name www.abc.com; […]
View Details说明 语法
1 |
mixed PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] ) |
从一个 PDOStatement 对象相关的结果集中获取下一行。fetch_style 参数决定 POD 如何返回行。 参数 fetch_style 控制下一行如何返回给调用者。此值必须是 PDO::FETCH_* 系列常量中的一个,缺省为 PDO::ATTR_DEFAULT_FETCH_MODE 的值 (默认为 PDO::FETCH_BOTH )。 PDO::FETCH_ASSOC:返回一个索引为结果集列名的数组 PDO::FETCH_BOTH(默认):返回一个索引为结果集列名和以0开始的列号的数组 PDO::FETCH_BOUND:返回 TRUE ,并分配结果集中的列值给PDOStatement::bindColumn() 方法绑定的 PHP 变量。 PDO::FETCH_CLASS:返回一个请求类的新实例,映射结果集中的列名到类中对应的属性名。如果 fetch_style 包含 PDO::FETCH_CLASSTYPE(例如:PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE),则类名由第一列的值决定 PDO::FETCH_INTO:更新一个被请求类已存在的实例,映射结果集中的列到类中命名的属性 PDO::FETCH_LAZY:结合使用 PDO::FETCH_BOTH 和 PDO::FETCH_OBJ,创建供用来访问的对象变量名 PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组 PDO::FETCH_OBJ:返回一个属性名对应结果集列名的匿名对象 cursor_orientation 对于 一个 PDOStatement 对象表示的可滚动游标,该值决定了哪一行将被返回给调用者。此值必须是 PDO::FETCH_ORI_* 系列常量中的一个,默认为 PDO::FETCH_ORI_NEXT。要想让 PDOStatement 对象使用可滚动游标,必须在用 PDO::prepare() 预处理SQL语句时,设置 PDO::ATTR_CURSOR 属性为 PDO::CURSOR_SCROLL。 offset 对于一个 cursor_orientation 参数设置为 PDO::FETCH_ORI_ABS 的PDOStatement 对象代表的可滚动游标,此值指定结果集中想要获取行的绝对行号。 对于一个 cursor_orientation 参数设置为 PDO::FETCH_ORI_REL 的PDOStatement 对象代表的可滚动游标,此值指定想要获取行相对于调用 PDOStatement::fetch() 前游标的位置 返回值 此函数(方法)成功时返回的值依赖于提取类型。在所有情况下,失败都返回 FALSE 。 实例 用不同的提取方式获取行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php $sth = $dbh->prepare("SELECT name, colour FROM fruit"); $sth->execute(); /* 运用 PDOStatement::fetch 风格 */ print("PDO::FETCH_ASSOC: "); print("Return next row as an array indexed by column name\n"); $result = $sth->fetch(PDO::FETCH_ASSOC); print_r($result); print("\n"); print("PDO::FETCH_BOTH: "); print("Return next row as an array indexed by both column name and number\n"); $result = $sth->fetch(PDO::FETCH_BOTH); print_r($result); print("\n"); print("PDO::FETCH_LAZY: "); print("Return next row as an anonymous object with column names as properties\n"); $result = $sth->fetch(PDO::FETCH_LAZY); print_r($result); print("\n"); print("PDO::FETCH_OBJ: "); print("Return next row as an anonymous object with column names as properties\n"); $result = $sth->fetch(PDO::FETCH_OBJ); print $result->NAME; print("\n"); ?> |
以上实例会输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
PDO::FETCH_ASSOC: Return next row as an array indexed by column name Array ( [NAME] => apple [COLOUR] => red ) PDO::FETCH_BOTH: Return next row as an array indexed by both column name and number Array ( [NAME] => banana [0] => banana [COLOUR] => yellow [1] => yellow ) PDO::FETCH_LAZY: Return next row as an anonymous object with column names as properties PDORow Object ( [NAME] => orange [COLOUR] => orange ) PDO::FETCH_OBJ: Return next row as an anonymous object with column names as properties kiwi |
使用一个可滚动游标获取行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?php function readDataForwards($dbh) { $sql = 'SELECT hand, won, bet FROM mynumbers ORDER BY BET'; try { $stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)); $stmt->execute(); while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT)) { $data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\n"; print $data; } $stmt = null; } catch (PDOException $e) { print $e->getMessage(); } } function readDataBackwards($dbh) { $sql = 'SELECT hand, won, bet FROM mynumbers ORDER BY bet'; try { $stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)); $stmt->execute(); $row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_LAST); do { $data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\n"; print $data; } while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_PRIOR)); $stmt = null; } catch (PDOException $e) { print $e->getMessage(); } } print "Reading forwards:\n"; readDataForwards($conn); print "Reading backwards:\n"; readDataBackwards($conn); ?> |
以上实例会输出:
1 2 3 4 5 6 7 8 9 |
Reading forwards: 21 10 5 16 0 5 19 20 10 Reading backwards: 19 20 10 16 0 5 21 10 5 |
from:http://www.runoob.com/php/pdostatement-fetch.html
View Details说明 语法
1 2 3 4 |
publicpu PDOStatement PDO::query ( string $statement ) public PDOStatement PDO::query ( string $statement , int $PDO::FETCH_COLUMN , int $colno ) public PDOStatement PDO::query ( string $statement , int $PDO::FETCH_CLASS , string $classname , array $ctorargs ) public PDOStatement PDO::query ( string $statement , int $PDO::FETCH_INTO , object $object ) |
PDO::query() 在一个单独的函数中调用并执行 SQL 语句, 返回结果集 (如果有),语句作为一个PDOStatement对象返回。 参数 statement 要执行的SQL语句。 返回值 如果成功,PDO::query()返回PDOStatement对象,如果失败返回 FALSE 。 实例 PDO::query实例 遍历输出结果集:
1 2 3 4 5 6 7 8 9 10 |
<?php function getFruit($conn) { $sql = 'SELECT name, color, calories FROM fruit ORDER BY name'; foreach ($conn->query($sql) as $row) { print $row['name'] . "\t"; print $row['color'] . "\t"; print $row['calories'] . "\n"; } } ?> |
以上输出结果为:
1 2 3 4 5 6 7 |
apple red 150 banana yellow 250 kiwi brown 75 lemon yellow 25 orange orange 300 pear green 150 watermelon pink 90 |
from:http://www.runoob.com/php/pdo-query.html
View Details我使用的是5.6.11版本的php 刚开始以为编译参数加了--with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd,就可以不能安装mysql了。 但是使用了mysq_connect()函数后发现php无法解析,在apache的日志当中出现下面这个提示,刚开始想不通。 PHP Fatal error: Call to undefined function mysql_connect() 因为原先的mysql.api已经在php5.5开始被移除,而之后的php 自带的mysqli只支持部分部分函数。 具体可以参考http://cn2.php.net/manual/zh/set.mysqlinfo.php 如果真的不想安装mysql,用以替代本函数的有: mysqli_connect() mysqli_connect("localhost","my_user","my_password","my_db"); http://cn2.php.net/manual/zh/function.mysql-connect.php —————————————————————— 首先纠正一个问题, 5.x开始,PHP连接MYSQL无论使用哪种方式都是使用的mysqlnd驱动(当然是在你安装好的时候)。包括mysql_*、PDO_MYSQL、MYSQLi 在编译安装PHP的时候,需要指定开启以下扩展 --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd 而不再是 --with-mysqli=/usr/local/mysql PHP7 正式移除了 mysql 扩展 mysqlnd和mysql mysqli pdo_mysql关系打比方说 mysqlnd是金属,而mysql mysqli pdo_mysql只是金属制品而已 使用PDO连接mysql
1 2 3 4 5 6 7 8 9 |
$pdo = new PDO('mysql:host=localhost;dbname=database_name;port=3306','用户名','密码'); $pdo->exec('set names utf8'); $stmt = $pdo->prepare("select * from table where id =:id"); $stmt->bindValue(':id',1,PDO::PARAM_INT); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); $rows = $pdo->query("select * from table where id = 1")->fetchAll(PDO::FETCH_ASSOC); |
from:https://www.cnblogs.com/wajika/p/6627140.html
View Details一.类常量:在类中始终保持不变的值定义为常量 类的常量不能使用访问限制修饰符,他是 public 的,可继承,可以被子类重写,访问类的常量必须使用双冒号 :: ,可以使用类名或类的实例来访问,因为是常量,所以名称不能使用表示变量的符号 $. 可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。 常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。 接口(interface)中也可以定义常量。更多示例见文档中的接口部分。 自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字(如 self,parent 或 static)。 语法 : const constant= '常量'; ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Myclass{ const constant = '常量'; //类内部调用 public function test(){ echo self::constant.'<br>'; } } Myclass::test(); //类外部访问 echo Myclass::constant.'<br>'; //方法一 $obj = new Myclass(); //方法二 echo $obj::constant.'<br>'; 二.静态属性 : 是一个变量,可以常量的语法访问,就是 :: ,可以没有实例化也能访问 语法 :public static $my_static = '类似常量'; ? 1 2 3 4 5 6 7 8 9 10 11 […]
View Details微信内置浏览器(WebView)中特有的javascript API(javascript Interface),随着微信官方的调整,部分API已经不能直接使用,比如类似直接分享到朋友圈WeixinJSBridge.invoke(shareTimeline,data,callback) 这样的功能,直接调用,会得到一个访问拒绝的response
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function WeiXinShareBtn() { if (typeof WeixinJSBridge == "undefined") { if (document.addEventListener) { document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false); } else if (document.attachEvent) { document.attachEvent('WeixinJSBridgeReady', onBridgeReady); document.attachEvent('onWeixinJSBridgeReady', onBridgeReady); } alert("请先通过微信搜索 wow36kr 添加36氪为好友,通过微信分享文章 "); } else { WeixinJSBridge.invoke('shareTimeline', { "title": "36氪", "link": "http://www.36kr.com", "desc": "关注互联网创业", "img_url": "http://www.36kr.com/assets/images/apple-touch-icon.png" }); } } |
此方法已过时,被微信禁用了。只能用微信官方的接口 1、前台脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
<script src="../Scripts/jquery-1.10.2.js"></script> <script src="//res.wx.qq.com/open/js/jweixin-1.0.0.js" type="text/javascript"></script> <script> wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '<%=appid%>', // 必填,公众号的唯一标识 timestamp: '<%=timestamp%>', // 必填,生成签名的时间戳 nonceStr: '<%=nonce%>', // 必填,生成签名的随机串 signature: '<%=signature%>',// 必填,签名,见附录1 jsApiList: ["checkJsApi", "onMenuShareTimeline", "onMenuShareAppMessage"] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 //当前客户端版本是否支持指定JS接口,分享到朋友圈,分享给朋友 }); wx.ready(function () { wx.checkJsApi({ jsApiList: ['chooseImage'], // 需要检测的JS接口列表,所有JS接口列表见附录2, success: function (res) { alert(JSON.stringify(res)); // 以键值对的形式返回,可用的api值true,不可用为false // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"} } }); //朋友圈 wx.onMenuShareTimeline({ title: '春天里的健康', // 分享标题 desc: '春天里的健康春天里的健康春天里的健康', // 分享描述 link: '<%=thisUrl%>', // 分享链接 imgUrl: 'https://imgsa.baidu.com/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=c31e0863bf315c60579863bdecd8a076/4034970a304e251fb62a408ea486c9177e3e53e2.jpg', success: function (res) { alert('已分享'); }, cancel: function (res) { alert('已取消'); }, fail: function (res) { alert(JSON.stringify(res)); } }); //朋友 wx.onMenuShareAppMessage({ title: '春天里的健康', // 分享标题 desc: '春天里的健康春天里的健康春天里的健康', // 分享描述 link: '<%=thisUrl%>', // 分享链接 imgUrl: 'https://imgsa.baidu.com/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=c31e0863bf315c60579863bdecd8a076/4034970a304e251fb62a408ea486c9177e3e53e2.jpg', // 分享图标 type: '', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 success: function () { // 用户确认分享后执行的回调函数 alert("分享成功"); }, cancel: function () { // 用户取消分享后执行的回调函数 alert("取消分享"); } }); }); </script> |
2、后台代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
using Senparc.Weixin.MP.Containers; using Senparc.Weixin.MP.Helpers; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace jkmobile.share { public partial class ReportShare : System.Web.UI.Page { public string appid = "", timestamp="", nonce="",thisUrl="", signature=""; protected void Page_Load(object sender, EventArgs e) { WXShareModel wxmodel = new WXShareModel(); wxmodel = Ge_WXShareModel(); appid = wxmodel.appid; timestamp = wxmodel.timestamp; nonce = wxmodel.nonce; thisUrl = wxmodel.thisUrl; signature = wxmodel.signature; } #region 微信分享 public WXShareModel Ge_WXShareModel() { string APPID = ConfigurationManager.AppSettings["appid"]; string secret = ConfigurationManager.AppSettings["secret"]; WXShareModel fxModel = new WXShareModel(); fxModel.appid = APPID; fxModel.timestamp = JSSDKHelper.GetTimestamp(); fxModel.nonce = JSSDKHelper.GetNoncestr(); fxModel.thisUrl = Request.Url.ToString().Split('#')[0]; fxModel.ticket = JsApiTicketContainer.TryGetJsApiTicket(APPID, secret); //最后一个参数url,必须为当前的网址 var signature = JSSDKHelper.GetSignature(fxModel.ticket, fxModel.nonce, fxModel.timestamp, fxModel.thisUrl); fxModel.signature = signature; return fxModel; } #endregion } public class WXShareModel { /// <summary> /// 公众号的唯一标识 /// </summary> public string appid { get; set; } /// <summary> /// 生成签名的随机串 /// </summary> public string nonce { get; set; } /// <summary> /// 生成签名的时间戳 /// </summary> public string timestamp { get; set; } /// <summary> /// 签名 /// </summary> public string signature { get; set; } public string ticket { get; set; } /// <summary> /// 分享的地址 /// </summary> public string thisUrl { get; set; } } } |
请引用微信官方封装好的dll Senparc.Weixin.dll Senparc.Weixin.MP.dll from:https://blog.csdn.net/lybwwp/article/details/70172232
View Details随着 AI 技术快速发展,各种理论与实践层出不穷,它正在迅速改变我们生活中几乎每一个领域,从我们如何交流到用于交通的手段。作为开发者或者学习者,在开始构建机器学习应用程序之前,从众多开源项目中选择一项应该是一个艰巨的任务,日前,有网友在博客总结了 8 种最好的开源 AI 技术,为机器学习开发者指明道路。 1、Tensorflow TensorFlow 是谷歌为支持其研究和生产目标创建的项目,于 2015 年发布,它是一款开源机器学习框架,易于在各种平台上使用和部署。它是机器学习中维护得最好和广泛使用的框架之一,目前已被多家公司广泛使用,包括 Dropbox、eBay、Intel、Twitter 和 Uber。 TensorFlow 可用于 Python、C++、Haskell、Java、Go、Rust 以及 JavaScript,同时还有其它编程语言的第三方软件包可使用。该框架允许开发者使用流图开发神经网络等计算模型。 2、Keras Keras 是一个开源机器学习库,最初于 2015 年发布,旨在简化深度学习模型的创建。它使用 Python 编写而成,可以部署在其它人工智能技术之上,如 TensorFlow、Microsoft Cognitive Toolkit(CNTK)和Theano。 Keras 以其对用户友好、模块化和易扩展性而闻名。它可以实现简单快速的原型设计,同时支持卷积网络和循环网络,并且能够在 CPU 和 GPU 上运行达到最佳状态。 3、Scikit-learn 最初于 2007 年发布的 Scikit-learn 是为机器学习开发的开源库,这个传统的框架是用 Python 编写的,它基于另外三个开源项目 Matplotlib、NumPy 和 SciPy 设计而成,专注于数据挖掘和数据分析,包含了几种机器学习模型,包括分类、回归、聚类和降维。 4、Microsoft Cognitive Toolkit 最初于 2016 年发布的 Microsoft Cognitive Toolkit ,之前称为 CNTK,它是一种 AI 解决方案,可让您将机器学习项目提升到一个新的水平。微软表示,开源框架能够“训练深度学习算法,以便像人脑一样工作”。 Microsoft Cognitive Toolkit 的一些重要功能包括高度优化的组件,能够处理来自 Python、C++ 或 BrainScript 的数据,提供高效的资源利用,轻松与 Microsoft Azure 集成以及与 NumPy 进行互操作。 5、Theano Theano 最初于 2007 年发布,它是一个开源的 Python 库,允许开发者轻松地构建各种机器学习模型。由于它是最早的 AI 库之一,被视为推动深度学习发展的行业标准。 Theano 的特征是可以简化定义、优化和评估数学表达式的过程,它能够将您的数据结构转换为与 NumPy、BLAS 等本地库以及本地代码集成的非常高效的代码。此外,它针对 GPU 进行了优化,并且具有广泛的代码测试功能。 […]
View Details方法一 修改php.ini
1 2 3 4 5 6 |
;显示错误信息 display_errors = On ;显示php开始错误信息 display_startup_errors = On ;日志记录错误信息 log_errors = On |
方法二 需要调试的php文件首行中加入
1 2 3 4 |
ini_set('display_errors',1); //错误信息 ini_set('display_startup_errors',1); //php启动错误信息 error_reporting(-1); //打印出所有的 错误信息 ini_set('error_log', dirname(__FILE__) . '/error_log.txt'); //将出错信息输出到一个文本文件 |
from:https://blog.csdn.net/whatday/article/details/50833934
View Details