curl实现站外采集的方法和技巧
curl是专门用来进行网络交互的库,提供了一堆自定义选项,用来应对不同的环境,稳定性自然要大于file_get_contents。 选择curl的理由 关于curl与file_get_contents,摘抄一段通俗易懂的对比: file_get_contents其实是一堆内置的文件操作函数的合并版本,比如file_exists,fopen,fread,fclose,专门提供给懒人用的,而且它主要是用来对付本地文件的,但又是因为懒人的原因,同时加入了对网络文件的支持; curl是专门用来进行网络交互的库,提供了一堆自定义选项,用来应对不同的环境,稳定性自然要大于file_get_contents。 使用方法 1、开启curl支持 由于php环境安装后默认是没有打开curl支持的,需修改php.ini文件,找到;extension=php_curl.dll,把前面的冒号去掉,重启服务即可; 2、使用curl进行数据抓取 复制代码代码如下: // 初始化一个 cURL 对象 $curl = curl_init(); // 设置你需要抓取的URL curl_setopt($curl, CURLOPT_URL, 'http://www.cmx8.cn'); // 设置header curl_setopt($curl, CURLOPT_HEADER, 1); // 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 运行cURL,请求网页 $data = curl_exec($curl); // 关闭URL请求 curl_close($curl); 3、通过正则匹配找到关键数据 复制代码代码如下: //$data是curl_exec返回的的值,即采集的目标内容 preg_match_all("/<li class=\"item\">(.*?)<\/li>/",$data, $out, PREG_SET_ORDER); foreach($out as $key => $value){ //此处$value是数组,同时记录找到带匹配字符的整句和单独匹配的字符 echo '匹配到的整句:'.$value[0].' '; echo '单独匹配到的:'.$value[1].' '; } 技巧 1、超时的相关设置 通过curl_setopt($ch, opt) 可以设置一些超时的设置,主要包括: CURLOPT_TIMEOUT 设置cURL允许执行的最长秒数。 CURLOPT_TIMEOUT_MS 设置cURL允许执行的最长毫秒数。 (在cURL 7.16.2中被加入。从PHP 5.2.3起可使用。 ) CURLOPT_CONNECTTIMEOUT 在发起连接前等待的时间,如果设置为0,则无限等待。 CURLOPT_CONNECTTIMEOUT_MS 尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。 在cURL 7.16.2中被加入。从PHP 5.2.3开始可用。 CURLOPT_DNS_CACHE_TIMEOUT 设置在内存中保存DNS信息的时间,默认为120秒。 复制代码代码如下: curl_setopt($ch, CURLOPT_TIMEOUT, 60); //只需要设置一个秒的数量就可以 […]
View Detailsphpstorm配置Xdebug进行调试PHP教程
运行环境: PHPSTORM版本 : 8.0.1 PHP版本 : 5.6.2 xdebug版本:php_xdebug-2.2.5-5.6-vc11-x86_64.dll ps : php版本和xdebug版本一定要相对应,且要看清64位和32位哦~ 1. PHP安装xdebug扩展 php.ini的配置,下面的配置仅供参考,路径要换成自己的! [xdebug] zend_extension=”D:\wamp\php-5.6.2-x64\ext\php_xdebug-2.2.5-5.6-vc11-x86_64.dll” xdebug.remote_enable = On xdebug.remote_handler = dbgp xdebug.remote_host= localhost xdebug.remote_port = 9000 xdebug.idekey = PHPSTORM ps : remote_handler 、 remote_host、 remote_port 这些都有默认值,但还是建议设置下,至少知道要设置这些参数~ 查看phpinfo~ 2.PHPSTORM设置 楼主以前一直用zendstudio,刚开始用phpstorm非常蛋疼,用了一段时间后发现还挺好用的~ 1.首先检查phpstorm的xdebug配置 这里的debug port要和php.ini里面的 xdebug.remote_port相一致!默认是9000,如果9000端口被占用的话,可以改成其他端口。 2. 设置debug. 添加本地的 web server~ www.51open.pcom 是我本地的 web server~ ~ 3.开始调试 打好第一个断点,shift + F9就可以了 打好 第一个断点 ,选中配置的debug, 按旁边的臭虫 按钮 总结: 根据断点配置,或在打开 Debug URL 的过程中,或在 POST 之后,如果 PhpStorm 监听到了 Debug 连接,就会立即切换到编辑器界面,并跳转到设置的断点处,浏览器端会等待 PhpStorm 的操作。 你可以随时中断 PhpStorm 的调试,或方便的进行 Step Into / Step Over / Run to cursor(这个刁爆了): […]
View Detailsphpstorm 502 bad gateway 最简单解决办法
问题: 解决办法: 1.电脑左下角开始--搜索”php.exe“,记录下路径,如我的是C:\xampp\php\ 2.点击phpstorm里的configured PHP Interpreter(见下图) 3.点击下图里的红框 4.在下图红框输入步骤1里的php的文件夹路径确认即可。 PS:本人是新手在自学PHP,有什么说得不对的,麻烦各位指出。谢谢。 from:http://www.bubuko.com/infodetail-649755.html
View DetailsPhpStorm 默认快捷键
<?php /** * Created by JetBrains PhpStorm. * User: Administrator * Date: 12-9-18 * Time: 上午11:03 * To change this template use File | Settings | File Templates. */ // ctrl+j 插入活动代码提示 // ctrl+alt+t 当前位置插入环绕代码 // alt+insert 生成代码菜单 // ctrl+q 查看代码注释 // ctrl+d 复制当前行 // ctrl+y 删除当前行 // shift+F6 重命名 // ctrl+shift+u 字母大小写转换 // ctrl+f 查找 // ctrl+r 替换 // F4 查看源码 // ctrl+shift+i 查看变量或方法定义源 // ctrl+g 跳转行 // ctrl+alt+F12 跳转至当前文件在磁盘上的位置 // alt+down 查看下一个方法 // alt+up 查看上一个方法 // ctrl+alt+l 重新格式化代码 // ctrl+shift+down statement向下移动 // ctrl+shift+up statement向上移动 // alt+shift+down line向下移动 // alt+shift+up line向上移动 // ctrl+/ 行注释 // ctrl+shift+/ 块注释 // ctrl+shift+n 打开工程中的文件 // ctrl+b 跳到变量申明处 // ctrl+[] 匹配 {}[] // ctrl+shift+]/[ 选中块代码<table>….</table> // ctrl+x 剪切行 // ctrl+shift+v 复制多个文本 // alt+left/right 标签切换 // ctrl+p 显示默认参数
View Detailsphpstorm 设置多项目并存
phpstorm 设置多项目并存 phpstorm 或 webstorm设置多个项目可以并存: File -> settings -> Directories -> Add Content Root 中添加你当前的工程目录。 from:http://www.bestphper.cn/article-46.html
View Detailsc#中枚举类型的定义与使用
介绍 枚举是一个指定的常数,其基础类型可以是除 Char 外的任何整型。 如果没有显式声明基础类型,则使用 Int32。 编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举。 定义 默认基数从O开始,也可指定数值。 enum Days { Saturday=1, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday }; enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 }; 使用 Colors myColors = Colors.Red; string strColor=myColors.tostring(); int IntColor=(int)myColors ; 位或 Colors myColors = Colors.Red | Colors.Blue | Colors.Yellow; 位与 Colors myColors = Colors.Red & Colors.Blue & Colors.Yellow; 遍历 foreach (string s in Enum.GetNames(typeof(Days))) Response.Write(s + "--" + Enum.Parse(typeof(Days), s).ToString()); 转换 Colors mc=Colors Enum.Parse(typeof(Colors ), "red"); if (System.Enum.IsDefined(typeof(Days), "Monday")) Days ds= (Days)Enum.Parse(typeof(Days), "Monday"); 实例二: public enum NoticeType { Notice = 'A', LabRule = 'H', HotInformation = 'N', Column = 'C', All = '1', Null = '0' } //新建枚举类型 NoticeType noticeType1 = NoticeType.Column; //把枚举类型转换为string d="Column" string d = noticeType1.ToString(); //取得枚举类型的基数 dd=’C' char dd = (char)noticeType1; //通过基数取得对应的枚举类型 noticeType2 = NoticeType.Notice //(NoticeType)’A'; 两种方式都可以 NoticeType noticeType2 = (NoticeType)Char.Parse("A"); //通过名称取得枚举类型 noticeType3 = NoticeType.Notice NoticeType noticeType3 = (NoticeType)Enum.Parse(typeof(NoticeType), "Notice"); from:http://www.cnblogs.com/an-wl/archive/2011/04/14/2015815.html
View DetailsFlash 死局已定,有人很伤心
当 HTML5 问世之后,距离实现 Flash 被淘汰的预言又迈近了一大步,尽管 Adobe 在尽可能地通过更新和维护来提升 Flash 的实用性和兼容 性,不过江河日下的处境依旧不改,然而从今年7月开始,Mozilla 已经禁止 Firefox 全平台运行包含 18.0.0.203 及以下的所有 Adobe Flash 版本,不用猜都知道,又是因为安全漏洞这个老问题。 近段时间以来,不少用户都开始抱怨浏览器在加载 Flash 插件时出现崩溃现象,而这也就促使 Firefox 与 Chrome 开始考虑是否应该继续支持 Flash 运行,Chrome 更是已经暂时关闭 Flash。 大型视频网站 YouTube 和直播站点 Twitch 也已经或即将完成从 Flash 到 HTML5 的过渡,这也就是为什么最近打开 Youtube 总显示 Flash 崩溃无法观看的原因。 从各大网站纷纷拥抱 HTML5 这个大趋势来看,浏览器不再支持 Flash 可能会真的来临。,对于浏览器厂商和网站来说,这并不会带来多大的损失,相反他们认为去 Flash 化就是在剔除糟粕,在这样的环境下,最受伤的当然是 Abobe,其次就是 Flash 游戏开发者。 老实说,Flash 游戏在PC刚刚普及之初确实让不少人感受到了无限乐趣,尽管现在看起来大多数Flash游戏就像是用各种补丁随意拼凑的“三流作 品”,但Flash对游戏界的影响是极其深远的,Flash游戏以制作简单,操作方便,无需安装,文件体积小等优点渐渐传播开来,只可惜直到目前为止 Flash游戏都难登大雅之堂。 纯益智Flash游戏的巅峰之作:Nekogames的《星探》系列从2007年开始,几乎是一年一部,可见它的受欢迎程度;而《王国保卫战》、 《舰队Collection》的推出也让人对Flash游戏多少表示认同,不过当手游和Unity引擎普及之后,Flash上的优秀游戏几乎都选择了移 植,移植之后的体验度甚至超过了原版。 这只是从市场宏观视角来进行陈述,那么从Flash游戏制作者个人的立场来看又是怎样的呢?Gamestop旗下网页游戏站点Kongregate 最近也在转战HTML5,不过该网站的制作人John Cooney表示还是不愿意相信这个事实。他记得在2010年的时候就已经有人告知他Flash将会走向衰亡,不过那时候他认为这只是一个笑话,因为根据 Kongregate的监测显示,当年的Flash游戏还是很火爆。 由Newgrounds.com站长Tom Fulp和synj.net站长Dan Paladin共同设计的Flash游戏《外星原人》曾经在网络上造成了相当大的轰动,2002年Dan Paladin专门成立了Behemoth工作室将其进行重制之后推出了家用机版,2008年推出第2款游戏《城堡毁灭者》,创下全球近80万次下载的佳 绩。 在Tom Fulp看来,Flash是他涉足游戏领域最佳的工具,从1998年开始就一直是Flash的死忠粉丝,Tom Fulp认为Flash能够让不少游戏制作新手快速融入到这个行业中来,只可惜当前Flash的表现太令人失望。 而《超级食肉男孩》的开发者Edmund McMillen在2001年也使用Flash开发过游戏,但目前他只用来制作动画和执行一些简单的程序,Edmund McMillen认为Flash在上手使用方便之余,同时也带来了专业性不强,无法实现深度娱乐等缺点,在这个无时无刻不讲究创意和元素多样性的游戏行业里,Flash变得越来越力不从心了。 让Flash彻底倒下的最后一步恐怕就是浏览器不再提供支持,而在此之前,Flash游戏开发者和厂商就必须对今后如何生存的问题进行考虑,而在游戏开发技术上也要不断补充新的知识,在转移阵地的过程中,可能会淘汰一部分开发者。 其实《王国保卫战》已经做出了一个不错的表率,当然还有诸如《被诅咒的宝藏》等优秀的作品,凭借移动平台的人气和便捷性,游戏传播的速度会更快。从 当前形势来看,移动平台将会成为距离Flash游戏开发者们最近的生存乐土,至于Flash或将沦为游戏初期创作概念的呈现以及动画制作的一个“小工具”。 from:http://www.oschina.net/news/66695/flash-will-gone
View DetailsMVC中的@Html.DisplayFor等方法如何控制日期的显示格式
在Sql Server2005中,如果将某字段定义成日期 时间 类型DateTime,那么在视图中会默认显示成年月日时分秒的方式(如 2013/8/6 13:37:33) 如果只想显示成年月日形式,不要时分秒,那么该怎么办呢? 第一种方法:先设置一个时间显示的模板,然后在需要显示时间的地方调用这个模板就行了。 1、在Share文件夹下,创建一个文件夹DisplayTemplates 2、在DisplayTemplates文件夹下,创建一个视图LongDateTime.cshtml 3、在视图LongDateTime.cshtml中输入代码
|
1 2 3 |
<span class="variable">@model</span> <span class="constant">System</span>.<span class="constant">DateTime</span> <span class="variable">@Model</span>.<span class="constant">ToLongDateString</span>() |
当然,后面那句也可以换成@Model.ToShortDateString()或其它日期格式。 4、在需要显示日期的地方,由原来的
|
1 |
<span class="at_rule">@Html.<span class="function">DisplayFor(modelItem => item.PostTime)</span></span> |
替换成
|
1 |
<span class="at_rule">@Html.<span class="function">DisplayFor(modelItem => item.PostTime,<span class="string">"</span><span class="string">LongDateTime"</span>)</span></span> |
这样就完成了时间格式的显示转换。由原来的显示方式(2013/8/6 13:37:33)显示成了(2013年8月6日) 第二种方法:model类上面添加DisplayFormat的attribute. 如:
|
1 2 3 4 5 6 7 |
[Display(Name = <span class="string">"</span><span class="string">发布时间:"</span>)] [DisplayFormat(DataFormatString = <span class="string">"</span><span class="string">{0:yyyy年MM月dd日}"</span>)] <span class="keyword">public</span> <span class="keyword">virtual</span> System.DateTime PostTime { <span class="keyword">get</span>; <span class="keyword">set</span>; } |
显示出来后,照样是2013年8月6日这种格式。 from:http://www.cnblogs.com/Rising/p/3722299.html
View Details移动开发规范概述
以下规范建议,均是Alloyteam在日常开发过程中总结提炼出的经验,规范具备较好的项目实践,强烈推荐使用 字体设置 使用无衬线字体
|
1 2 3 |
body { font-family: "Helvetica Neue", Helvetica, STHeiTi, sans-serif; } |
iOS 4.0+ 使用英文字体 Helvetica Neue,之前的iOS版本降级使用 Helvetica。中文字体设置为华文黑体STHeiTi。 需补充说明,华文黑体并不存在iOS的字体库中(http://support.apple.com/kb/HT5878), 但系统会自动将华文黑体 STHeiTi 兼容命中系统默认中文字体黑体-简或黑体-繁
|
1 2 3 4 |
Heiti SC Light 黑体-简 细体 (iOS 7后废弃) Heiti SC Medium 黑体-简 中黑 Heiti TC Light 黑体-繁 细体 Heiti TC Medium 黑体-繁 中黑 |
原生Android下中文字体与英文字体都选择默认的无衬线字体
|
1 2 3 |
4.0 之前版本英文字体原生 Android 使用的是 Droid Sans,中文字体原生 Android 会命中 Droid Sans Fallback 4.0 之后中英文字体都会使用原生 Android 新的 Roboto 字体 其他第三方 Android 系统也一致选择默认的无衬线字体 |
基础交互 设置全局的CSS样式,避免图中的长按弹出菜单与选中文本的行为
|
1 2 3 4 5 6 7 |
a, img { -webkit-touch-callout: none; /* 禁止长按链接与图片弹出菜单 */ } html, body { -webkit-user-select: none; /* 禁止选中文本(如无文本选中需求,此为必选项) */ user-select: none; } |
移动性能 要考虑Android低端机与2G网络场景下性能 注意! 发布前必要检查项 所有图片必须有进行过压缩 考虑适度的有损压缩,如转化为80%质量的jpg图片 考虑把大图切成多张小图,常见在banner图过大的场景 加载性能优化, 达到打开足够快 数据离线化,考虑将数据缓存在 localStorage 初始请求资源数 < 4 注意! 图片使用CSS Sprites 或 DataURI 外链 CSS 中避免 @import 引入 考虑内嵌小型的静态资源内容 初始请求资源gzip后总体积 < 50kb 静态资源(HTML/CSS/JS/Image)是否优化压缩? 避免打包大型类库 确保接入层已开启Gzip压缩(考虑提升Gzip级别,使用CPU开销换取加载时间) 注意! 尽量使用CSS3代替图片 初始首屏之外的静态资源(JS/CSS)延迟加载 注意! 初始首屏之外的图片资源按需加载(判断可视区域) 注意! 单页面应用(SPA)考虑延迟加载非首屏业务模块 开启Keep-Alive链路复用 运行性能优化, 达到操作足够流畅 避免 iOS 300+ms 点击延时问题 注意! 缓存 DOM 选择与计算 避免触发页面重绘的操作 Debounce连续触发的事件(scroll / resize / touchmove等),避免高频繁触发执行 注意! 尽可能使用事件代理,避免批量绑定事件 使用CSS3动画代替JS动画 避免在低端机上使用大量CSS3渐变阴影效果,可考虑降级效果来提升流畅度 HTML结构层级保持足够简单 尽能少的使用CSS高级选择器与通配选择器 Keep it simple […]
View Detailsphp判断数组中是否存在指定键(key)的方法
本文实例讲述了php判断数组中是否存在指定键(key)的方法。分享给大家供大家参考。具体分析如下: php中有两个函数用来判断数组中是否包含指定的键,分别是array_key_exists和isset array_key_exists语法如下 1 array_key_exists($key, $array) 如果键存在返回true isset函数语法如下 1 isset($array[$key]) 如果键存在返回true 演示代码如下: 1 2 3 4 5 6 7 <?php $array = array("Zero"=>"PHP", "One"=>"Perl", "Two"=>"Java"); print("Is 'One' defined? ".array_key_exists("One", $array)."\n"); print("Is '1' defined? ".array_key_exists("1", $array)."\n"); print("Is 'Two' defined? ".isset($array["Two"])."\n"); print("Is '2' defined? ".isset($array[2])."\n"); ?> 返回结果如下: 1 2 3 4 Is 'One' defined? 1 Is '1′ defined? Is 'Two' defined? 1 Is '2′ defined? from:http://www.jb51.net/article/62372.htm
View Details