php-fpm设置socket方式连接FastCGI
socket方式不会走到tcp层,tcp方式则会走到ip层。因此,理论上说socket连接方式效率会更好一点。
TCP和unix domain socket方式对比
TCP是使用TCP端口连接127.0.0.1:9000
Socket是使用unix domain socket连接套接字/dev/shm/php-fpm.sock
修改php-fpm.conf配置
#listen = 127.0.0.1:9000 listen=/dev/shm/php-fpm.sock #/dev/shm/为内存文件系统,注意 确保可读写 listen.owner=apache #注意自己的用户和组 listen.group=apache
修改nginx.conf配置
#fastcgi_pass 127.0.0.1:9000; #将相应的如上内容修改如下 fastcgi_pass unix:/dev/shm/php-fpm.sock;
重启nginx和php-fpm
service nginx restart /usr/local/nginx/sbin/nginx -s reload
微信公众号号在手机中通过api接口可以实现自定义分享内容了,下面我们来看这个接口的实现步骤。
一、准备阶段
公众号一个,微网站一个。
二、绑定域名
先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
备注:登录后可在“开发者中心”查看对应的接口权限。
三、代码
<?php //curl获取请求文本内容 function get_curl_contents($url, $method ='GET', $data = array()) { if ($method == 'POST') { //使用crul模拟 $ch = curl_init(); //禁用https curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //允许请求以文件流的形式返回 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 30); curl_setopt($ch, CURLOPT_URL, $url); $result = curl_exec($ch); //执行发送 curl_close($ch); }else { if (ini_get('allow_fopen_url') == '1') { $result = file_get_contents($url); }else { //使用crul模拟 $ch = curl_init(); //允许请求以文件流的形式返回 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //禁用https curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_URL, $url); $result = curl_exec($ch); //执行发送 curl_close($ch); } } return $result; } //获取微信公从号access_token function wx_get_token() { $AppID = '1235464654';//AppID(应用ID) $AppSecret = '705641465sdfasdf456465a4sdf';//AppSecret(应用密钥) $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$AppID.'&secret='.$AppSecret; $res = get_curl_contents($url); $res = json_decode($res, true); //这里应该把access_token缓存起来,至于要怎么缓存就看各位了,有效期是7200s return $res['access_token']; } //获取微信公从号ticket function wx_get_jsapi_ticket() { $url = sprintf("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi", wx_get_token()); $res = get_curl_contents($url); $res = json_decode($res, true); //这里应该把access_token缓存起来,至于要怎么缓存就看各位了,有效期是7200s return $res['ticket']; } $wx = array(); //生成签名的时间戳 $wx['timestamp'] = time(); //生成签名的随机串 $wx['noncestr'] = 'Wm3WZYTPz0wzccnW'; //jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。 $wx['jsapi_ticket'] = wx_get_jsapi_ticket(); //分享的地址,注意:这里是指当前网页的URL,不包含#及其后面部分,曾经的我就在这里被坑了,所以小伙伴们要小心了 $wx['url'] = 'http://www.baidu.com'; $string = sprintf("jsapi_ticket=%s&noncestr=%s×tamp=%s&url=%s", $wx['jsapi_ticket'], $wx['noncestr'], $wx['timestamp'], $wx['url']); //生成签名 $wx['signature'] = sha1($string); /* 注意事项 签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。 签名用的url必须是调用JS接口页面的完整URL。 出于安全考虑,开发者必须在服务器端实现签名的逻辑。 */ ?>
四、视图显示
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js
通过config接口注入权限验证配置
<script> //通过config接口注入权限验证配置 wx.config({ debug : false, appId : 'AppID', timestamp : '<?php echo $wx["timestamp"];?>', nonceStr : '<?php echo $wx["noncestr"];?>', signature : '<?php echo $wx["signature"];?>', jsApiList : ['onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo'] }); wx.ready(function(){ var s_title = '分享标题', // 分享标题 s_link = '分享链接', // 分享链接 s_desc = '分享描述', //分享描述 s_imgUrl = '分享图片'; // 分享图标 //朋友圈 wx.onMenuShareTimeline({ title: s_title, // 分享标题 link: s_link, // 分享链接 imgUrl: s_imgUrl, // 分享图标 success: function () { }, cancel: function () { } }); //发送给好友 wx.onMenuShareAppMessage({ title: s_title, // 分享标题 desc: s_desc, // 分享描述 link: s_link, // 分享链接 imgUrl: s_imgUrl, // 分享图标 type: '', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 success: function () {}, cancel: function () {} }); //QQ好友 wx.onMenuShareQQ({ title: s_title, // 分享标题 desc: s_desc, // 分享描述 link: s_link, // 分享链接 imgUrl: s_imgUrl, // 分享图标 success: function () { }, cancel: function () { } }); //腾讯微博 wx.onMenuShareWeibo({ title: s_title, // 分享标题 desc: s_desc, // 分享描述 link: s_link, // 分享链接 imgUrl: s_imgUrl, // 分享图标 success: function () { }, cancel: function () { } }); }); </script>
五、大功告成
基本上的流程就是这样了,比较麻烦的一点就是生成签名那一块,注意一点就行了
下文小编为各位来介绍一篇关于PHP ASCII码与字符串的相互转换的例子,希望这个例子能够对各位有帮助。<?php class ascii { /** * 将ascii码转为字符串 * @param type $str 要解码的字符串 * @param type $prefix 前缀,默认:&# * @return type */ function decode($str, $prefix="&#") { $str = str_replace($prefix, "", $str); $a = explode(";", $str); foreach ($a as $dec) { if ($dec < 128) { $utf .= chr($dec); } else if ($dec < 2048) { $utf .= chr(192 + (($dec - ($dec % 64)) / 64)); $utf .= chr(128 + ($dec % 64)); } else { $utf .= chr(224 + (($dec - ($dec % 4096)) / 4096)); $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64)); $utf .= chr(128 + ($dec % 64)); } } return $utf; } /** * 将字符串转换为ascii码 * @param type $c 要编码的字符串 * @param type $prefix 前缀,默认:&# * @return string */ function encode($c, $prefix="&#") { $len = strlen($c); $a = 0; while ($a < $len) { $ud = 0; if (ord($c{$a}) >= 0 && ord($c{$a}) <= 127) { $ud = ord($c{$a}); $a += 1; } else if (ord($c{$a}) >= 192 && ord($c{$a}) <= 223) { $ud = (ord($c{$a}) - 192) * 64 + (ord($c{$a + 1}) - 128); $a += 2; } else if (ord($c{$a}) >= 224 && ord($c{$a}) <= 239) { $ud = (ord($c{$a}) - 224) * 4096 + (ord($c{$a + 1}) - 128) * 64 + (ord($c{$a + 2}) - 128); $a += 3; } else if (ord($c{$a}) >= 240 && ord($c{$a}) <= 247) { $ud = (ord($c{$a}) - 240) * 262144 + (ord($c{$a + 1}) - 128) * 4096 + (ord($c{$a + 2}) - 128) * 64 + (ord($c{$a + 3}) - 128); $a += 4; } else if (ord($c{$a}) >= 248 && ord($c{$a}) <= 251) { $ud = (ord($c{$a}) - 248) * 16777216 + (ord($c{$a + 1}) - 128) * 262144 + (ord($c{$a + 2}) - 128) * 4096 + (ord($c{$a + 3}) - 128) * 64 + (ord($c{$a + 4}) - 128); $a += 5; } else if (ord($c{$a}) >= 252 && ord($c{$a}) <= 253) { $ud = (ord($c{$a}) - 252) * 1073741824 + (ord($c{$a + 1}) - 128) * 16777216 + (ord($c{$a + 2}) - 128) * 262144 + (ord($c{$a + 3}) - 128) * 4096 + (ord($c{$a + 4}) - 128) * 64 + (ord($c{$a + 5}) - 128); $a += 6; } else if (ord($c{$a}) >= 254 && ord($c{$a}) <= 255) { //error $ud = false; } $scill .= $prefix.$ud.";"; } return $scill; } } /* PHP 转 ASCII require_once "ascii_class.php"; */ $aa = new ascii; echo "<xmp>"; echo $str = $aa->encode("PHP二次开发:www.111cn.net"); echo "</xmp>"; echo $aa->decode($str); ?>抓取数据不管用什么编程语言几乎都是可以实现了,今天我们需要采集安居客的小区数据,下面我们来看一个python抓取安居客小区数据的程序代码了,希望下文能够对大家有帮助。
某功能需要一套城市所有小区的位置信息数据,一开始是使用的百度地图api来进行关键词搜索,勉强能用,但数据量非常少,还是有大量的社区/小区搜不到。
周末在家上网时发现安居客上直接就有每个城市的小区大全,欣喜若狂,于是就立即写了个爬虫试试。
以下贴代码,python2.7,lxml+request库。
#coding=utf-8 #author : zx #date : 2015/07/27 import requests import MySQLdb import time import string import random from lxml import etree #ua头信息 get时可以随机使用 headers = [ { "User-Agent":"Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"}, { "User-Agent":"Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)"}, { "User-Agent":"Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+"}, { "User-Agent":"Mozilla/5.0 (Linux; Android 4.4.2; GT-I9505 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36"} ] #城市入口页面 #我只抓的青岛本地 #其它城市或全国城市可通过这个页面抓取城市列表http://m.anjuke.com/cityList url = 'http://m.anjuke.com/qd/xiaoqu/' req = requests.get(url) cookie = req.cookies.get_dict() #链接数据库 conn = MySQLdb.connect('localhost', '*****', '******', '***', charset='utf8') cursor = conn.cursor() sql = "insert into xiaoqu (name, lat, lng, address, district) values (%s, %s, %s, %s, %s)" sql_v = [] page = etree.HTML(req.text) districtHTML = page.xpath(u"//div[@class='listcont cont_hei']")[0] #采集目标城市的各行政区域url #当然如果不想区分行政区可以直接抓“全部” 即上面url中的所有小区及分页 districtUrl = {} i = 0 for a in districtHTML: if i==0: i = 1 continue districtUrl[a.text] = a.get('href') #开始采集 total_all = 0 for k,u in districtUrl.items(): p = 1 #分页 while True: header_i = random.randint(0, len(headers)-1) url_p = u.rstrip('/') + '-p' + str(p) r = requests.get(url_p, cookies=cookie, headers=headers[header_i]) page = etree.HTML(r.text) #这里转换大小写要按情况... communitysUrlDiv = page.xpath(u"//div[@class='items']")[0] total = len(communitysUrlDiv) i = 0 for a in communitysUrlDiv: i+=1 r = requests.get(a.get('href'), cookies=cookie, headers=headers[header_i]) #抓取时发现有少量404页会直接导致程序报错退出- -! #唉 说明代码写的还不够健壮啊 #加了if判断和try, 错误时可以跳过或做一些简单处理和调试... if r.status_code == 404: continue page = etree.HTML(r.text) try: name = page.xpath(u"//h1[@class='f1']")[0].text except: print a.get('href') print r.text raw_input() #有少量小区未设置经纬度信息 #只能得到它的地址了 try: latlng = page.xpath(u"//a[@class='comm_map']")[0] lat = latlng.get('lat') lng = latlng.get('lng') address = latlng.get('address') except: lat = '' lng = '' address = page.xpath(u"//span[@class='rightArea']/em")[0].text sql_v.append((name, lat, lng, address, k)) print "\r\r\r", print u"正在下载 %s 的数据,第 %d 页,共 %d 条,当前:".encode('gbk') %(k.encode('gbk'),p, total) + string.rjust(str(i),3).encode('gbk'), time.sleep(0.5) #每次抓取停顿 #执行插入数据库 cursor.executemany(sql, sql_v) sql_v = [] time.sleep(5) #每页完成后停顿 total_all += total print '' print u"成功入库 %d 条数据,总数 %d".encode('gbk') % (total, total_all) if total < 500: break else: p += 1 #及时关闭数据库 做个好孩子 任务完成~ cursor.close() conn.close() print u'所有数据采集完成! 共 %d 条数据'.encode('gbk') % (total_all) raw_input()
注释我觉得已经写的很详细了,在cmd中显示,字符串当然要转一下码。
以下是运行状态和得到的数据截图。
矩阵不管在php或python中它只是一种算法了,我们要做的就是利用我们所学的程序来实现这种算法即可达到我们的需求了,下面来看它们的实现方法。
什么是螺旋矩阵? 螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环。下图就是一个螺旋矩阵的示例: 郑晓在这里分别使用了Python和PHP来实现了数字的螺旋矩阵。其中的PHP版本写成了函数,更加灵活的对矩阵进行控制。写Python时由于是第一次写,有些生疏,分别用了两种方法来实现。。。下面上代码吧: Python螺旋矩阵的第一版(比较难以理解?!): #coding:gbk L = 6 #矩阵大小 result = [[0]*L for n in range(L)] row =0 #初始行 从左上角开始 col = 0 #初始列 从左上角开始 value = 1#初始值 direction = 'r' #初始方向 向右 circle = 1 #初始圈数 第一圈 while True: #向右走 if direction == 'r': result[row][col] = value if col>=L-circle: direction = 'd' continue col += 1 #向下走 if direction =='d': result[row][col] = value if row >= L-circle: direction = 'l' continue row += 1 #向左走 if direction == 'l': result[row][col] = value if col <= circle -1: direction = 'u' continue col -= 1 #向上走 if direction == 'u': result[row][col] = value if row-1 <= circle: direction = 'r' circle += 1 #continue row -= 1 value += 1 if value > L * L : break for R in result: for c in R: print "%3d" % (c) , print raw_input()
接下来是Python螺旋矩阵的第二版,其中使用了迭代器控制方向,代码量明显减少,而且更容易理解了。多次使用不同的起点生成的矩阵时,你会发现有个地方写的有点儿“问题”,找到问题了没有?
#coding:gbk import itertools #参数:矩阵宽(w)、高(h)、起始横坐标、起始纵坐标 def print_matrix(w, h, x = 0, y = 0): #方向移动时的操作 op = [(1,0), (-1,0), (0,-1), (0,1)] #迭代器可无限迭代列表 每次要换方向时就next() direction = itertools.cycle(op) #根据行列生成所有坐标 result = {(xx,yy):None for xx in range(w) for yy in range(h)} result[(x,y)] = 1 _x, _y = direction.next() i = 1 flag = 0 while True: new_x = x + _x new_y = y + _y if (new_x, new_y) in result and result[(new_x, new_y)] is None: i = i + 1 result[(new_x, new_y)] = i x = new_x y = new_y flag = 0 else: _x, _y = direction.next() flag = flag + 1 if flag>4: break #打印结果 for y in range(h): for x in range(w): print "%3d" % (result[(x,y)]), print #调用示例 print_matrix(6,6,5,0) raw_input()
下面是PHP版的螺旋矩阵,思路和上面的Python是一样的(其实我是照着写的…)。
/* * * @param $w : 宽 * @param $h : 高 * @param $s : 起始数字 * @param $x, $y : 起始位置坐标 只能从四顶点开始 * @param $r :方向 默认顺时间 false为逆时针 * @author : 郑晓 * php5.6.11 * 这是一个螺旋矩阵的PHP版本,由于之前在python下写过,有了一些经验,所以在php中也使用了SPL的一个迭代器,用于换向。算法编写时是使用的过程式,后来又改为了函数,加入了一些自定义参数,方便调用(然并卵)。输出中使用的是制表和换行符,请在浏览器源代码中查看运行结果。 */ function print_matrix($w, $h, $s=1, $l=1, $x=0, $y=0, $r=true) { $R = array(array(1,0), array(0,1), array(-1,0), array(0,-1)); !$r && $R = array_reverse($R); $iterator = new InfiniteIterator(new ArrayIterator($R)); //创建一个无限迭代器 $iterator->rewind(); //指针指向第一元素 list($_x, $_y) = $iterator->current(); $result = []; $result[$x][$y] = $s; for($i = $s+1; $i < $s+$w * $h; $i++) { $new_x = $x + $_x; $new_y = $y + $_y; if(0<= $new_x && 0<= $new_y && $new_x < $w && $new_y < $h && !isset($result[$new_x][$new_y])) { $result[$new_x][$new_y] = $i; $x = $new_x; $y = $new_y; } else { $iterator->next(); list($_x, $_y) = $iterator->current(); $i--; } } //以下是打印矩阵结构 for($i=0; $i< $h; $i++) { for($j=0; $j< $w; $j++) { echo $result[$j][$i], "\t"; } echo "\n"; } } //调用示例测试 print_matrix(5, 5); echo "\n"; print_matrix(7, 4); echo "\n"; print_matrix(5, 5, 1, 4, 0); echo "\n"; print_matrix(5, 5, 10, 0, 4, false); echo "\n";
下面是依次的运行结果:
相关文章
- PHP-FPM我们相信各位用高版本的php经常使用到了,下面整理了一些关于PHP-FPM的笔记,有兴趣的可进来看看。 今天赶上了123System OPenVZ VPS全场半价的机会,购入了一...2016-11-25
php-fpm 启动报please specify user and group other than root, pool ‘default’
本文章来给大家介绍关于php-fpm 启动报please specify user and group other than root, pool ‘default’的解决办法。 安装PHP ,配置fpm 成功后启动发现报错: St...2016-11-25- 这篇文章主要介绍了c# socket网络编程,server端接收,client端发送数据,大家参考使用吧...2020-06-25
- 这篇文章主要介绍了JS WebSocket断开原因和心跳机制,对websocket感兴趣的同学,可以参考下...2021-05-08
- 这篇文章主要介绍了C#实现Socket通信的解决方法,需要的朋友可以参考下...2020-06-25
- 本篇文章主要介绍了C# Socket异步通信,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 本篇文章主要介绍了C# Socket的TCP通讯,socket通讯方式有两种:同步和异步,详细的介绍了这两种方法,有兴趣的可以了解一下。...2020-06-25
python使用socket高效传输视频数据帧(连续发送图片)
本文主要介绍了python使用socket高效传输视频数据帧(连续发送图片),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-23- 这篇文章主要介绍了C语言中send()函数和sendto()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
- 我们在调试过程使用的工具有:modheader,postman等,但这些工具都会存在的问题:缺少客户端里相应的设备信息;即使将cookie信息复制出来,也是存在过期的问题;多个设备之间切换时不方便;针对这些存在的问题,我基于websocket双向通信的特点,实现了多端桥接管理平台...2021-05-15
- 这篇文章主要介绍了C# 实现WebSocket服务端教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-08
- 这篇文章主要介绍了C# Socket编程实现简单的局域网聊天器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
一篇文章带你使用SpringBoot基于WebSocket的在线群聊实现
这篇文章主要介绍了一篇文章带你使用SpringBoot基于WebSocket的在线群聊实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-08- 这篇文章主要介绍了SpringBoot中webSocket实现即时聊天,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-30
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
这篇文章主要介绍了Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例,帮助大家更好的理解和学习vue,感兴趣的朋友可以了解下...2020-11-18- 这篇文章主要介绍了Go语言实现socket的方法,实例分析了socket客户端与服务器端的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-05-03
php性能分析之php-fpm慢执行日志slow log用法浅析
这篇文章主要介绍了php性能分析之php-fpm慢执行日志slow log用法,结合实例形式分析了php慢执行日志的功能与相关使用技巧,需要的朋友可以参考下...2016-10-20- 这篇文章主要介绍了Python基础之Socket通信原理,文中有非常详细的代码示例,对正在学习python基础的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-22
- 这篇文章主要为大家详细介绍了Vue+Websocket简单实现聊天功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-31
C#开发之Socket网络编程TCP/IP层次模型、端口及报文等探讨
我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念...2020-06-25