邢栋博客
邢栋博客,Action博客,记录工作和生活中的点点滴滴
php使用redis替换文件存储session(session_set_save_handler)
<?php class MySessionHandler implements SessionHandlerInterface { private $redis; private $sessionsavepath; private $sessionname; public function __construct() { $this->redis = new Redis(); $this->redis->connect('127.0.0.1',6379); } public function close() { return true; } public function destroy($session_id) { if($this->redis->delete($session_id)){ return true; } return false; } public function gc($maxlifetime) { return true; } public function open($sessionsavepath, $name) { return true; } public function read($session_id) { if($value = $this->redis->get($session_id)){ return $value; }else{ return false; } } public function write($session_id, $session_data) { if($this->redis->set($session_id,$session_data,60)){ return true; }else{ return false; } } } $handler = new MySessionHandler(); session_set_save_handler($handler, true); session_start(); //$_SESSION['sess_name'] = 'xd'; var_dump($_SESSION);
php生成随机验证码
<?php function getVerifyCode($num){ $content = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $content = str_shuffle($content); return substr($content,-$num); } echo getVerifyCode(4);
python的beautifulsoup4简单测试
# -*- coding:utf8 -*- # 测试基于 python2.7 # 安装pip 如果没有安装的话 # sudo easy_install pip # 安装 beautifulsoup4 # pip install beautifulsoup4 from bs4 import BeautifulSoup import re html_doc = """ <html><head><title>The Dormouse's story</title></head> <body> <p class="title"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> """ soup = BeautifulSoup(html_doc,'html.parser',from_encoding='utf-8') print '获取所有的链接' links = soup.find_all('a') for link in links: print link.name,link['href'],link.get_text() print '获取Lacie的链接' link_node = soup.find('a',href='http://example.com/lacie') print link_node.name,link_node['href'],link_node.get_text() print '正则匹配' link_node = soup.find('a',href=re.compile(r"ill")) print link_node.name,link_node['href'],link_node.get_text() print '获取p段落文字' p_node = soup.find('p',class_="title") print p_node.name,p_node.get_text()
php运行机制和原理
标签:
php
php由内核Zend引擎和扩展成组成,php内核负责处理请求、完成文件流错误处理等操作,Zend引擎可以将php程序文件转换成可以在虚拟机上运行的机器语言,扩展层提供一些应用层操作需要的函数类库等,比如数组和mysql数据库的操作等。
Zend引擎是用C语言实现的,将php代码通过词法语法解析成可执行的Opcode并实现相应的处理方法和基本的数据结构进行内存分配和管理等,对外提供相应的可供调用的API方法。Zend引擎是php的核心,所有的外围功能都是围绕他实现的。扩展层通过组件的方式提供各种基础服务、内置函数,标准库都是通过它来实现的。用户也可以编写自己的扩展来实现特定的需求。服务端应用编写接口(Server Application Programming Interface,SAPI),通过一系列钩子函数使得php可以和外围交互数据。我们平时编写的php程序就是通过不同的SAPI方式得到不同的应用模式,如通过WebServer实现的Web应用和在命令行下运行的脚本等。
一段php程序被执行的时候会被解析成opcode命令,然后在虚拟机中按照顺序执行,由于php本身是C语言开发的,所以在执行的时候调用的都是C的函数。Opcode是php程序执行的基本单位。
某公司给的测试题目201708018
标签:
php
演员的技能用字母A-Z表示,某活动需要演员按顺序完成任务,完成得最多的,可获得奖励。由于演员多才多艺,提前告知任务顺序,很容易完成任务。现在让演员随意表演,最后公布活动任务最长匹配度。如一个演员表演顺序 ABCBDAB,最后活动顺序为BDCABA,那么最大匹配度值为4(匹配值为BCBA或者BDAB)。现在编写程序实现以上功能:
<?php $a = 'ABCBDAB'; $b = 'BDCABA'; $aStrlen = strlen($a); $bStrlen = strlen($b); $maxCount = 0; for ($i=0; $i < $aStrlen; $i++) { $ch = $a[$i]; $aIdx = $i; $bIdx = 0; $count = 0; $next = false; for ($j=$bIdx;$j<$bStrlen; $j++) { if($ch == $b[$j]){ $count++; $bIdx = $j; $next = true; } if($j == $bStrlen-1 && $count != 0 && $aIdx < $aStrlen){ $j = $bIdx; $next = true; } if($next){ if(++$aIdx == $aStrlen){ break; } $next = false; $ch = $a[$aIdx]; } } if($count > $maxCount){ $maxCount = $count; } //假如最大次数大于剩余要比较的字符串,则break if($maxCount >= $aStrlen-$i){ break; } } echo $maxCount;
php利用二叉堆算法来实现 TopK
利用二叉堆算法来实现 TopK
实现流程是:
1、先读取10个或100个数到数组里面,这就是我们的topK数.
2、调用生成小顶堆函数,把这个数组生成一个小顶堆结构,这个时候堆顶一定是最小的.
3、从文件或者数组依次遍历剩余的所有数.
4、每遍历出来一个则跟堆顶的元素进行大小比较,如果小于堆顶元素则抛弃,如果大于堆顶元素则替换之.
5、跟堆顶元素替换完毕之后,在调用生成小顶堆函数继续生成小顶堆,因为需要再找出来一个最小的.
6、重复以上4~5步骤,这样当全部遍历完毕之后,我们这个小顶堆里面的就是最大的topK,因为我们的小顶堆永远都是排除最小的留下最大的,而且这个调整小顶堆速度也很快,只是相对调整下,只要保证根节点小于左右节点就可以.
7、算法复杂度的话按top10最坏的情况下,就是每遍历一个数,如果跟堆顶进行替换,需要调整10次的情况,也要比排序速度快,而且也不是把所有的内容全部读入内存,可以理解成就是一次线性遍历.
<?php //为了测试运行内存调大一点 ini_set('memory_limit', '2024M'); //生成小顶堆函数 function Heap(&$arr,$idx){ $left = ($idx << 1) + 1; $right = ($idx << 1) + 2; if (!isset($arr[$left])){ return; } if(isset($arr[$right]) && $arr[$right] < $arr[$left]){ $l = $right; }else{ $l = $left; } if ($arr[$idx] > $arr[$l]){ $tmp = $arr[$idx]; $arr[$idx] = $arr[$l]; $arr[$l] = $tmp; Heap($arr,$l); } } /* 当然这个数据集并不一定全放在内存,也可以在 文件里面,因为我们并不是全部加载到内存去进 行排序 */ for($i=0;$i<500000;$i++){ $numArr[] = $i; } //打乱它们 shuffle($numArr); //先取出10个到数组 $topArr = array_slice($numArr,0,10); //获取最后一个有子节点的索引位置 //因为在构造小顶堆的时候是从最后一个有左或右节点的位置 //开始从下往上不断的进行移动构造(具体可看上面的图去理解) $idx = floor(count($topArr) / 2) - 1; //生成小顶堆 for($i=$idx;$i>=0;$i--){ Heap($topArr,$i); } echo time()."<hr/>"; //这里可以看到,就是开始遍历剩下的所有元素 for($i = count($topArr); $i < count($numArr); $i++){ //每遍历一个则跟堆顶元素进行比较大小 if ($numArr[$i] > $topArr[0]){ //如果大于堆顶元素则替换 $topArr[0] = $numArr[$i]; /* 重新调用生成小顶堆函数进行维护,只不过这次是从堆顶 的索引位置开始自上往下进行维护,因为我们只是把堆顶 的元素给替换掉了而其余的还是按照根节点小于左右节点 的顺序摆放这也就是我们上面说的,只是相对调整下,并 不是全部调整一遍 */ Heap($topArr,0); } } echo "<hr/>"; var_dump($topArr); echo "<hr/>".time()."<hr>";
源文链接:简书 http://www.jianshu.com/p/df71c71cdc57
php使用openssl_random_pseudo_bytes生成安全的随机数
需要安装openssl扩展,openssl_random_pseudo_bytes
function getRandomString($length = 6) { /* * Use OpenSSL (if available) */ if (function_exists('openssl_random_pseudo_bytes')) { $bytes = openssl_random_pseudo_bytes($length * 2); if ($bytes === false) throw new RuntimeException('Unable to generate a random string'); return substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $length); } $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; return substr(str_shuffle(str_repeat($pool, 5)), 0, $length); }
php发送与接收流文件方法
<?php /** php 发送流文件 * @param String $url 接收的路径 * @param String $file 要发送的文件 * @return boolean */ function sendStreamFile($url, $file){ if(file_exists($file)){ $opts = array( 'http' => array( 'method' => 'POST', 'header' => 'content-type:application/x-www-form-urlencoded', 'content' => file_get_contents($file) ) ); $context = stream_context_create($opts); $response = file_get_contents($url, false, $context); $ret = json_decode($response, true); return $ret['success']; }else{ return false; } } $ret = sendStreamFile('http://localhost/receiveStreamFile.php', 'send.txt'); var_dump($ret); /** php 接收流文件 * @param String $file 接收后保存的文件名 * @return boolean */ function receiveStreamFile($receiveFile){ $streamData = file_get_contents('php://input'); if($streamData!=''){ $ret = file_put_contents($receiveFile, $streamData, true); }else{ $ret = false; } return $ret; } $receiveFile = 'receive.txt'; $ret = receiveStreamFile($receiveFile); echo json_encode(array('success'=>(bool)$ret)); ?>